AIDEFEND in Action AIA-0097 實證研究 發布於 AIA: 2026年10月1日

Azure DevOps PR 隱藏指示誘導審查 agent 跨專案讀取資料並貼回留言

Manifold Security 驗證指出:Azure DevOps PR 說明中對人眼隱藏的 HTML 註解,會被微軟官方 MCP 伺服器的 PR 工具原樣回傳。受測的 Claude Code 與 Copilot CLI 審查 agent 依照註解指示,利用審查者的高權限帳號觸發外部貢獻者無權存取的專案管線(pipeline)、讀取私有 Wiki 頁面,並將敏感內容貼到攻擊者看得到的 PR 留言中。MSRC 已受理並追蹤該通報;公開資料並未確認微軟已完成伺服器端修補。

Indirect Prompt InjectionData ExfiltrationSink EnforcementMCP Security
9 項對應的 AIDEFEND 防禦手法

威脅分析

貢獻者隱藏在 HTML 註解中的文字,人類審查者在網頁介面上無法察覺,但 MCP 的 PR 檢索工具卻將其完整交付給審查 agent。審查 agent 持有較外部貢獻者更為寬廣的 Azure DevOps 組織權限;一旦遵從該指示,常規的程式碼審查便演變為跨專案觸發管線、讀取私有 Wiki,並將機密內容張貼至攻擊者可存取的留言區。

  1. 貢獻者在 PR 說明中置入網頁介面不顯示的 HTML 註解,要求 AI 審查者執行管線、讀取私有 Wiki 並張貼內容。
  2. 審查 agent 呼叫 get_pull_request;相較於其他工具,該 PR 說明回傳時缺少來源所描述的不可信資料標記(spotlighting)。
  3. Agent 依注入指示呼叫 pipelines_run_pipeline,以審查者身分在貢獻者無權存取的私有專案中觸發管線執行。
  4. Agent 呼叫 wiki_get_wiki_page_content,成功讀取該跨專案私有 Wiki 內的機密文件內容。
  5. Agent 將取得的私有 Wiki 內容寫入貢獻者 該貢獻者看得到的 PR 留言中,使低信任度的外部攻擊者得以直接檢視外洩資料。

Manifold 在受控測試中以 Claude Code 與 Copilot CLI 重現了此項攻擊鏈。微軟 MSRC 已確認受理並追蹤該通報。引用的公開披露並未聲稱微軟已修補 PR 說明工具;且以明確標記不可信內容(spotlighting),有助於提醒模型區分資料與指令,但不能取代每項操作的授權檢查。

適用的 9 項 AIDEFEND 防禦手法

AID-H-018.002
Policy-Based Access Control
極高
將程式碼審查任務嚴格綁定至其獲授權的專案與動作範圍;即使審查者帳號平常具備跨專案操作權限,由該任務發起之跨專案執行亦應予以阻絕。防禦方可實施此項政策之位置為 agent 分派器之政策 hook(如 Claude Code 的 PreToolUse hook 或 Copilot CLI 的工具政策),或架設於 Azure DevOps 伺服器前端的 MCP 閘道:凡 pipelines_* 或 wiki_* 呼叫所帶之專案引數與當前 PR 所屬專案不符,一律直接拒絕。微軟官方伺服器處理常式並非客戶端可注入自訂判定的控制點。
AID-H-017.002
Least-Privilege Tool Architecture
極高
審查 MCP 伺服器只載入 core 與 repositories 工具領域(-d core repositories;官方要求包含 core),讓 pipelines_run_pipeline 與 wiki_get_wiki_page_content 不被註冊。另以專屬身分驗證伺服器(AID-H-004.002),並在 Azure DevOps 服務端限縮專案授權(AID-H-018.002);身分驗證本身不會授予或拒絕專案權限。須確認沒有能繞過工具清單的直接 API 路徑。
AID-H-004.002
Service & API Authentication
高
讓審查 MCP 伺服器透過支援的非互動式憑證流程,以專屬 Entra 服務主體驗證身分,不能沿用管理員的使用者工作階段。另外只授予該身分受審專案必要的程式碼/PR 權限,拒絕無關管線與私有 Wiki。OAuth 建立機器身分,專案授權是另一項必要前提。須以伺服器實際身分獨立測試跨專案操作,確認被拒絕。
AID-H-018.005
Value-Level Capability Metadata & Data Flow Sink Enforcement
中
在客戶可控的審查執行環境,將權威的 Wiki 機敏程度與來源資訊傳到所有衍生資料,並依 AID-H-018.005 在確切 PR 留言出口執行政策。閘道若只是替回傳文字加標籤,無法追蹤模型任意改寫或編碼。較保守的替代方式,是讀取私有資料後將整個隔離審查工作階段標為機密,直到建立全新工作階段前,拒絕所有低信任目的地的寫入;這與 AIDEFEND 所述逐一追蹤每個資料值來源及衍生內容的方法不同。兩種方式都須涵蓋完整讀寫路徑、可信工作階段綁定、禁止直接 API 繞過,並拒絕未知標籤。原版 CLI 行為不能證明已部署。
AID-H-018.003
High-Impact Independent Validation & Approval Gate
中
受控分派器或 MCP 閘道執行高影響的跨專案操作前,須取得獨立、有效且綁定確切專案、管線、工具引數與效果的核准。原生 CLI 提示可以協助人工審查,但不是 G001 的簽章動作閘道,也不能保證審查者一定拒絕注入請求。無人值守時,缺少核准一律拒絕,各種繞過路徑也須受同一閘道約束。
AID-H-017.007
Dual-LLM Isolation Pattern
中
由獨立隔離、沒有工具的 Q 工作程序讀取原始 PR 文字與 diff,再由驗證中介服務將範圍受限的業務欄位交給 P 工作程序。兩端須有獨立身分、憑證與網路路徑,並禁止 P 讀取原始 PR 內容。字串即使符合指定欄位格式,仍可能藏有惡意指示,因此轉交文字仍是不可信資料,每次工具動作都須獨立授權。原版 Claude Code 或 Copilot CLI 不會因為多用一份提示詞,就具備這項隔離架構。
AID-D-003.004
Tool-Call Sequence Anomaly Detection
中
透過完整的工具呼叫序列遙測資料,精準偵測 PR 審查流程異常轉向 pipelines_run_pipeline 或 wiki_get_wiki_page_content 之行為。本項指引能識別非預期的工具呼叫轉換;然而若事件流未額外注入經驗證的專案 ID 與任務獲准專案資訊,系統將無法推論目標專案是否偏離當前 PR。跨專案不一致比對屬於自訂偵測規則,非本指引自動輸出之功能。
AID-D-003.002
Sensitive Information & Data Leakage Detection
中
針對審查 agent 即將張貼的每則留言,於發布前全面掃描組織專屬之機敏特徵(如內部專案代號、Wiki 頁面標題與特定憑證格式),一旦命中即刻發出警示通知。該偵測結果可作為 AID-H-018.005 輸出端政策之判定依據;其本身雖不具阻斷功能,但能補足來源追蹤遺漏之機敏內容。
AID-H-034.005
MCP Server Output, Resource URI & Elicitation Boundary Controls
中
在將外部人員可編輯之 PR 欄位交付模型前,於 MCP 伺服器輸出端落實範圍邊界限制並明確標示為不可信來源;此舉可補足 spotlighting 機制之缺口,但標籤本身無法取代實質授權把關。此控制實作於伺服器內部:針對官方伺服器,防禦方可等待微軟發布修正、改用修補後之開源分支自行運行,或透過外部 MCP 閘道封裝其輸出。

身為資安防禦者,我們應該這麼做

  • 將 MCP 回傳的 PR 說明視為不可信資料,包括網頁介面不顯示的 HTML 註解。
  • 只載入審查必要的工具領域,使用專屬服務主體,並在 Azure DevOps 限縮專案權限。由可信分派器或閘道核對每次呼叫的任務、PR 與專案,拒絕無關的管線及私有 Wiki 操作。
  • 若必須讀取私有 Wiki,需在可控的執行環境完整追蹤資料及其衍生內容,於 PR 留言出口執行政策;只加來源標籤的閘道不足以追蹤模型改寫。較保守的替代方法是讀取私有資料後,將整個隔離工作階段標為機密,直到建立全新工作階段前都拒絕低信任目的地寫入。這與 AIDEFEND 所述逐一追蹤每個資料值來源及衍生內容的方法不同;兩種方式都須涵蓋所有讀寫路徑。

1 個額外的防禦考量

證據與部署界線

原始研究證實了概念驗證鏈與伺服器輸出端的標記缺口,但並未提供真實生產環境遭入侵或微軟已完成全面修補之證據。
建議做法: 將 MCP 伺服器回傳之 PR 說明與留言一律視為不可信輸入,特別是網頁介面未渲染顯示的 HTML 註解內容。

結論

AIDEFEND  對應的控制涵蓋最小化 MCP 工具集、限縮後端專案權限與最終工具授權。若任務必須讀取機密,還需要能涵蓋所有衍生資料與出口的執行環境,或明確採用整個工作階段的保守封鎖。提示詞或來源標籤本身無法保證不會外洩。

最後更新: