一个叫做 GitLab Duo 的 AI 编程助手最近被发现有严重的安全问题!这篇文章是由安全公司 Legit Security 在 2025 年 5 月 20 日发布的,他们发现了一种“远程提示注入”(Remote Prompt Injection)的漏洞。这个漏洞让攻击者可以偷偷拿走别人私密的代码,甚至还能操控 AI 给其他用户错误的代码建议,或者偷走一些还未公开的重大安全漏洞信息。
简单来说,GitLab Duo 是一个 AI 工具,本来是用来帮助程序员写代码、检查安全问题和管理代码合并请求的。但因为它会读取项目页面上的所有内容(包括隐藏的评论),攻击者就能在这些地方偷偷藏一些“指令”,让 AI 按照攻击者的命令执行。
文章里还讲了一个具体的攻击例子:攻击者在一个公开项目的代码里藏了一个指令,让 AI 去偷一个私密项目的代码,然后把这些代码变成一种隐藏的形式(base64 编码)通过图片链接泄露出去。结果,受害者的私密代码就这样被偷走了!
最后,GitLab 已经在 2025 年 2 月 12 日修补了这个漏洞。但这件事提醒我们:像 GitLab Duo 这样的 AI 工具虽然很强大,但如果不小心保护好,它们可能会变成安全隐患。作者还警告说,任何让 AI 处理用户输入的系统,都要把这些输入当成“不可信任”的,防止类似问题再次发生。
简而言之:一条隐藏的评论足以导致 GitLab Duo泄露私有源代码,并在其响应中注入不受信任的 HTML。GitLab 已修复此问题,我们将带您了解完整的攻击链——其中展示了 2025 年 OWASP 十大 LLM 漏洞中的五个。
背景
GitLab Duo是一款集成到 GitLab 的 AI 助手,由 Anthropic 的 Claude 提供支持,旨在帮助开发者完成代码建议、安全审查和合并请求分析等任务。但是,如果这个原本应该保护代码安全的AI被操纵泄露了代码,该怎么办呢?
这正是我们发现的:一个远程提示注入漏洞,允许攻击者从私人项目中窃取源代码,操纵向其他用户显示的代码建议,甚至泄露机密的、未公开的零日漏洞——所有这些都通过 GitLab Duo Chat 实现。
在这篇博文中,我们分解了攻击的工作原理 - 从提示注入到 HTML 注入 - 并演示了真实的端到端攻击场景。
通过隐藏提示操作 GitLab Duo(LLM01)
我们首先测试了 GitLab Duo 是否会响应源代码中植入的提示。令我们惊讶的是,它确实响应了:
这引出了一个关键问题:我们能否在 GitLab 项目的不同部分嵌入隐藏指令,并同时影响 Duo 的行为?我们进行了实验,将隐藏的提示放置在以下位置:
-
合并请求(MR)描述和评论
-
提交消息
-
问题描述和评论
-
源代码
每一个都起作用了——GitLab Duo 响应了隐藏的提示。
为什么?因为为了生成有用的答案,Duo 会分析页面的整个上下文,包括评论、描述和源代码——这使得它容易受到隐藏在该上下文中任何地方的注入指令的攻击。
KaTex、Base16 和不可见文本(LLM08)
为了使提示更难被察觉,我们使用了编码技巧:
-
使用ASCII Smuggler进行 Unicode 走私
-
Base16编码的有效载荷
-
KaTeX 以白色文本渲染(使提示在 GitLab 网站内不可见)
例如,您可以使用此 KaTeX 格式在 GitLab 网站内以白色文本发布评论和描述:
有关 KaTeX 的更多信息可以在这里找到:KaTeX – 网络上最快的数学排版库https://katex.org/。
你不应该相信的人工智能输出(LLM09)
这导致了一些影响深远的行为:
-
操纵 Duo 的代码建议 - 甚至指示它在其推荐的代码中包含恶意 JavaScript 包。
-
在 Duo 的响应中将恶意 URL 显示为安全的 - 引导用户点击它并进入虚假的登录页面。
-
说服 Duo 将恶意合并请求呈现为安全的,误导审阅者。
看一下这个提示:
Duo 按照这个隐藏的提示,随意地向用户暗示恶意代码:
HTML 注入:将 Duo 变成 Web 攻击媒介(LLM05)
Duo 还使用 Markdown 格式格式化响应,允许使用带有自定义标签的 URL 等丰富内容:
经过一番研究,我们能够创建一个提示,让 Duo 显示恶意 URL:
提示位于源代码中,伪装成 URL 中的 unicode
然后,有一件事引起了我们的注意。在测试 GitLab Duo 的响应时,我们注意到它的答案是逐行逐行地呈现的。
注意到“初始化”一词的风格变化了吗?
这表明使用了异步 Markdown 解析。这很重要,因为这意味着 Markdown 在响应的完整结构被知晓之前就被解释并渲染成 HTML。
流式 Markdown 渲染(如 Duo 中所示)的工作方式如下:
-
部分输入到达 - 前端开始逐行渲染。
-
随着内容的增长,会应用清理和结构(例如,这是一个代码块、段落还是引用?)。
-
如果恶意 HTML 标签在代码块开始之前或隔离块之外流式传输,则它可能会被视为活动 HTML。
这意味着 AI 答案(旨在安全降价)过早地呈现活动 HTML。
此时,我们意识到我们已经可以编写恶意的 Markdown URL 并将其显示给用户。因此,我们提出一个问题:如果 URL 的标签本身包含原始 HTML 会怎样?如果 Duo 实时渲染响应,浏览器可能会在任何适当的过滤措施生效之前就解析该 HTML。
通过将原始 HTML 注入实时呈现的内容,我们可以控制页面的部分内容 - 包括插入 <img> 标签等元素的能力,这些元素会触发对攻击者控制的服务器的自动 HTTP 请求。
在尝试了各种提示结构之后,我们发现了一个可以可靠地触发漏洞的提示结构:
并且它成功了。利用这一点,我们意识到可以直接在 Duo 的答案中注入原始 HTML 标签。我们知道你在想什么——XSS,对吧?没错,但是:
答案内容会被传入DOMPurify的“sanitize”函数(一个行业标准库)来清理 HTML。虽然 DOMPurify 能够出色地防御大多数 XSS 攻击,但某些 HTML 标签(例如<img> 、<form>和<a> )默认情况下不会被移除。那么,我们能用这些基本的 HTML 标签做什么呢?真的存在风险吗?
利用 Duo 对私有源代码的访问权限(LLM02)
事情变得有趣起来。Duo 的权限上下文与受害者用户在相同的上下文中运行。换句话说,Duo 可以看到用户可以看到的一切,包括私有代码。
根据 GitLab 的文档,即使您当前没有在浏览器中查看该合并请求页面,也可以向 Duo 询问具体的合并请求。GitLab 的合并请求 URL 结构非常简单:
例如:
不错,Duo 可以访问特定合并请求中的代码更改。Duo 还能执行攻击者植入的提示指令。此外,Duo 的聊天输出容易受到 HTML 注入攻击。
让我们创建一个提示,指示 Duo 从私人项目中的合并请求中提取代码更改,用 base64 对其进行编码,将编码后的数据附加到 <img> 标签 URL,然后将生成的 HTML 注入到其响应中。
然后,我们会将此提示隐藏在公共项目的 MR 源代码中。
成功了!当受害者向 Duo 询问有关 HTML 文件的标准问题时,文件中隐藏的编码提示被触发。当浏览器尝试渲染“图像”时,这导致用户正在开发的私人 iOS 项目的源代码泄露。
MR源代码泄露:
如上例所示,浏览器尝试呈现 <img> 标签并发送此 GET 请求:
解码 base64 可以揭示受害者所接触到的私人项目中所做的更改:
完整攻击场景:窃取源代码
全面攻击可能如下:
-
攻击者嵌入隐藏的提示 — 例如,在公共项目的合并请求描述中。
-
受害者用户通过请求代码审查或合并请求分析与 Duo 进行交互。
-
Duo 处理隐藏的提示并将恶意的 <img> 标签注入响应中。
-
浏览器向攻击者的服务器发送 GET 请求,其中包含敏感源代码作为 Base64 编码的参数。
通过人工智能泄露零日漏洞
虽然我们的主要演示集中在源代码泄露上,但同样的技术也可用于泄露机密问题数据。GitLab Duo 不仅可以访问代码,还可以访问项目问题——包括内部讨论、安全披露或事件报告。通过在合并请求、评论甚至源代码中嵌入隐藏提示,攻击者可以指示 Duo 静默检索受害者用户可以访问的机密问题的内容,将其用 base64 编码,然后将其嵌入到渲染的 HTML 元素(例如<img>标签)中。
考虑一个高风险的例子:GitLab 的一名员工或贡献者开设了一个私人问题,描述了一个新发现的零日漏洞。如果该用户随后与公共存储库中被污染的提示符进行交互,Duo 可能会被操纵泄露该问题的内容。这将风险从代码扩展到产品安全、私人信息披露和组织机密。
GitLab 的回应
在我们于 2025 年 2 月 12 日披露此问题后,GitLab 确认了 HTML 注入漏洞,并将提示注入视为安全问题。GitLab 确认这两个漏洞均已得到修复。
该补丁作为duo-ui!52的一部分发布,可防止 Duo 渲染指向不属于 的外部域的不安全 HTML 标签(例如<img>或) ,从而有效降低基于 HTML 的数据泄露风险。截至发布之日,此处描述的漏洞利用链已不再可能。<form>gitlab.com
我们感谢 GitLab 在整个过程中的透明度和快速协作。
结论
此漏洞凸显了 GitLab Duo 等 AI 助手的双刃剑特性:当它们深度融入开发工作流程时,不仅会继承上下文,还会承担风险。通过在看似无害的项目内容中嵌入隐藏指令,我们得以操纵 Duo 的行为,窃取私有源代码,并演示如何利用 AI 响应来造成意想不到的有害后果。
此后,GitLab 修补了 HTML 和提示注入向量,强调了不仅要保护 AI 工具生成的内容,还要保护它们消耗的内容的重要性。
更广泛的结论显而易见:AI 助手现在已成为应用程序攻击面的一部分。任何允许 LLM 获取用户控制内容的系统都必须将该输入视为不可信且可能具有恶意行为。情境感知 AI 功能强大,但如果缺乏适当的保护措施,它同样很容易成为暴露点。
原文始发于微信公众号(Ots安全):GitLab Duo 远程提示注入导致源代码被窃取
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论