乐于分享
好东西不私藏

揭秘供应链“隐形杀手”:一个AI插件如何差点搞垮全球最大前端平台?

揭秘供应链“隐形杀手”:一个AI插件如何差点搞垮全球最大前端平台?

昨天刷技术新闻,我正对着手里那杯凉透了的瑞幸发呆——冰块早化完了,杯壁上全是水珠,指尖摸上去滑腻腻的——突然看到 Vercel 的公告,差点没把咖啡喷在那台键盘已经打油的 ThinkPad X1 上。

他们被黑了。

不是被什么国家级黑客,不是什么零日漏洞。是一个 AI 插件。

我盯着屏幕愣了好一会儿。空调出风口吹出的热风带着一股积灰的味道,让人烦躁。说实话,这种新闻你看过第一反应是什么?我猜你跟我一样,下意识先想的是:我的谷歌账号都授权过哪些第三方应用?

……然后你不敢想了。因为太多了。

我有个习惯,焦虑的时候会反复刷新同一个页面。刷了三遍 Vercel 的公告后,我开始拼凑整件事的来龙去脉。

先别急着听我讲结论。 我们像剥洋葱一样一层一层来。

事情是这样的——Vercel 有个员工,在某个平常到记不清是周三还是周四的工作日,为了写周报效率高点,用公司的谷歌账号注册了一款叫 Context.ai 的 AI 办公插件。写文档用的,做 PPT 用的。很普通对吧?界面大概跟你用过的那些效率工具差不多,白色背景,圆角按钮,清爽得像一杯白开水。

注册的时候谷歌弹出授权页面,这哥们儿——或者姐们儿——点了“允许全部”。

其实吧,我们谁没点过?

用微信登录拼多多的时候点过,用谷歌登录 Notion 的时候点过。那个蓝色的“允许”按钮就像是数字生活的收费站,你不踩油门冲过去,后面就堵了一排车在按喇叭。谁有工夫一条一条看那些权限列表?

问题就出在这儿。

换个角度看, 你的谷歌账号不只是你的邮箱。它是你在整个公司内网的通行证,是你 Google Drive 里的设计稿,是你 Gmail 里的工资条,是你 Slack 里那些私下吐槽产品经理的聊天记录。

黑客没攻击 Vercel 的服务器。他们攻击了一个员工的浏览器插件供应商。就像你家的防盗门装了德国锁芯,结果小偷从物业那里拿到了备用钥匙。

你发现没?这条路绕得太聪明了。

我还没完全想清楚这件事最让我恐惧的是什么,但隐约觉得——不是技术本身,而是我们对技术的那种习以为常的信任。我们把权限点了,然后就把这件事忘了。插件安安静静地躺在浏览器右上角,像一只不叫的狗。

攻击链条是这样的。

第一环:Context.ai 公司里一个员工,电脑中了一种叫 Lumma Stealer 的木马。怎么中的?一个伪装成 Roblox 刷机脚本的钓鱼软件。

听到这儿我差点笑出来。一个游戏外挂,搞垮了一家估值几十亿的公司。

Lumma Stealer 这东西就像是数字世界里的蟊贼,悄悄翻你浏览器的口袋。Cookie、保存的密码、登录状态——统统拿走。黑客拿到了 Context.ai 的内部系统凭证。

第二环:黑客进了 Context.ai 的 AWS 环境,偷走了 OAuth 令牌。这个令牌是什么?你可以理解为——它是那位 Vercel 员工在不知情的情况下,签下的一份授权委托书。不是偷密码,是合法地拿着委托书,代替你行使权限。

于是那位 Vercel 员工的谷歌企业账号,被黑客完整接管了。

最让我后背发凉的是这里: 因为走的是 OAuth 授权的合法通道,双重验证没有触发,Passkey 没有触发,所有安全警报都在呼呼大睡。你花几千块买的 YubiKey 插在电脑上,像一块沉默的石头。

第三环:登录 Vercel 内部系统后,黑客发现很多环境变量没有被标记为“敏感”。API 密钥、Token、数据库密码……明晃晃地躺在那里,像是你把家门钥匙压在门口的脚垫下面,还贴心地留了一张便签:钥匙在这儿。

黑客打包了数据,在暗网上开价 200 万美元。

这里有一个我最初完全想错了的地方。

我一直以为供应链攻击的目标是代码——往某个开源库里注入恶意代码,等千万开发者无意识地 npm install,像病毒一样传播。这是教科书上的供应链攻击,是 2021 年的 log4j,是 2022 年的 colors.js 作者删库。

但这回不一样。这回攻击的是“人”这条供应链。

一个员工的便利之举。一次习惯性的“允许全部”。一个第三方团队里某人玩 Roblox 外挂的贪念。

链条上的每一环都脆弱得像冬天的枯树枝,咔嚓一声,就断了。

这可能有点异想天开,不过我在想——我们过去十年把所有安全预算都堆在服务器上,垒墙垒到三层楼那么高。结果敌人根本没翻墙,他跟着一个被邀请进门的客人,大大方方走进来了。

窗外有辆外卖电动车呼啸而过,美团的那种,黄色,声音很刺耳。我突然想起第一次用 MP3 听周杰伦的《七里香》,那时觉得数字化的一切都轻盈、干净、没有重量。

现在不一样了。

数字生活变得稠了,稠得像化不开的蜂蜜。每授权一个应用,你就多了一层牵连。每点击一次“允许”,你就把自己的影子留在了一个你永远不会再打开的后台页面上。空气里有种细微的焦虑——不是那种大喊大叫的焦虑,是那种安静到你自己都察觉不到的焦虑,像冰箱压缩机嗡嗡的低频声。

所以,我们能做什么?

我不是安全专家,没法给你一个九步防护指南。但有几件事,我看完这次事件的报告后,自己先做了。说给你听听。

给 AI 插件戴上紧箍咒。 这不是比喻。我是真的建了一张表——用 Notion 建的,就那个我也授权了谷歌登录的 Notion——把所有授权过的第三方应用列出来,一个一个删。那种感觉像在清理衣柜里三年前的旧衣服,有些应用我甚至不记得自己什么时候授权过。删了十几个之后,突然有一种奇怪的轻松感。

权限能少给就少给。 谷歌那个授权页面上,每一个选项都认真看一遍。只看一遍。你发现没?其实多数应用根本不需要读取你所有邮件,它只需要知道你是谁。就像快递员只需要你的门牌号,不需要你家的户型图。

环境变量全标敏感。 我知道这听起来像是废话。但真的,很多团队为了调试方便,随便起个变量名就丢进去了,不标记。下次代码审查的时候,看到环境变量,多问一句:这个加密了吗?标记敏感了吗?同事可能会觉得你啰嗦,但总比在暗网上看到自己公司的数据强。

我写到这里,低头看了一眼自己那台 ThinkPad 的屏幕。

指纹油污在深色背景上反光,一圈一圈的。突然觉得,我们这代人面对的数字风险,跟父辈那代完全不同了。我爸最担心的安全问题是出门忘锁门。我担心的是一年前随手授权的一个插件,在某个我没听说过的公司员工的电脑上,正被一个伪装成游戏外挂的木马,一帧一帧地截图。

说实话,我不知道哪种更让人无力。

但至少,锁门这件事,我知道该怎么做。