目录

GitLab DUO编程助手提示注入攻击深度剖析

GitLab DUO编程助手提示注入攻击深度剖析

1. 背景

GitLab Duo 是一款基于 Anthropic 开发的大语言模型 Claude 构建的 AI 助手,于 2023 年 6 月推出,2024 年 4 月又新增了 Duo Chat 聊天机器人功能,让用户能够通过自然语言与之交互。这款助手可为开发者提供代码建议、代码审核、分析合并请求等功能。

该AI助手存在提示词注入漏洞,攻击者可以从私有项目中窃取源代码,操纵显示给其他用户的代码建议,甚至泄露机密的、未公开的零日漏洞。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281207441.png-water_print

2. 漏洞分析

2.1. 通过隐藏提示操纵 GitLab Duo

首先,GitLab Duo 会响应植入源代码中的提示:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281207133.png-water_print

除了源代码之外,在 GitLab 项目的不同部分嵌入隐藏指令,仍然会影响 Duo 的行为。最终得到的结果如下:

  • 合并请求(MR)描述和评论
  • 提交信息(Commit)
  • 问题描述和评论(Issue)
  • 源代码

由于Duo 会分析页面的整个上下文,包括评论、描述和源代码,因此隐藏在该上下文任何位置的注入指令都会影响Duo的结果。

2.2. KaTex,Base16 和隐形文本

为了使提示更难以被检测,尝试使用一些编码来隐藏攻击痕迹:

这里展开讲讲Unicode Smuggler攻击方法:

Unicode字符集包含了世界上几乎所有语言的字符,甚至包括一些控制字符非打印字符,它们在不同的环境中具有不同的含义。一些Unicode字符的特性可以被攻击者用来伪装恶意指令或数据,这些指令在外表上看起来是正常的,但在目标系统中却被错误地处理或执行。

Unicode Tags是一种特殊的Unicode字符,用于标识某些文本内容的语言、区域或类别。它们通常以"U+“开头,后跟一串数字,但不可见,Unicode Tags本质上是Unicode字符集中的字符。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281208518.png-water_print

Unicode tag-based instruction smuggling攻击中,攻击者通过嵌入特殊的Unicode标签或字符(比如零宽空格(Zero Width Space,ZWSP)、方向控制字符、回车符等),使得恶意指令被隐藏在正常数据流中,从而影响模型输出结果。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281208931.png-water_print

假设我们给模型发送一段字符:“Hello<Unicode tag字符>",模型存在漏洞将会回复我们:“PWND!!!”

  • Base16 编码
  • KaTeX 以白色文本渲染(使提示在 GitLab 网站内不可见)

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281208495.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281208668.png-water_print

经过实验发现,这些隐藏的指令仍然可以被 Duo识别,并实现提示注入的效果。

2.3. AI输出的结果不应该过分信任(OWASP LLM Top10过度依赖)

上边的攻击手法导致Duo输出的结果存在重大安全风险,比如:

  • 操纵 Duo 的代码建议 —— 在其推荐代码中引入恶意的 JavaScript 包。
  • 在 Duo 的响应中将恶意 URL 输出为安全的 —— 导致用户点击并进入一个伪造的登录页面。
  • 说服 Duo 将恶意的合并请求描述为安全的,误导reviewer。

比如下面这个提示词:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281208319.png-water_print

通过Unicode Smuggler方式将攻击提示词隐藏在Commit信息中:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281208924.png-water_print

可以看到,当用户使用Duo Chat开发代码时,一个恶意JS被引入到源代码中:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281208204.png-water_print

2.4. HTML 注入:将 Duo 变成网络攻击向量

Duo 还支持将回复格式化为 Markdown,允许使用带有自定义标签的丰富内容,如 URL:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281209755.png-water_print

经过尝试,可以创建一个提示,使 Duo 显示恶意 URL:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281209634.png-water_print

提示位于源代码中,同样适用unicode Smuggler方式拼接在代码 URL 内:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281209197.png-water_print

在进一步的测试中发现,GitLab Duo 的响应是随着数据流输入逐步呈现的,这种特性说明 Duo 在完全了解响应结构之前,通过异步解析 Markdown ,实时解释并渲染成对话框中的 HTML。

具体流式 Markdown 渲染的工作流程如下:

  1. 接受到模型生成的部分输入 - 前端开始逐行渲染。
  2. 随着内容持续输出,对结果进行过滤和结构化处理(例如,代码块、段落还是引用)。
  3. 如果在代码块开始之前插入了恶意 HTML 标签,恶意HTML会被成功渲染。

利用这种特性,攻击者已能够构造恶意的 Markdown URL 并将其显示给用户。进一步测试:如果 URL 的标签中包含原始 HTML 代码会怎样?如果 Duo 实时渲染响应,浏览器可能会在过滤之前解释该 HTML。

因此,通过将原始 HTML 注入到实时渲染的内容中,攻击者可以控制页面的部分区域,如<img>这些标签,不受同源策略限制,会自动触发 HTTP 请求到攻击者控制的服务器。

在尝试了各种提示结构后,找到了一个可以可靠触发漏洞的提示:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281209532.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281209908.png-water_print

利用这种方式,我们可以很容易的想到XSS攻击,但是最终的内容被传入 DOMPurifysanitize函数,这是标准库,用于防止XSS攻击,但某些 HTML 标签如<img><form><a>默认不会被移除。

2.5. 利用 Duo 访问私有代码仓

进一步深入挖掘攻击链,利用上面的一些常规标签,实现更大影响。由于Duo 的权限上下文与受害用户的上下文相同,也就是说,Duo 可以看到用户能看到的一切,也包括私有代码。

根据 GitLab 的文档,即使用户在浏览器中没有看到 MR 页面,也可以向 Duo 询问有关特定合并请求的信息。GitLab 的合并请求 URL 结构非常简单:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281209171.png-water_print

例如:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281210653.png-water_print

因此,通过构建恶意提示词,指示 Duo 从私有项目中的合并请求中提取代码更改,将它们编码为 base64,将编码后的数据附加到<img>标签 URL 中,利用流式渲染的特性,结合img标签将结果回传给攻击者服务器。最后,将这个提示隐藏在公共项目的 MR 源代码中。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281210367.png-water_print

攻击效果:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281210742.png-water_print

整理一下完整攻击场景:窃取敏感信息(源代码或0day信息等)

  1. 攻击者在公共项目的合并请求描述中嵌入一个隐藏的提示。
  2. 受害用户通过请求代码审查或合并请求分析来与 Duo 交互。
  3. Duo 处理隐藏的提示,并在响应中注入一个恶意的<img>标签。
  4. 浏览器向攻击者的服务器发送一个 GET 请求,其中包含以 Base64 编码的敏感源代码作为参数。

3. 一些新的发现

笔者在进行进一步测试的时候发现,当下热门的编程助手,如Cline等客户端,也存在同样的问题,比如,这里使用的是Cline + 最新的Claude-opus-4-20250514模型,实现提示注入:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281210126.png-water_print

Cline + gpt4.1:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202505281210610.png-water_print

一方面,后端模型应建立有效的注入攻击防御机制,针对代码或MR等信息中的抽取,需要进行过滤,另一方面,作为客户端,需构建高质量的系统提示语体系,来进一步防范提示词攻击,也是应用开发者应该考虑的关键问题。

4. 总结

目前所有漏洞均已被GitLab官方修复。这类漏洞给像 GitLab Duo 这样的 AI 编程助手带来了新的安全风险:当AI被深度集成到开发工作流程中时,不仅继承了上下文,还继承了风险。通过在看似无害的项目内容中嵌入隐藏指令,就能够操纵 Duo 的行为,甚至窃取敏感信息。

随着AI与传统应用的深度融合,AI 助手现在也已成为Web应用程序攻击面的组成部分。AI上下文感知功能虽然强大,但如果没有适当的防护措施,它同样容易成为重大风险点。

参考:

https://www.legitsecurity.com/blog/remote-prompt-injection-in-gitlab-duo