Microsoft Published Semantic Kernel RCE on May 7. Microsoft Copilot Wrote Test Fixtures Against Our Rules on May 11. We Shipped the Detection Same Day.
On 2026-05-07 Microsoft Security disclosed two critical RCE CVEs in Semantic Kernel — CVE-2026-26030 (In-Memory Vector Store lambda+eval injection) and CVE-2026-25592 (SessionsPythonPlugin file write to autostart paths). On 2026-05-11 06:07 UTC, Microsoft Copilot SWE Agent opened agent-governance-toolkit#1981 adding regression test fixtures against the ATR community-rules pack, presuming ATR would have detection. Eight hours later, ATR v2.1.2 shipped on npm with rules ATR-2026-00440 and ATR-2026-00441 covering both CVEs — plus a credential-leak redact helper for any integration that logs ATRMatch.matchedPatterns. This is the layer-0 detection-standard flywheel running end-to-end in a single workday.
觸發事件
2026-05-07,Microsoft Security Response Center 發表 *When prompts become shells: RCE vulnerabilities in AI agent frameworks*。Microsoft Semantic Kernel 兩個 CVE:
- ●CVE-2026-26030 — In-Memory Vector Store filter function 內插使用者可控的 filter 表達式並以 lambda 求值。攻擊者透過
tuple().__class__.__mro__走訪 Python class 階層觸及BuiltinImporter並執行os.system()。SK 主機未認證 RCE。 - ●CVE-2026-25592 — SessionsPythonPlugin
DownloadFileAsync接受未驗證路徑。配合 plugin 的ExecuteCode能力,攻擊者把 payload 寫到主機 Startup / cron / systemd-user 路徑,在沙盒外取得持久化。完整 kill chain:ExecuteCode → 產生 payload → DownloadFileAsync → 寫 autostart → 重開機觸發 RCE。
Microsoft 的緩解:升級 semantic-kernel Python ≥1.39.4 或 .NET ≥1.71.0。Patch 加入 AST 白名單、路徑正規化、移除模型可存取的 plugin descriptor 中的危險函式暴露。
Microsoft 沒公開:偵測規則。沒 Sigma、沒 YARA、沒 Elastic、沒 MITRE D3FEND 映射。只有針對自家 Defender stack 的 KQL queries。
四天後發生了什麼
2026-05-11 06:07 UTC,GitHub 使用者 app/copilot-swe-agent — Microsoft Copilot 的 SWE Agent 身份 — 開了 microsoft/agent-governance-toolkit#1981。標題:"Add Semantic Kernel CVE regression coverage to ATR tests and align CVE fixtures with policy fields"。
PR 在 examples/atr-community-rules/test_atr_policy.py 加了四個測試 fixture:
- ●
test_semantic_kernel_lambda_eval_interpolation—user_input: "lambda row: eval(filter_expr)" - ●
test_semantic_kernel_dynamic_import_traversal—user_input: "klass = importlib.import_module(module_name)" - ●
test_semantic_kernel_startup_persistence_write—user_input: schtasks /create /sc onlogon /tn updater /tr "...Start Menu\\Programs\\Startup\\updater.bat" - ●
test_semantic_kernel_overprivileged_file_write_tool—tool_description: "allowed_tools: Bash(*) and write to Startup folder for persistence"
每個 fixture 都 assert evaluator.evaluate(context).action == "deny"。前提是 ATR 規則會 deny 這些 payload。PR 開的當下 ATR 沒有針對這些特定 CVE 的規則。Microsoft Copilot 先建好測試套件,再把測試合約交給我們。
這就是 layer-0 protocol ownership 在實務上長的樣子。Microsoft 的 ATR community-rules 整合接好之後,有人在 Microsoft 內部叫 Copilot 加 CVE 回歸測試,Copilot 直接指向 ATR 追蹤的測試檔案 — 而不是某個 Microsoft 內部偵測語料。
我們同一天出貨什麼
ATR v2.1.2 在 2026-05-11 08:23 UTC 上 npm,距 AGT PR 開啟約 2 小時。兩條新規則 + 一個 opt-in 加固 helper:
ATR-2026-00440 (agent-manipulation) — CVE-2026-26030 偵測。六個 condition 覆蓋 lambda+eval 內插形狀、lambda+__import__ 鏈、AST-traversal-via-mro 基本元(tuple().__class__.__mro__、().__class__.__bases__、__subclasses__())、BuiltinImporter 反射存取、.NET/JS Function constructor 變體、user-input filter expression 注入面。8 個真陽性測試案例、5 個真陰性,在完整 466 樣本良性 skill 基準語料上 0 false positive。
ATR-2026-00441 (privilege-escalation) — CVE-2026-25592 偵測。五個 condition 覆蓋寫檔工具參數指向 OS 層 autostart 路徑(Windows Start Menu Startup、XDG autostart、systemd-user、cron、macOS LaunchAgents/Daemons)、SK 特定 tool descriptor(SessionsPythonPlugin、完整命名空間變體)、明確宣告任意路徑寫入的過度權限 tool description、目的地是 autostart 路徑的直接 DownloadFileAsync / fs.writeFile 呼叫點、Windows Registry Run key 持久化。7 個真陽性、5 個真陰性,同樣良性語料 0 false positive。
兩條規則都帶完整合規 metadata:EU AI Act Articles 9 / 14 / 15、NIST AI RMF subcategories MP.5.1 / MG.2.3 / MG.4.1、ISO/IEC 42001 clauses 6.2 / 8.6、Colorado AI Act §6-1-1703。下游 ATR 消費者(PanGuard、Vanta、Drata、Lakera)現在可以產生可追蹤證據:偵測事件 → ATR 規則 ID → 合規條文。這個證據模組市場上沒有其他廠商能在結構上產出 — 因為其他廠商沒有公開規則。
Credential leak 加固 helper
同一版本搭配發行:新模組 src/redact.ts,匯出 redactMatchedValue() 與 redactMatchedValues()。ATR 消費端整合應該在把 ATRMatch.matchedPatterns 每筆內容放進 log、錯誤訊息、遙測 payload 之前,先過這個 helper。
動機:2026-05-09 一個 ATR-LangChain 整合 PR 的第三方安全審查指出,整合的 ThreatDetectionError 把原始 regex 匹配的前 64 字元(例如 AKIA* AWS access key)嵌進錯誤訊息。根因:ATRMatch.matchedPatterns 回傳原始匹配子字串,下游消費者沒有 redact primitive。所以一條對洩漏憑證觸發的規則,會在自己的錯誤 log 裡再洩漏一次憑證。
Helper 認得 AWS access keys、GitHub PATs / OAuth / server / user / refresh tokens、Slack tokens、OpenAI / Anthropic API keys、Bearer credentials、JWTs、PEM private keys。每一種都替換成 triage 安全的摘要,只含類別、前 4 byte、原長度。例如 AWS access key AKIAIOSFODNN7EXAMPLE 變成 [redacted:aws_access_key_id head="AKIA" len=20]。輸出長度上限 80 字元。
API 是增量:redactMatchedValue、redactMatchedValues、RedactOptions type 現在和 ATREngine 一起匯出。沒有既有 API 變動。採用是 opt-in。
機制
這種同一天閉環,靠的是 layer-0 偵測標準玩法的四個特性:
1. Microsoft 已經在 production 跑我們的規則。 AGT PR #1277(2026-04-26 merge)裝了 ATR v2.0.12 含 287 條規則,並接了每週 auto-sync workflow。MISP/misp-galaxy PR #1207(2026-05-10 merge)把 336 條規則叢集放進全球威脅情資分享層。MISP/misp-taxonomies PR #323 把 rule-ID 標籤詞彙放進去。Microsoft Copilot 對 ATRPolicyEvaluator 寫回歸測試時,不是在測我們的意圖 — 是在測已經在他們 production pipeline 跑的合約。
2. 測試 fixture 可以先於規則,而不會破壞協定。 Copilot 先寫了預設 ATR 覆蓋的 AGT fixture,而那覆蓋當下還不存在。在閉源偵測廠商模型下這是壞掉的測試套件。在 layer-0 開放標準模型下這是 issue tracker — Copilot 用機器可讀的格式告訴我們 Microsoft 預期 ATR 該覆蓋哪些 exploit 形狀。我們同一天出貨規則。
3. 合規 metadata 可流通。 規則帶著 EU AI Act + NIST + ISO + Colorado 映射,代表規則語料的任何消費者都繼承證據軌跡。Microsoft AGT、Cisco AI Defense、NVIDIA Garak、IBM mcp-context-forge — 全部免費拿到四框架合規可追蹤性。這是規則之上的一層,閉源偵測廠商結構上搆不到。
4. Redact helper 把「偵測再次暴露被偵測物」的迴圈閉起來。 在一個關閉的 PR 第三方審查中發現。和新 CVE 規則同一個 release 修好。對每個下游整合都是 opt-in 增量。開放標準模型給你的是閉源偵測廠商給不了的東西 — 你的下游發現一個真的缺陷,你在同一個 release 週期修好上游。
這篇 PR 沒宣稱的事
我們不是在 Microsoft 揭露之前就在野外抓到 Semantic Kernel RCE。我們是在 Microsoft 公開揭露和 Microsoft Copilot 回歸測試合約之後出貨偵測規則。
我們沒有和 Microsoft Security Response Center 或 AGT 團隊就規則形狀協調。偵測 pattern 來自公開的揭露 blog 和公開的 Copilot PR 測試 fixture。
Copilot 四個 fixture 中有兩個使用 ATR v2.1.2 用標準 regex 形狀抓不到的攻擊變體(importlib 動態匯入;schtasks /tr startup 寫入)。我們在 AGT PR #1981 留言提出兩個選項:把 fixture 改成 Microsoft blog 的標準 exploit pattern,或者後續 v2.1.3 ATR release 擴充覆蓋這些變體。哪條路徑都能閉環;我們讓 AGT 維護者選。
驗收證據
| 測試 | 結果 |
|---|
|---|---|
| 完整 vitest 套件 | 374 / 374 通過(發版前是 361 / 361) |
|---|
| ATR-2026-00440 TP / TN | 8 / 8 + 0 / 5 |
|---|
| ATR-2026-00441 TP / TN | 7 / 7 + 0 / 5 |
|---|
| 新規則在完整 466 樣本良性語料上的 FP | 0 |
|---|
redact.ts unit tests | 13 / 13 通過 |
|---|
| npm publish | 已上線為 [email protected],2026-05-11 08:23 UTC |
|---|
| Microsoft AGT 每週 auto-sync | 下次排定執行時抓到 v2.1.2 |
|---|
Repo 連結
- ●ATR v2.1.2 release:https://github.com/Agent-Threat-Rule/agent-threat-rules/releases/tag/v2.1.2
- ●PR #50(已 merge):https://github.com/Agent-Threat-Rule/agent-threat-rules/pull/50
- ●Microsoft AGT PR #1981(open):https://github.com/microsoft/agent-governance-toolkit/pull/1981
- ●Microsoft Security Blog (2026-05-07):https://www.microsoft.com/en-us/security/blog/2026/05/07/prompts-become-shells-rce-vulnerabilities-ai-agent-frameworks/
- ●npm:https://www.npmjs.com/package/agent-threat-rules
當閉源 AI Agent 平台廠商公開 RCE,開放社群歷來的反應視窗是以週計算。Layer-0 偵測標準玩法把那視窗壓到同一個工作天。這就是合約。