|
引言 在本文中,我们演示了如何利用 OpenAI 的 “安全 URL 渲染” 功能中的一个绕过点,使 ChatGPT 将个人信息发送至第三方服务器。攻击者可以通过来自不受信任数据的 prompt injection 利用此漏洞。 通过Prompt Injection泄露聊天记录在研究 ChatGPT 聊天记录功能的系统提示词(system prompt)时,萌生了这个利用思路。 注意到,所有相关信息都包含在系统提示词中,在一次 prompt injection 攻击中,攻击者完全可以访问到这些内容。 上方的截图展示了系统提示词中包含的相关聊天记录信息。 寻找数据外泄的绕过方式如果你一直经常使用,你应该知道 OpenAI 引入了一个名为url_safe的功能,用于通过恶意 URL 进行的数据外泄问题。 实现数据外泄需要满足三个前提条件: - 找到一个可用的 HTTP GET 接口,用于向该站点发送数据
所谓url_safe域名,是指 ChatGPT 即使在处理不受信任数据的上下文中,也允许访问的站点,这就可能成为数据泄露的潜在通道。 我发现其中一个这样的域名是windows.net。我知道可以在这个域名下创建一个 Blob 存储账号,该账号不仅可以运行,还可以查看访问日志! 利用Azure Blob存储日志作为数据泄露通道最直接可用的域名是blob.core.windows.net。我还发现了其他一些可以利用的域名,但它们的利用方式更复杂,不易解释。 通过向这个域名发送数据,我们就可以随意外泄信息。因此,我创建了名为trustnoai的存储账户,并更新了 ChatGPT 的提示指令,使其将信息泄露到这个域名下。 所以,基于这些已知条件,我们可以构造一个概念验证(PoC),来外泄用户的聊天记录! 演示在下面的PoC中,我展示了如何访问系统提示词中的 “Recent Conversation Content(最近对话内容)” 部分。除此之外,其他所有存在于上下文中的信息也都可以被外泄,比如用户交互元数据、记忆内容(memories)、用户行为洞察等…… 这张截图展示了整个攻击链的流程: 各个步骤详解如下: 1、ChatGPT 被诱导访问对话历史记录 2、Prompt injection 劫持了 ChatGPT,读取聊天记录并渲染图像。 3、攻击者可以通过查看其 Azure Blob 存储服务器的日志来观察泄露结果。 4、最终,ChatGPT 会提取系统提示词中 “recent conversation history(最近对话记录)” 下的所有内容,并将其发送到第三方域名:https://trustnoai.blob.core.windows.net。 注意:与大多数漏洞利用一样,值得强调的是,这种攻击也可能在任何时候被模型自身利用,例如通过幻觉(hallucination)或模型后门实现。尽管如此,一个主动的攻击者通过 prompt injection 发起攻击,仍然是最可能的攻击途径。 危害这个漏洞的严重性正在持续上升。现在,攻击者不仅可以外泄未来所有的聊天信息,还能访问聊天记录,以及通过工具调用等方式强行注入的其他数据。 最近,我注意到url_safe功能已经不再在客户端侧暴露。这说明 OpenAI 正在进行一些相关的调整。在发布本文之前的一个月里,我曾多次联系 OpenAI,询问该漏洞的状态和修复进展,但截至发文时仍未收到回复。 建议措施- 限制并封闭url_safe功能并公开列出被信任的安全域名列表,以实现可信与透明;
- 我发现有两个url_safe域名允许我查看服务器端日志,分别是:windows.net和apache.org;
- 对于企业客户,url_safe应支持通过管理员设置进行配置和管理。
总结通过渲染来自不受信任域名的资源进行数据外泄,是当前 AI 应用中最常见的安全漏洞之一。 |