![]()
2025年3月,安全研究员在npm包里发现了一种用隐形Unicode字符藏木马的攻击手法。当时没人想到,这种叫GlassWorm的恶意代码会在14个月后进化成开发者工具链的"通用感染器"——一个插件同时攻破VS Code、Cursor、Windsurf等6款编辑器。
Aikido安全团队在2026年4月的追踪报告中披露了完整攻击链。攻击者把恶意代码打包成code-wakatime-activity-tracker插件,上传到OpenVSX市场。这个冒牌货从界面到功能提示,和正版WakaTime几乎一模一样——同样的API密钥输入框,同样的状态栏图标,同样的命令菜单。
开发者装完插件的瞬间,感染就已经完成。
激活函数activate()被篡改成了触发器。本该启动WakaTime的代码,先一步加载了./bin/目录下的原生二进制文件——Windows叫win.node,macOS叫mac.node。这两个用Zig语言编译的模块,绕过了Node.js的标准沙箱保护,直接以系统级权限运行。
win.node是个PE32+格式的DLL,mac.node则是通用Mach-O二进制,同时兼容Intel和Apple Silicon。它们被设计成Node.js的原生扩展(Native Addon),一旦加载就拥有完整的操作系统访问能力。
6款编辑器一锅端:你的IDE清单就是攻击地图
GlassWorm的这次升级,核心变化在于"跨编辑器感染"。
原生二进制运行后的第一件事,是扫描整台机器上所有支持VS Code扩展格式的IDE。清单包括:VS Code本体、VS Code Insiders测试版、Cursor、Windsurf、VSCodium开源版,以及Positron。每发现一个目标,它就静默植入恶意扩展。
这意味着什么?一个同时在用Cursor和VS Code的开发者,装了一个冒牌WakaTime插件,两个开发环境会在毫无提示的情况下同时沦陷。没有弹窗,没有权限请求,状态栏一切正常。
攻击者甚至懒得为不同编辑器做适配——它们共享同一套扩展格式,恶意代码直接复用。
二进制文件随后连接攻击者控制的GitHub Releases页面,下载一个名为autoimport-2.7.9.vsix的安装包。这个名字刻意模仿了steoates.autoimport,一个拥有数百万用户的正版VS Code扩展。下载完成后,这个假autoimport被强制安装到所有检测到的IDE中。
OpenVSX:被忽视的"后门市场"
整个攻击的宿主平台OpenVSX,是Eclipse基金会运营的开源扩展市场。它被设计为微软VS Code官方市场的替代品,尤其受VSCodium等完全开源发行版的用户欢迎。
但安全投入和官方市场完全不在一个量级。
攻击者注册specstudio账号,上传冒牌插件,通过了平台的基础审核。code-wakatime-activity-tracker在OpenVSX上存活了足够长的时间,长到能被开发者搜索、安装、推荐。Aikido团队发现它时,下载量已经积累到一定规模——具体数字未公开,但"steady growth"的描述暗示这不是一次小范围测试。
GlassWorm的运营者显然研究过开发者心理。WakaTime是个记录编码时间的生产力工具,用户群体明确、付费意愿强、对状态栏图标有肌肉记忆。克隆它的界面,比做一个陌生的"效率神器"更容易获得信任。
这种"品牌寄生"策略在供应链攻击里越来越常见。2024年的XZ Utils后门事件已经证明,开发者工具链的信任假设一旦被击穿,下游的防护层层层失效。
从npm到Chrome再到IDE:GlassWorm的14个月进化史
回到2025年3月的首次发现。当时的GlassWorm把恶意代码藏在Unicode的"零宽字符"里——这种字符在大多数编辑器里不可见,但JavaScript解析器会正常执行。攻击者把这种"隐形载荷"嵌入合法的npm包,上传后等待开发者安装。
这种手法的缺陷很明显:需要受害者手动安装特定版本的依赖包,传播效率受限。
GlassWorm的应对策略是"平台跳跃"。2025年下半年,攻击者开始瞄准浏览器扩展市场。他们发布了一个伪造的Chrome扩展,功能描述是"开发者工具",实际行为是部署持久化的远程访问木马(RAT)。这个版本能记录键盘输入、窃取会话Cookie,比npm包的权限高出一个数量级。
但浏览器扩展仍有边界——它碰不到开发者的本地代码仓库,也碰不到IDE里的API密钥。
2026年的OpenVSX攻击是第三代。IDE扩展的权限模型介于浏览器和原生应用之间:它能读写文件系统、执行终端命令、访问网络,同时又被开发者视为"工作流的一部分"而降低警惕。GlassWorm用原生二进制突破沙箱后,实际上获得了一个常驻的、跨编辑器的后门。
Aikido的分析师在报告中提到,这种"编辑器全家桶"感染策略在公开情报中"relatively novel"——相对新颖。换句话说,这不是某个已知攻击框架的复用,而是针对现代开发工作流的专门设计。
Zig编译器:攻击者的新玩具
技术细节里有个值得玩味的点:攻击者选择了Zig作为编译工具。
Zig是一门新兴的系统编程语言,以交叉编译能力和C语言互操作性著称。用Zig写一个代码库,可以同时输出Windows、macOS、Linux的原生二进制,且不需要目标平台的SDK。这对需要支持多平台的恶意软件开发者来说,开发效率提升显著。
更隐蔽的是,Zig编译的产物在静态分析工具中的识别度较低。相比用Visual Studio或Xcode编译的常规二进制,win.node和mac.node的元数据特征不那么"标准",可能绕过一些基于签名的检测规则。
攻击者甚至不需要为不同架构维护两套代码。mac.node被编译成通用二进制(Universal Binary),同一份文件在Intel Mac和Apple Silicon Mac上都能直接运行。这种"一次编写,到处感染"的便利性,和JavaScript生态的跨平台承诺形成了讽刺的呼应。
供应链攻击的进化方向,越来越像正经软件工程。
GlassWorm的运营者不是在写脚本小子级别的恶作剧,而是在用现代开发工具链的方法论,系统性地扩大攻击面。从npm到Chrome Web Store再到OpenVSX,每次平台跳跃都伴随着技术栈的升级——零宽字符、持久化RAT、Zig原生二进制、跨IDE感染。
这种迭代速度本身,就是最值得警惕的信号。
截至Aikido报告发布时,code-wakatime-activity-tracker已被从OpenVSX下架,GitHub Releases上的恶意.vsix文件也被清理。但GlassWorm的基础设施——控制域名、账号体系、代码模板——显然还在运转。下一次它会出现在哪个市场?PyPI?Docker Hub?还是某个AI编程助手的插件商店?
当你的Cursor和Windsurf同时提示"扩展已更新"时,你会检查那个更新来自哪个市场吗?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.