您批准的恶意软件,因为您看不见它
GlassWorm 将载荷隐藏在不可见的 Unicode 中,从而通过人工代码审查,然后读取散落在您工作区里的凭证。一条隐形的蠕虫并不需要攻破加密。它需要的只是一个文件。
您的审查者读完了这个 pull request。每一行渲染出来都很干净:一次版本号递增、一个小的重构、一处文档微调。没有任何地方显得不对劲,因为出问题的部分从未被绘制到屏幕上。它写在不带字形的 Unicode 字符中。对您的眼睛不可见,对 diff 视图不可见,对供应链安全至今仍然依赖的人工签核同样不可见。
这就是 GlassWorm。自 10 月以来,Koi Security 的研究人员一直在追踪这条首个通过 VS Code 扩展传播的自我繁殖蠕虫,而且它并未停止 [1]。自 1 月底以来,Socket 在 Open VSX 市集上标记出七十多个新的恶意扩展 [2]。加载器藏身于不可见的 Unicode 之中,于是代码以日常维护的面目顺利通过审查。
它安装之后所做的事是最普通的部分,而这正是要点。它读取散落各处的东西。npm 令牌。GitHub 凭证。Git 配置。环境变量,以及敞开在您工作区中的 CI 密钥。然后它用这些窃取来的凭证以您的名义发布更多被投毒的包,蠕虫就是这样成为蠕虫的。命令与控制流量寄生于 Solana 交易之上,因此没有服务器可以被查封 [3]。
换个角度来看。没有人攻破了 @code。Open VSX 并非在传统意义上遭到入侵。扩展模型所做的正是它被设计来做的事:您安装一个助手,它就以您的权限运行,在您打开的项目内部,紧挨着您的密钥。这个模型是为这样一个世界而构建的——扩展作者是您唯一需要信任的一方。GlassWorm 把一个受信任作者的账户变成一辆送货卡车,并把货物藏在您看不见的字符里。工具没有失灵。威胁模型在所有人脚下同时移动了。
这就把问题落到您自己机器上一个令人不适的地方。当您信任的某个扩展打开您的项目时,那里有什么可供它取走?
对大多数开发者来说,答案是:全部。某个 dotfile 里一个长期有效的 npm 令牌。某个安装指南让您粘贴一次就可以忘掉的个人访问令牌。某个 env 文件中的密钥,机器上每个进程都能读取。这些凭证静态存放着,就在代码运行的确切位置,等待任何拥有本地访问权的东西。您编辑器里一条隐形的蠕虫不需要攻破加密。它需要一个文件。
Clavitor 从相反的假设出发。凭证在被需要的那一刻才被交付,作用范围仅限于它服务的那一件事,并且会过期。它绝不会被写入您的开发环境等待日后被发现。因此,当敌意代码在工作区中扫荡静态密钥时,那里没有常驻的 npm 令牌,没有永久的 GitHub PAT,没有任何东西的寿命能长过它被使用的那一秒。蠕虫拉开抽屉,抽屉是空的。
诚实地说出边界:正在使用中的凭证在其被使用期间仍然是活跃的。如果您的会话正在运行,而敌意代码共享了该会话,它就可以搭上那一刻活跃的东西,仍然在该凭证的短暂窗口和狭窄范围内。短命的、作用域受限的签发会缩小爆炸半径和时间窗口。它并不能让您已经交到攻击者手里的机器变得安全。没有任何东西能做到。但一个在使用中途截获单个受限凭证的攻击者,与一个复制了一整份永久密钥文件并就此掌控您一年的攻击者之间,有着巨大的差距。
我们整理了一份简短清单,列出凭证系统绝不该做的事。排在最前面的是:不要把密钥留在代码运行的地方。点此阅读
Clavitor(@clavitorai)是为 AI 智能体而建、同时也用于抵御它们的凭证保险库。clavitor.ai
来源
[1] Koi Security — "GlassWorm: The First Self-Propagating Worm Using Invisible Code Hits the Open VSX Marketplace"(研究机构;无经核实的 X 账号)
[2] Socket,经 @TheHackersNews — "GlassWorm Supply-Chain Attack Abuses 72 Open VSX Extensions to Target Developers"(@SocketSecurity)
[3] @SecurityWeek — "Supply Chain Attack Targets VS Code Extensions With ‘GlassWorm’ Malware"