---
id: GHSA-p5rm-jg5c-8c77
title: >-
  Microsoft Kiota: Path traversal in generated plugin manifest
  static_template.file reference (percent-encoding bypass)
summary: >-
  Microsoft Kiota: Path traversal in generated plugin manifest
  static_template.file reference (percent-encoding bypass)
severity: medium
cwe:
  - CWE-22
  - CWE-829
vendor: Microsoft
product: Microsoft.OpenApi.Kiota
ecosystem: nuget
affected:
  - Microsoft.OpenApi.Kiota <= 1.33.0
patched:
  - Microsoft.OpenApi.Kiota 1.34.0
published: '2026-07-24'
updated: '2026-07-24'
source: GHSA
sourceUrl: 'https://github.com/advisories/GHSA-p5rm-jg5c-8c77'
references:
  - url: 'https://github.com/microsoft/kiota/security/advisories/GHSA-p5rm-jg5c-8c77'
  - url: 'https://github.com/microsoft/kiota/issues/7912'
  - url: 'https://github.com/microsoft/kiota/pull/7910'
  - url: 'https://github.com/microsoft/kiota/pull/7913'
  - url: >-
      https://github.com/microsoft/kiota/commit/430008e9d700b3fe80f206c672415cfbd8e830e7
  - url: >-
      https://github.com/microsoft/kiota/commit/de3d18d9fe31ced4ac749728d3a2f94811f59268
  - url: 'https://github.com/microsoft/kiota/releases/tag/v1.34.0'
  - url: 'https://github.com/advisories/GHSA-p5rm-jg5c-8c77'
tags:
  - ghsa
  - nuget
ingestedAt: '2026-07-24T16:33:09.539Z'
---

## Overview

### Impact

Kiota generates AI plugin manifests from an OpenAPI description. When the description contains an `x-ai-capabilities` response semantics `static_template` (or the adaptive-card extension `x-ai-adaptive-card`), the `file` reference is written into the generated manifest's `response_semantics.static_template.file` and is later resolved by the AI host **relative to the plugin package**.

An attacker who controls or tampers with the OpenAPI description consumed by Kiota can supply a `file` reference that resolves **outside** the manifest package (e.g. `../../../../etc/passwd`, an absolute path, or a `file://` / `http(s)://` URI). When the generated manifest is deployed and consumed by an AI host, this can lead to inclusion or disclosure of files outside the intended package boundary (CWE-22 Path Traversal, CWE-829 Inclusion of Functionality from an Untrusted Control Sphere).

A mitigation shipped in v1.32.5 (`ExtensionResponseSemanticsStaticTemplate.IsSafeFileReference`) rejected literal traversal, rooted paths, drive-qualified paths, and absolute URIs. However, that check inspected the **raw** reference string, so **percent-encoded** payloads bypassed every check and were still emitted verbatim. Examples that were incorrectly accepted as safe:

| Input | Decodes to |
|-------|-----------|
| `%2e%2e/card.json` | `../card.json` |
| `..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd` | `../../../../../../etc/passwd` |
| `file%3A%2F%2F%2Fetc%2Fpasswd` | `file:///etc/passwd` |
| `%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd` | `../../../etc/passwd` |

Multi-level (double) encoding such as `%252e%252e%252fcard.json` was also affected. A follow-up review found additional residual bypasses of the same validator: an embedded NUL byte (`%00`) that truncated the path and defeated the parent-directory segment check, encoding nested deeper than the decode budget (which failed open), and Unicode full-width homoglyphs (e.g. `%EF%BC%8E%EF%BC%8E` → `．．`).

### Patches

- The percent-encoding bypass is fixed by decoding the reference (bounded multi-pass) before validation: https://github.com/microsoft/kiota/pull/7910
- Residual bypasses (NUL / control characters, decode-budget fail-open, Unicode homoglyphs) are fixed by failing closed on residual encoding, rejecting control characters, and NFKC-folding before validation: https://github.com/microsoft/kiota/pull/7913 (tracking issue https://github.com/microsoft/kiota/issues/7912)

Users should upgrade to the first released `Microsoft.OpenApi.Kiota` version that includes these fixes (the release following 1.33.0).

### Workarounds

- Only generate clients/plugins from trusted OpenAPI descriptions.
- Review generated plugin manifests before deployment and reject any `response_semantics.static_template.file` value that is not a simple relative path within the `adaptiveCards/` package folder (no `..`, no rooted/absolute paths, no URIs, no percent-encoded separators).

### References

- CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
- CWE-829: Inclusion of Functionality from an Untrusted Control Sphere
- Affected code: `src/Kiota.Builder/OpenApiExtensions/OpenApiAiCapabilitiesExtension.cs` (`IsSafeFileReference`) and enforcement in `src/Kiota.Builder/Plugins/PluginsGenerationService.cs`.

## Affected packages

- `Microsoft.OpenApi.Kiota <= 1.33.0`

## Remediation

Upgrade to a patched release:

- `Microsoft.OpenApi.Kiota 1.34.0`
