Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"schema_version": "1.4.0",
"id": "GHSA-rg4h-fpcp-2qm8",
"modified": "2026-08-17T14:56:30Z",
"modified": "2026-08-17T14:56:31Z",
"published": "2026-07-24T16:10:17Z",
"aliases": [
"CVE-2026-59867"
],
"summary": "Microsoft Kiota: Generation-time SSRF + remote/local file inclusion via unrestricted $ref",
"details": "## Summary\n\nMicrosoft Kiota resolved OpenAPI `$ref`s by fetching remote `http(s)` URLs and reading local files\n(including absolute / out-of-tree paths), inlining the referenced schema into the generated client.\nRunning `kiota generate` on a spec whose `$ref` pointed at an attacker/internal URL or an arbitrary\nlocal file yielded SSRF, remote file inclusion, and local file inclusion. Verified on **1.32.3 / 1.32.4**.\n\n### Details\n\n- `$ref: http://attacker/internal-evil.json#/...` → build host fetches the URL (SSRF) and inlines the\n remote schema (RFI); confirmed property `REMOTE_KIOTA_PROP` in the generated client.\n- `$ref: /abs/path.json#/...` or `../../secret.json#/...` → Kiota reads the out-of-tree local file and\n inlines its schema (LFI); confirmed `Leaked` schema in the generated client. Resolution is transitive\n across nesting levels.\n\nKiota **escapes** its output sinks (comments/strings/identifiers), so attacker-controlled remote/local\ncontent cannot break out into code — no RCE. The chain stops at SSRF + RFI + LFI.\n\n### Impact\n\nBuild-time SSRF (CWE-918) from the developer or CI host, disclosure of arbitrary local files (CWE-22), and\ninclusion of untrusted remote content (CWE-829), from running the generator on an attacker-controlled or\nattacker-influenced OpenAPI description. No code execution. Notable because Kiota is otherwise the hardened\ngenerator (it resists the code-injection class).\n\nThe relevant threat is not \"change the generated output\" (an attacker who fully controls the description can\nalready do that) but the **side effects on the build host**: outbound requests from inside the CI network\n(cloud metadata, internal-only services) and reads of local files the attacker never possessed, whose contents\nare then inlined into the generated — and typically committed/published — client. It also bypasses controls\nthat review the description document but not externally-referenced content.\n\n### Patches\n\nFixed in **1.29.1 and 1.32.5** (https://github.com/microsoft/kiota/pull/7888). External reference resolution is now\n**default-deny**: a new `AllowedExternalOriginsStreamLoader` refuses to load any external `$ref` — remote\n`http(s)` URLs and local file paths alike — unless its origin/path is explicitly allow-listed. A new\n`--allowed-external-origins` parameter (added to the commands that load OpenAPI descriptions) opts specific\norigins back in, accepting `*`, full URIs, URI patterns, full paths, relative paths, or path patterns\n(wildcards supported). With no allow-list entries, external references are not loaded at all.\n\n### Remediation\n\nUpgrade to Kiota **1.29.1, 1.32.5,** or later. External references now require explicit opt-in via\n`--allowed-external-origins`; add only trusted origins/paths.",
"details": "## Summary\n\nMicrosoft Kiota resolved OpenAPI `$ref`s by fetching remote `http(s)` URLs and reading local files\n(including absolute / out-of-tree paths), inlining the referenced schema into the generated client.\nRunning `kiota generate` on a spec whose `$ref` pointed at an attacker/internal URL or an arbitrary\nlocal file yielded SSRF, remote file inclusion, and local file inclusion. Verified on **1.32.3 / 1.32.4**.\n\n### Details\n\n- `$ref: http://attacker/internal-evil.json#/...` → build host fetches the URL (SSRF) and inlines the\n remote schema (RFI); confirmed property `REMOTE_KIOTA_PROP` in the generated client.\n- `$ref: /abs/path.json#/...` or `../../secret.json#/...` → Kiota reads the out-of-tree local file and\n inlines its schema (LFI); confirmed `Leaked` schema in the generated client. Resolution is transitive\n across nesting levels.\n\nKiota **escapes** its output sinks (comments/strings/identifiers), so attacker-controlled remote/local\ncontent cannot break out into code — no RCE. The chain stops at SSRF + RFI + LFI.\n\n### Impact\n\nBuild-time SSRF (CWE-918) from the developer or CI host, disclosure of arbitrary local files (CWE-22), and\ninclusion of untrusted remote content (CWE-829), from running the generator on an attacker-controlled or\nattacker-influenced OpenAPI description. No code execution. Notable because Kiota is otherwise the hardened\ngenerator (it resists the code-injection class).\n\nThe relevant threat is not \"change the generated output\" (an attacker who fully controls the description can\nalready do that) but the **side effects on the build host**: outbound requests from inside the CI network\n(cloud metadata, internal-only services) and reads of local files the attacker never possessed, whose contents\nare then inlined into the generated — and typically committed/published — client. It also bypasses controls\nthat review the description document but not externally-referenced content.\n\n### Patches\n\nFixed in **1.32.5** (https://github.com/microsoft/kiota/pull/7888). External reference resolution is now\n**default-deny**: a new `AllowedExternalOriginsStreamLoader` refuses to load any external `$ref` — remote\n`http(s)` URLs and local file paths alike — unless its origin/path is explicitly allow-listed. A new\n`--allowed-external-origins` parameter (added to the commands that load OpenAPI descriptions) opts specific\norigins back in, accepting `*`, full URIs, URI patterns, full paths, relative paths, or path patterns\n(wildcards supported). With no allow-list entries, external references are not loaded at all.\n\n### Remediation\n\nUpgrade to Kiota **1.32.5** or later. External references now require explicit opt-in via\n`--allowed-external-origins`; add only trusted origins/paths.",
"severity": [
{
"type": "CVSS_V3",
Expand Down Expand Up @@ -56,7 +56,7 @@
{
"package": {
"ecosystem": "NuGet",
"name": "Microsoft.OpenApi.Kiota"
"name": "Microsoft.OpenApi.Kiota.Builder"
},
"ranges": [
{
Expand All @@ -75,7 +75,7 @@
{
"package": {
"ecosystem": "NuGet",
"name": "Microsoft.OpenApi.Kiota.Builder"
"name": "Microsoft.OpenApi.Kiota"
},
"ranges": [
{
Expand Down
Loading