PUBLIC-EVIDENCE AI SECURITY CASE STUDY

Semantic Kernel Python SearchPlugin filter eval leads to host RCE

Microsoft reproduced a prompt-to-host command path in Semantic Kernel Python when a SearchPlugin input reached an InMemoryVectorStore filter built with eval(). The blocklist and empty builtins did not stop the crafted filter. Affected applications must use the default filter…

Tool-Calling LLM / Connected GenAITier 3Indicative ERS 3.8 (1.1–6.5)Evidence source date 2026-02-19

Use case sources

Source reports and analysis supporting this case are listed below. AITBM interpretation and any indicative scoring are derived from this public evidence.

Linked library records

Independent products or attack paths are assessed separately. A combined report receives no aggregate score.

Original report record: Prompt-to-Shell: Dual RCE Paths in Microsoft Semantic Kernel.

Microsoft reproduced a prompt-to-host command path in Semantic Kernel Python when a SearchPlugin input reached an InMemoryVectorStore filter built with eval(). The blocklist and empty builtins did not stop the crafted filter. Affected applications must use the default filter configuration before 1.39.4.

ASSESSED SYSTEM

Representative hotel-finder style AI agent using Semantic Kernel Python before 1.39.4, with SearchPlugin backed by the default InMemoryVectorStore filter.

OUT OF SCOPE

Other vector backends, patched Python 1.39.4 and later, .NET SessionsPythonPlugin, production exploitation, and any alleged general model weakness.

Architecture: Tool-Calling LLM / Connected GenAI (decision tree Q3) — Q2 autonomy is not established for this single search call; Q3 applies because the model invokes SearchPlugin, which accesses the vector store and host code. Tier 3: Tier 3 representative developer or internal AI workflow scenario; the original source does not establish every operator tier.

Documented attack or failure path

  1. An attacker influenced the agent prompt or content used for a SearchPlugin call.
  2. The model produced a filter parameter that was interpolated into Python code and evaluated.
  3. The researcher bypassed the AST blocklist and executed a shell command on the host.

Observed controls and bounded outcomes

Positive credit is given only where the record directly demonstrates a control operating. Recommended or merely presumed controls receive no positive scoring credit.

  • The maintainer fixed this path in the specified patched release; the fix is outside the scored pre-fix representative.

Layer 1 — Intrinsic Vulnerability Profile

Each sub-metric is placed on its five-level rubric by the evidence quoted beside it. Missing applicable evidence remains unknown. The displayed midpoint and interval are scenario values, not inferred control performance.

Sub-metricScoreRubric basisEvidence
Robustness (Ro) — scenario interval 0.00–1.00 (midpoint 0.50), Tier 3 MVT 0.40 indeterminate
Fairness (Fa) — scenario interval 0.00–1.00 (midpoint 0.50), Tier 3 MVT 0.45 indeterminate
Transparency (Tr) — scenario interval 0.00–1.00 (midpoint 0.50), Tier 3 MVT 0.45 indeterminate
Privacy (Pr) — scenario interval 0.00–1.00 (midpoint 0.50), Tier 3 MVT 0.50 indeterminate
Containment (Cn) — scenario interval 0.00–0.88 (midpoint 0.44), Tier 3 MVT 0.50 indeterminate
Cn-1Scope Enforcement0.00w 0.12The tool path accepted model-controlled content beyond the intended data lookup scope and executed host commands; this meets the 0.00 Cn-1 scope anchor.Microsoft demonstrated an agent SearchPlugin call with model-controlled filter content reaching eval() and executing a host command despite the filter blocklist.source: primary report

Unknown, not N/A: 25 applicable sub-metrics lack admissible public evidence. The lower, midpoint, and upper scenarios evaluate each at 0.00, 0.50, and 1.00 respectively; no weight is redistributed merely because evidence is missing.

Layer 2 — Operational Risk Posture

DimensionScoreJustification
AaAutonomy Amplification0.50w 0.20Representative activity level for the documented bounded AI path; deployment-specific autonomy was not measured.
AsAttack Surface Exposure0.75w 0.25Representative exposure of the documented entry path; this is a scenario assumption and not a census of all operators.
CpCascade Potential1.00w 0.30No verified System Dependency Graph or DGC is published, so framework worst-case Cp default applies.GDCP: worst-case default — no verified dependency graph published elevated
RfRemediation Feasibility0.25w 0.25A specific patch or configuration change is documented; repair feasibility is an inferred representative scenario, not measured recovery time.

Nelevated = 1 (dimensions strictly above 0.75) → CRM = 1.00.

Layer 3 — Public-evidence confidence diagnostic

ComponentScoreBasis
Pc — Public provenance evidence0.25Minimal public provenance identifies the affected path but supplies no operator assessment pack, signed configuration inventory, or repeated metric battery.
Ec — Public evaluation coverage0.03coverage 0.04 (1 of 26 applicable sub-metrics) × independence 0.80 × fidelity 0.95. No Full, Standard, or Lite pathway is claimed for a retrospective article.
Tf — Public-evidence freshness0.40Evidence dated 2026-02-19; age 241 days on the workpaper reference date. Components: T_calendar 0.40 · C_monitor 0.70. Binding term: T_calendar. Evidence reference is 2026-10-18, 241 days after earliest substantive public evidence (2026-02-19). C_monitor uses the conservative Tier 3 public-evidence default because usable monitoring-coverage evidence is unavailable; it does not assert no deployment telemetry. No C_event cap is asserted from research or an advisory without a dated victim incident. No generic C_evidence cap is assigned from missing public inputs. Indicative ERS uses normalized ACI = 1.00 for comparison only.

Public-evidence ACI = (Pc × Ec × Tf)1/3 = 0.14 — diagnostic status: Invalid as assessment-of-record evidence. It describes the evidence available to this case study, not the assurance of the underlying system, and is not inserted into the normalized-assurance scenario ERS.

Indicative ERS — normalized-assurance scenario

Worp · ORP0.20(0.50) + 0.25(0.75) + 0.30(1.00) + 0.25(0.25) = 0.650
CRMNelevated = 1 → 1.00
ORPeffective0.650 × 1.00 = 0.650
Wivp · IVP midpoint0.20(0.50) + 0.15(0.50) + 0.20(0.50) + 0.25(0.50) + 0.20(0.44) = 0.488
IVP mitigation0.15 + 0.85(1 − 0.488) = 0.585
Scenario assuranceACI fixed at 1.000 for cross-case comparison; public-evidence ACI 0.143 is diagnostic only
Indicative ERS midpointmin(10, 0.650 × 0.585 × 1/1.000 × 10) = 3.8
Unknown-input interval1.1–6.5; 25 unknown applicable sub-metrics set to 1.00 / 0.00 at the bounds

Published CVSS beside indicative ERS

Each published CVSS record is shown exactly as its scorer published it, one per vulnerability record, with the version, metric group and vector when stated, plus its source and access date. Records are never combined or inferred from a CVE's existence.

INDICATIVE ERS · NORMALIZED-ASSURANCE SCENARIO

3.8 midpoint, interval 1.1–6.5; Low-Moderate scenario band; ACI fixed at 1.00. The published CVSS records do not enter this calculation.

PUBLISHED CVSS · 1 record

CVE-2026-26030 CVSS 3.1 Base 9.9 Critical

Published score9.9
CVSS version3.1
Metric groupBase
SeverityCritical
VectorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Scored byMicrosoft Semantic Kernel maintainer advisory
Source recordhttps://github.com/microsoft/semantic-kernel/security/advisories/GHSA-xjw9-4gw8-4rqx (accessed 2026-10-18)
Affected componentSemantic Kernel Python SearchPlugin InMemoryVectorStore filter before 1.39.4
Scope noteThe CVE identifies this exact SDK and tool path in the representative pre-fix agent.
Source noteThe maintainer advisory publishes 9.9. The current raw CVE record lists 10.0 with the same vector; this entry reproduces the advisory without recalculating.

CVSS describes an individual vulnerability as its scorer published it. Indicative ERS describes the assessed AI deployment under the normalized-assurance scenario, so the two values are not direct equivalents and neither replaces the other.

WHAT THIS CASE TEACHES

Microsoft reproduced a prompt-to-host command path in Semantic Kernel Python when a SearchPlugin input reached an InMemoryVectorStore filter built with eval(). The blocklist and empty builtins did not stop the crafted filter. Affected applications must use the default filter configuration before 1.39.4.

Sources: Semantic Kernel maintainer advisory — CVE-2026-26030 · Microsoft original researcher technical demonstration (2026-05-07)

AITBM sub-metrics referenced