Azure DevOps MCP Review Agent Cross-Project Exfiltration
Manifold Security showed that an HTML comment hidden in an Azure DevOps PR description was returned verbatim by the official MCP server's PR tool. Claude Code and Copilot CLI agents reviewing the PR followed it to run a pipeline and read a wiki in a project the contributor could not access, then posted the wiki content as a comment on the contributor's PR. MSRC acknowledged and triaged the report; the cited post did not confirm a fix.
Threat Analysis
The contributor's hidden HTML comment was invisible to a human reviewer but not to the MCP PR tool. The review agent held broader Azure DevOps rights than the contributor, so obeying the comment turned a normal PR review into a cross-project pipeline run, private wiki read and attacker-visible comment.
- A contributor embeds an HTML comment that looks invisible in the web UI but asks an AI reviewer to run a pipeline, read a private wiki, and post it back.
- The reviewing agent calls get_pull_request; unlike some other server tools, the PR description is returned without the source's spotlighting wrapper.
- Following the injected text, the agent uses pipelines_run_pipeline under the reviewer's credentials in a project the contributor cannot access.
- The agent invokes wiki_get_wiki_page_content to read confidential content from that private project.
- The agent writes the wiki content as a comment on the contributor's PR, a lower-trust destination that the attacker can read.
Manifold demonstrated the chain with Claude Code and Copilot CLI in tests. MSRC acknowledged and triaged the report. The cited disclosure does not say Microsoft fixed the PR-description tool, and spotlighting untrusted text alone is weaker than per-action authorization.
Applicable AIDEFEND Defenses (9)
What Defenders Should Do Now
- Treat MCP-returned PR descriptions as untrusted, including HTML comments hidden in the web UI.
- Load only required review domains, authenticate a dedicated service principal and constrain Azure DevOps project permissions. Use a trusted dispatcher or gateway to authorize each task, PR and project; deny unrelated pipeline and private-wiki operations.
- If private-wiki access is necessary, implement complete value and derivation tracking in a controlled runtime and enforce the PR-comment sink. A gateway that only labels source text cannot track model rewriting. A conservative alternative marks the entire isolated session confidential after a private read and denies lower-trust writes until a fresh session. This is not the published value-level tracking method; both approaches require complete read/write coverage.
1 additional consideration
Evidence and deployment boundary
Conclusion
Last updated: