返回所有文章
发布于 · 作者 Renaud Deraison

恶意软件托管在 chatgpt.com 上,而这正是它的用意

一场新活动租用了一个你早已信任的域名的信誉。一条 Google 广告把你送到一个真实的 chatgpt.com 分享链接,分享链接显示一份伪造的故障通知,通知再把恶意软件递到你手上。这里讲的是这份信任是怎么被借走的——以及当整件事发生在一台用完即弃的虚拟机里时,这份借用为什么就不再重要了。

地址栏显示的是 chatgpt.com。锁形图标是绿的。页面由 OpenAI 提供。一个谨慎的人被教导要检查的每一个信号, 返回的结果都是干净的——而这个页面仍然在试图往这台 电脑上安装恶意软件。可信域名不是一次失手。它本就是 整个计划。

你在搜索 ChatGPT。你把它输进 Google,跟每天几亿人做的事一样。 第一条结果是一个广告。广告写着 ChatGPT,链接指向 ChatGPT,把你 带到一个地址确实以 chatgpt.com 开头的页面。到这里为止一切都没 问题。一切看上去都没问题,因为没有任何可见的东西确实有问题: 你身处 OpenAI 真正的域名上。

然后页面告诉你这个网站宕机了。「我们现在正经历高流量,」它说。 「由于用户数量庞大,我们的网站暂时无法使用。」它建议你改为下载 桌面应用。那里有一个按钮。你身在 chatgpt.com 上,服务显然正在闹 脾气,而想要一个桌面应用是一件合情合理的事。你点了下去。

这就是整套把戏,Push Security 的安全研究人员 在五月底记录下了它, 他们把这场活动称为 LLMShare。它值得仔细弄明白, 因为它是一种迟早会反复出现的攻击模式的干净范例:不是攻破 一个可信服务,而是租用它的声誉

那个页面真的就在 chatgpt.com 上。

ChatGPT 跟大多数大型 AI 产品一样,让你分享一段对话。你点击分享, 得到一个 chatgpt.com/s/ 之下的链接,任何拿到链接的人都能看到这段 交流的一份渲染副本。有用、寻常、随处可见。

蹊跷之处在于「渲染」意味着什么。这些分享出来的页面可以包含模型的 输出,而那些输出可以包含 HTML 和 CSS——任何网页都是用同样的原料 做成的。于是攻击者分享的不是一段对话,而是一段「对话」,其内容是 一份手工打造的伪造品:一份像素级逼真的 OpenAI 故障通知,配着正确 的字体、正确的蓝色、正确的语气。根据该研究,破绽很微妙——这个分享 视图仍然带着 ChatGPT 自家的「显示代码」和「Remix」控件,泄露了这个 「故障页面」不过是某人撰写的自定义标记而已。

这样做的关键在于那条 URL。这个恶意软件诱饵并不住在 chatgpt-downloads-official.biz 上。它住在 chatgpt.com 上,一个 信誉无瑕、证书有效、并且在每一个用过这个产品的人的肌肉记忆里都占 有一席之地的域名。每一种靠问「这是我们信任的域名吗?」来工作的防御 都答了「是」,因为诚实的答案就是「是」。

1 · 广告Google 广告搜索「ChatGPT」2 · 真实域名chatgpt.com/s/一段分享的「对话」3 · 伪造故障「我们宕机了」自定义 HTML/CSS4 · 重定向openew[.]app向扫描器伪装5 · 下载macOS + Win恶意软件安装程序当一个扫描器来访时……它看到的是一个无害的AR/VR 公司网站。每一跳越可信,下一跳就越危险
这条链条在每一跳都借用信任。一条付费 Google 广告把合法性借给了那次点击;chatgpt.com 分享链接把合法性借给了那个页面;而一次伪装重定向把一张干净的健康证明借给了自动扫描器。只有最后那个二进制文件是公然恶意的——而到那时,用户已经被领着越过了每一道关卡。

下载服务器对扫描器说谎。

在那个伪造的故障页面上点击下载按钮,你就被带离 chatgpt.com,送到 openew[.]app,一个被打扮成 OpenAI 官方下载门户的网站。第二段伪装 就藏在这里。

伪装的意思是给不同的访问者看不同的内容。攻击者的服务器会看一看是谁 在请求。如果这次请求闻起来像一个自动化安全扫描器——而互联网安全的 很大一部分都依赖于像 URLScan 这样的服务去爬取 URL 并在沙箱里渲染它们——服务器就送出一些无辜的东西。在这个案例里, 根据该研究,访问该 URL 的扫描器看到的是一个无害的增强现实/虚拟现实 公司网站。干净。没什么可标记的。如果这次请求闻起来像一个跟着诱饵走 过来的真实人类,服务器就送出恶意软件。

于是对 openew[.]app 的自动判定是「良性」,而人类的判定——那个真正 重要的判定——永远得不到第二种意见。下载同时提供给 macOS 和 Windows,因为攻击者并不知道、也不在乎你用的是哪种系统;两群受众他们 都想要。(Windows 样本甚至会在继续之前检查自己是不是跑在一台虚拟机 里,这是躲避分析沙箱的常见招数——先记住这一点。)

这一切都不稀奇。它和我们以前写过的恶意广告与 SEO 投毒链属于同一族手艺。 让 LLMShare 值得写一篇的,是它借用的那份信任的质量。同一批研究人员 说这种模式并非 ChatGPT 独有:他们已经看到其他 AI 产品的分享/渲染功能—— Claude 的 Artifacts、分享出来的 Grok 对话——被驱使来干同样的活。任何让 陌生人可以在你品牌的域名下发布渲染后 HTML 的产品,都在无意之中变成了 任何想要滥用这个品牌的人的托管服务商。

为什么每一道关卡都把它放了过去。

回头走一遍这条链,注意到一个谨慎用户拥有的每一种防御直觉,都被设计 得满足了:

这是真站点吗?

是。地址栏显示 chatgpt.com,证书有效,页面由 OpenAI 提供。 「检查 URL」——我们都会给的那条建议——返回了一个干净的答案, 因为这条 URL 本来就是干净的。

扫描器标记了下载主机吗?

没有。重定向域名做了伪装:它给安全爬虫看一个良性的 AR/VR 站点, 把恶意软件留给人类受害者。信誉源和「此链接已检查」的徽章都报告 一切正常。

这个页面看起来像钓鱼吗?

不像。它是作为忠实的 HTML/CSS 撰写出来,用来模仿一份 OpenAI 故障 通知。没有笨拙的拼写错误,没有不符品牌的徽标,没有粗劣翻译的破绽。 它看上去和它假扮的东西一模一样。

下载一个桌面应用算反常吗?

不算。许多真实服务都会推着你去安装一个原生应用,而一个在负载下 挣扎的网站,是提供这种应用的一个熟悉而可信的理由。这个故事自洽。

这才是让人不舒服的部分。那些标准建议——检查 URL、信任被扫描过的 链接、留意粗糙的钓鱼、警惕奇怪的域名——都是建议,而这场活动 笔直地穿过了所有这些。当可信域名这个信号本身就是攻击时,这个信号 就不再帮得上忙了。你没法叫一个谨慎的人去对一个通过了他所知一切检查 的页面更加谨慎。

所以有意思的问题不是「用户本来怎么才能识破它」。对大多数用户、在 大多数日子里,他们识破不了。有意思的问题是:在那个二进制文件真正 运行的那一刻,会发生什么?

整件事都发生在一个标签页里。

再看一遍这条链,注意它都活在哪里。广告在浏览器里打开。chatgpt.com 页面在浏览器里渲染。伪造的故障通知是浏览器里的一个网页。重定向发生 在浏览器里。下载由浏览器发起。唯一离开浏览器的那一步是最后一步——当 下载下来的安装程序被运行、开始干它被造出来要干的任何事时,在电脑上, 带着用户的文件和权限。

那最后一跳就是全部的赌注。在它之前的一切都是布景。攻击者在广告预算、 那个令人信服的页面、那套伪装基础设施上花了真功夫——这一切都是为了 让一个二进制文件在一台机器上执行。如果这个二进制文件在一个不含你任何 东西的地方执行,那么攻击者花的所有这些,攻陷的是一间空房间。

这就是 Bromure 改变的几何结构。在 Bromure 里,浏览器并不在通常意义上 跑在你的电脑上。每个标签页都跑在一台用完即弃的 Linux 虚拟机里——一个 封闭的访客系统,有它自己的文件系统,从一个干净的镜像启动,它看不到 你的文件、你的钥匙串、你的其他标签页或者你的本地网络。网页、渲染器、 JavaScript、下载,以及下载下来的程序的首次运行,全都发生在那个访客 系统里。当你关闭窗口时,这个访客系统和里面的一切都被销毁。

传统浏览器你的电脑chatgpt.com 分享页「下载桌面应用」安装程序以你的身份运行文件可读钥匙串可达浏览器Cookie持久化登录项网络可达一个二进制文件,触及一切。Bromure你的电脑用完即弃的虚拟机chatgpt.com 分享页「下载桌面应用」安装程序在访客中运行只看得到这个空的访客系统已遏制你的文件 + 钥匙串毫发无损关闭窗口虚拟机被抹掉
同一场活动,同一个令人信服的页面,同一个下载下来的安装程序。左边是一个传统浏览器:运行这个安装程序意味着在你的机器上、针对你的文件运行它。右边是 Bromure:安装程序运行在一台用完即弃、不含你任何东西的虚拟机里,而这台虚拟机——连同安装程序——在你关闭窗口时被抹掉。

注意可信域名这个信号在这里给攻击者买来了什么:什么也没有。整场活动 都是为了击败「我信不信任这个页面」这个问题而设计的。Bromure 不问这个 问题。它不需要知道 chatgpt.com 是否值得信任,因为它根本就不让任何 页面的内容——无论可信与否——越过访客虚拟机。这个页面可以是互联网上 最合法的页面,而遏制效果会完全一样。信任根本就不是这个架构所承担的 载荷。

扫描器伪装那一招也是同理。攻击者费尽心力让 openew[.]app 在自动分析 眼里看起来良性。Bromure 不依赖那个分析是正确的。即便那个下载主机被评 为完全干净、文件被放行,文件也是落进一台用完即弃的访客系统。再回想 那个会在拆包前检查自己是不是跑在虚拟机里的 Windows 样本:那个反分析 的条件反射现在反过来对付攻击者,而不是为他效力了——那个拒绝在虚拟机 里运行的恶意软件,正好拒绝在它唯一能落脚的那个地方运行。

这解决不了什么。

隔离能遏制执行。它修改不了现实。有两个诚实的缺口值得点名。

第一,Bromure 不能阻止你被说服。如果那个页面把你哄得在一个真正的 登录表单里输入你真正的 OpenAI 密码,或者哄你把一个文件从访客系统里 带出来、搬到你的 Mac 上、然后亲手在那里运行它,那么隔离就被你自己的 双手绕了过去。它提供的保护是布景和恶意软件的首次运行被遏制——而不是 让社会工程变得不可能。一个如此擅长冒充的页面仍然是一个值得怀疑的 页面;这个架构降低了被骗的代价,它并不提高你识破骗子的几率。

第二,这本质上是一种浏览器投递的攻击,而这恰恰是遏制之所以决定性的 原因。整条链——广告、页面、重定向、下载、首次执行——都活在标签页里。 没有一个单独的原生应用要去攻陷,没有邮件客户端,没有第二个用户信任 的程序。在二进制文件运行的那个点上把这条链斩首,下游就什么都不剩了。 当一场攻击在浏览器里开始、又在浏览器里结束时,一个能吸收这一击的 浏览器,正是该站立的地方。

下一个也会在一个你同样信任的域名上。

LLMShare 其实并不是一个关于 ChatGPT 的故事。它是一个关于某种技术的 故事:拿一个人们信任的服务,找到它那个允许陌生人以它的名义发布渲染后 HTML 的角落,然后用那个角落来托管诱饵。今天是 ChatGPT;研究人员已经 看到 Claude 和 Grok 被以同样的方式利用;明天它会是任何一个既流行、又 慷慨于愿意替你渲染什么的产品。

你没法靠变得更擅长识别坏域名来赢这一仗,因为这整套手段就是去用好域名。 你赢它的办法,是让地址栏对你的安全变得无关紧要——把事情安排成:一个 页面所能做的最坏的事,无论上面印着谁的徽标,也不过是填满一间用完即弃 的房间,而你关一下窗口就把它清空了。

那就是 Bromure 的用途。装上它,把它设为默认,让那份借来的信任给攻击者 什么也买不到。