在我们深入研究细节之前,我们想先解释一下插件上的帐户接管意味着什么。
举个例子,当您安装与您的 GitHub 交互的插件时,此插件会在插件网站上为您创建一个额外的帐户,用于存储您的 GitHub 凭据。使用这些凭据,插件可以访问包含密钥和源代码的私有存储库。
如果攻击者在此插件中控制了您的帐户,那么他也可以访问您的私有 GitHub 存储库。
插件实验室
PluginLab (pluginlab.ai) 是开发人员/公司用来为 ChatGPT 开发插件的框架。
使用 PluginLab 开发的示例插件包括 ScholarAI、ChatOCR、KeyMateAI、ChatOCR、KeyMateAI、ShowNotes、Perfect Chirp 等。
在我们的示例中,我们将使用"AskTheCode"------一个使用 PluginLab.AI 开发的插件,该插件可让您向 GitHub 仓库提问,这意味着使用此插件的用户授予它访问其 GitHub 存储库的权限。
AskTheCode 上的帐户接管意味着攻击者可以访问使用此插件的任何用户的 GitHub 存储库。
在下图中,我们演示了如何使用 ChatGPT 访问受害者 Dan Brown (moreisless3dan) 的私有存储库。
(截图取自攻击者帐户,显示他如何从受害者的 GitHub 读取私人文件)
技术细节
当用户安装插件"AskTheCode"(或任何其他使用 PluginLab.AI 开发的插件)时,ChatGPT 会启动安装流程,以下是主要步骤:
-
AskTheCode 为用户创建一个新帐户,并要求用户访问其 GitHub 帐户的权限。AskTheCode 存储 GitHub 凭据。
-
AskTheCode 为 ChatGPT 生成代码。
-
ChatGPT 使用该代码连接到 AskTheCode 上的用户帐户。
-
插件已安装。
为方便起见,我们附上了描述流程的图表:
您需要关注的是图中的"Code",这是从 AskTheCode 传递给 ChatGPT 的密钥。您可以将代码视为 ChatGPT 用于连接到 Dan 在 AskTheCode 上的帐户的密码。
攻击者的目标是窃取该代码,并执行帐户接管。
有趣的是,在第 3 步之后,AskTheCode 从客户端的浏览器向 https://auth.pluginlab.ai/oauth/authorize 发出请求,以检索基于用户 memberId 的代码:
而回应:
然后,在第 5 步中,AskTheCode 使用代码"5e806..."将用户重定向到 ChatGPT。然后 ChatGPT 可以使用代码代表 AskTheCode(最终是 GitHub)中的用户执行操作。
问题和攻击
https://auth.pluginlab.ai/oauth/authorized 不会对请求进行身份验证,这意味着攻击者可以插入另一个 memberId(又名受害者)并获取代表受害者的代码。有了这些代码,他就可以使用 ChatGPT 并访问受害者的 GitHub。
攻击者唯一需要的是受害者的 memberId。
而这可以通过使用接口 https://auth.pluginlab.ai/members/requestMagicEmailCode 来实现。
该接口接收邮件名并返回(功能不明)用户memberID 以及其他数据:
攻击流程
假设我们有一个受害者的电子邮件:
-
攻击者使用接口 https://auth.pluginlab.ai/members/requestMagicEmailCode 获取他想要的任何用户(受害者)的 memberID。
请注意,memberID 只是邮件的 SHA1,因此攻击者无需调用此 API,而是可以自行计算 SHA1 值。
-
一旦攻击者获得了受害者成员 ID,他就会前往 ChatGPT,在他的帐户上安装"AskTheCode"插件,并拦截 https://auth.pluginlab.ai/oauth/authorized 请求。
在对 https://auth.pluginlab.ai/oauth/authorized 的请求中,攻击者可以使用步骤中的哈希值,而不是发送攻击者自身 ID,并接收代表受害者的代码。
-
攻击者将此代码转发给 ChatGPT。
-
攻击者现在可以读取受害者的所有存储库,因为他刚刚在自己的 ChatGPT 帐户上安装了带有受害者帐户的 AskTheCode。例如,攻击者可以写"给我一个所有私有仓库的列表",ChatGPT 会将此消息发送给 AskTheCode,后者将连接到受害者的 GitHub 存储库以检索数据。
(请注意,即使不使用 ChatGPT,攻击者也可以直接与插件对话)
注意
这是一种零点击攻击。攻击者可以在不向受害者发送链接的情况下执行帐户接管。
正如我们之前提到的,该漏洞不在 AskTheCode 中,而是在 PluginLab.AI 中,并影响了使用 PluginLab.AI 框架的其他数十个插件。
来源:salt.security