Microsoft Azure DevOps MCP 漏洞:隐藏的 PR 评论可劫持 AI 审查代理

Microsoft Azure DevOps MCP 漏洞:隐藏的 PR 评论可劫持 AI 审查代理

导语:Manifold Security 详细披露了微软官方 Azure DevOps MCP 服务器中存在的一处"困惑代理"漏洞:通过 PR 描述中嵌入的隐形 HTML 注释,攻击者可在审查者启动 AI 审查代理时劫持其目标,借用审查者凭证访问其本身无权进入的项目,并悄然泄露源代码、机密和工作项。

在 Azure DevOps 拉取请求中嵌入一条不可见评论,就能让审查者自己的 AI 编程代理被攻击者反过来利用——驱动它进入攻击者本身无权访问的项目,并悄悄泄露代理所获取的内容。

该漏洞存在于微软官方的 Azure DevOps MCP 服务器中。其成因在于,该服务器的一个工具在返回拉取请求描述时,没有采用微软已在其他工具上部署的提示注入(prompt injection)防护措施。

攻击性安全公司 Manifold Security 于本周详细披露了这个"困惑代理(confused-deputy)"漏洞。微软提供该服务器是为了让 AI 代理能够以用户自身权限读取并操作 Azure DevOps,覆盖拉取请求、流水线、Wiki 页面和工作项等资源。这恰恰是问题所在:由他人编写的内容,可能摇身一变成为代理将据此执行操作的指令。

Azure DevOps 的 PR 描述支持 Markdown 格式,因此允许嵌入 HTML 注释。在 Web 用户界面中,HTML 注释(<!– … –>)渲染时不会显示任何内容,审查者在浏览描述时只会看到一条普通的变更信息。但 REST API 会原样返回这些注释,而服务器会把这部分文字直接交给代理处理。

人类看到的内容与模型接收到的内容之间的这种差异,就是漏洞被利用的投递机制:攻击者从未与代理直接对话,而是将指令植入到他们知道日后会被代理读取的内容之中。

当审查者让代理审查该 PR 时,隐藏的文本就能改写代理的目标。由于代理当时携带着审查者的凭证,因此它可以访问攻击者本身无权进入的项目。Manifold 表示,这种访问不仅限于其概念验证演示中所外泄的 Wiki 页面,还能触及源代码、机密信息和工作项。该公司认为这种权限提升是"正常情形",因为审查者通常比打开 PR 的人级别更高。攻击者自身不会获得任何东西;他们只是借用了审查者的访问能力,借助一段审查者本人从未看到过的文本。

让这一漏洞的严重性超出一类普通提示注入告警的原因是——微软实际上已经部署了相应的防护。Manifold 在阅读该服务器的源代码时发现,服务器使用了"聚光法(spotlighting)",这是微软关于间接提示注入指南中提出的一种技术:用定界符包裹不可信内容,使模型能够区分数据与应当遵循的指令。

微软在 PR #1062 中加入了这一防护,其中 Wiki 页面和构建日志工具会通过一个共享辅助函数 createExternalContentResponse 来处理输出。然而,返回拉取请求的工具 repo_get_pull_request_by_id 从未调用该辅助函数,所以它会原样返回描述,而这恰恰是攻击者能够写入的输入面。The Hacker News 截至 7 月 21 日在最新源代码中确认,该代码路径仍未被修复。

原文配图

在 Manifold 的概念验证(在 v2.7.0 的本地构建上运行)中,一个项目的贡献者打开了一个看似正常的 PR,但其隐藏注释中携带了攻击载荷。一旦代理开始审查 PR,工具调用追踪就会形成一条链:在另一个项目中触发一条流水线,读取攻击者无法打开的机密 Wiki 页面,然后将该页面作为评论发回该 PR,由攻击者读取。

一条隐藏注释驱动了整条调用链,而链中的每一次调用都是代理本来就有权限执行的操作。研究人员写道,问题在于"这一序列和意图,是由人类从未看到的文本所驱动"。该团队在 Copilot CLI 和 Claude Code 上都复现了此漏洞,因此它并不绑定于某一款特定的代理。

不过,这条攻击链存在若干前提条件:攻击者撰写的 PR 文本;将 PR 文本投递给代理的工作流;访问权限高于攻击者的审查者;以及被授予无需询问即可调用工具的代理。Manifold 确认,他们测试了最后一项配置——"自动批准(auto-approve)"姿态,即不会出现每个工具的确认提示,而该检查点本来可以让审查者在一条异常的跨项目流水线运行实际生效之前及时发现。宽泛的令牌加上这种姿态,正是风险集中的地方。

演示假设有一个真人启动审查流程,但 Manifold 指出了团队当前的发展方向:由触发器自动启动的审查、分类与摘要,不再有真人去逐次触发每一轮运行或阅读每一次结果。在这种场景下,被植入的描述就会自动生效,泄露在有人察觉之前持续得更久。

这种模式并不新鲜。2025 年 5 月,Invariant Labs 演示了针对 GitHub MCP 服务器的同类型攻击:利用一个公开 Issue 推动代理读取私有代码库,并通过一个拉取请求将代码泄露出去;同样的技术此后已经波及到自动化的 GitHub 代理工作流。

那个案例是 Simon Willison 在提出"致命三位一体(lethal trifecta)"概念时所列举的实例之一:一个能够访问私密数据的代理、会接触到不可信内容的输入,以及一条数据外发的通道。任何同时具备这三项能力的代理,都能被一段文本反过来对付它的所有者,而大多数真正可用的代理都同时具备这三项。

一位微软发言人感谢 Manifold 在协调披露框架下上报了相关行为,并称之为"已知的一类 AI 风险",微软在持续推进其防护工作的过程中会将其纳入考量。微软并未说明是否会修改相关代码或分配一个 CVE 编号。


来源信息

来源:The Hacker News

原文链接:https://thehackernews.com/2026/07/microsoft-azure-devops-mcp-flaw-lets.html

作者:info@thehackernews.com (The Hacker News)