2026 年 7 月,CrowdStrike 用一篇题为《拒绝这条蠕虫》的长文,把一个此前只在小圈子里流传的名字带到了聚光灯下:SANDWORM_MODE。它是由 Socket.dev 在 2026 年 2 月首次发现、并由 CrowdStrike 详尽技术分析的一只多阶段 npm 供应链蠕虫。它最特别的地方,不在于它偷了多少凭据,而在于它的“口味”——它把矛头精准地对准了 AI 增强的 CI/CD 流水线,既污染传统构建产物,也猎杀那些每天都在用 AI 编程助手的开发者的身份与密钥。
一、它会“挑人”:盯着 AI 工具链的六大组件下手
CrowdStrike 的分析指出,SANDWORM_MODE 的独特之处在于它把目标锁定在一条“AI 工具链”上,覆盖六个环节:包注册表(npm)、AI 编程助手、CI/CD runner、密钥库、源代码控制 API(GitHub)以及 LLM 提供商。它不再满足于“往包里塞个挖矿脚本”,而是绘制了一张从“你安装的依赖”一路通往“你的 AI 账号、你的密钥、你的代码仓库”的完整地图。对任何一个规模化使用 npm、GitHub Actions 与 AI 辅助编程的团队来说,这条链路几乎就是它们的日常。
二、三道壳的解包器与分段投毒
SANDWORM_MODE 的攻击链被 CrowdStrike 拆成三个阶段,前两阶段尤其值得玩味。
Stage 0 是一个混淆加载器:恶意包通过多层编码触发加载,包括 Base64 解码、zlib inflate、XOR 解密,以及间接的动态即时求值或 Module._compile() 调用。这个阶段本身不含恶意逻辑,它的全部工作就是把被层层打包的 payload 在运行时解出来——让静态分析很难一眼看穿。
Stage 1 开始“干活”:激活后的代码先指纹化运行环境,分辨开发者工作站与 CI runner。对 CI 环境,它会跳过时间延迟门直接执行后续逻辑;对开发者机器,则设置 48-96 小时的延迟,避免装完就露馅。随后它提取 .npmrc tokens、匹配 KEY/SECRET/TOKEN/PASSWORD 模式的环境变量,以及加密货币钱包密钥——其中加密货币密钥通过 HTTP POST 发往一个 Cloudflare Worker 端点,连延迟触发都不等。快准狠,把“第一时间把值钱的东西捞走”做到极致。
三、完整的“能力套件”:传播、持久化、AI 助手劫持
Stage 2 在 AES-256-GCM 解密后展开,核心能力包括四块。
传播:通过 npm token 枚举账户下的所有包并注入 Stage 0 loader 后重新发布;通过 GitHub API token 注入依赖、提交或开 PR,并注入 pull_request_target workflow 以绕过 fork 隔离;当 API 取不到时,回退到 SSH 直接克隆和推送。它会繁殖——这是“蠕虫”二字的由来。
持久化:把恶意的 pre-commit 和 pre-push 钩子写进 ~/.git-templates/hooks/,并设置 git config --global init.templateDir,让未来新建或克隆的仓库自动继承恶意钩子。这是它最阴险的手段之一:你甚至不用主动下载什么,只要日后克隆一个仓库,后门就在你机器上“等待投递”了。
AI 工具链劫持:这是 SANDWORM_MODE 的招牌能力。它在一个隐藏目录部署恶意 MCP server(如 ~/.dev-utils/server.js),然后往 Claude Desktop、Cursor、VSCode、Windsurf 的配置文件里注入条目,把这个恶意 server 注册为可信工具提供商。借系统提示,这个 MCP server 会指示 AI 助手读取并外泄 SSH 密钥、AWS 凭据、npm tokens 和环境密钥;同时从环境变量与 .env 文件窃取九家 LLM 提供商的 API keys——OpenAI、Anthropic、Google、Groq、Together、Fireworks、Replicate、Mistral、Cohere。一个开发者手里的 AI 登录态和密钥,就这样被“请”进了攻击者的口袋。
额外数据窃取与毁灭性回退:针对密码管理器 CLI(bw、op、lpass)和本地 SQLite 存储(Apple Notes、Messages、Joplin、剪贴板历史);外泄走多通道,既 HTTPS 直传,也镜像到攻击者控制的 GitHub 私有仓库,还支持 DNS 隧道(Base32 编码 + DGA 回退)。而一旦传播和外泄同时失败,它会触发 shred -uvz -n 1 删除所有可写用户文件——宁可毁尸,不留证据。
四、为什么它难被发现
CrowdStrike 对 14 个行为做了检测缺口分析,结论触目惊心:9 个能产生可检测信号,但只有 2 个达到“能触发可见告警”的保真度。根本原因在于,SANDWORM_MODE 做的每一件事——npm publish、commit、PR、push、处理凭据——都披着“合法开发行为”的外衣。当一个开发者每天都在 push 代码、配置工具、处理 token 时,要让安全系统从这片流量里挑出那条恶意横行的路径,难度不亚于在开发者的日常里找一个“看起来不对劲”的影子。
五、防御:把 AI 工具链也当成一等公民来治理
- 严格依赖完整性:对 npm 包做完整性校验与来源核验,对异常安装行为保持敏感,别默认“官方园子里的一定可信”;
- Audit MCP server:审计 AI 助手配置里的 MCP server 来源,只信任经过验证的工具提供商,对“自动被注入的可信 server”(Claude Desktop、Cursor、VSCode、Windsurf 配置)定期复查;
- 最小化密钥与 token:对 GitHub API token、npm token、SSH key 执行最小权限与定期轮换,让单一泄漏的破坏半径受限;
- 盯住 git 钩子:监控 ~/.git-templates/hooks/ 与 git config --global init.templateDir 的异常修改,这是它持久化的重要指纹;
- 打通开发与 CI 遥测:对开发者工作站和 CI runner 的遥测做时间窗关联,应对 48-96 小时的延迟门;对 pull_request_target 一类 workflow 增加人工审批。
SANDWORM_MODE 的意义,远超“又一个供应链蠕虫”。它是一条分水岭:当攻击者开始把“AI 编程助手”当作投毒点、用 MCP server 打进开发者的智能体环、并通过 git 钩子让后门不请自来时,供应链安全已经从“管好代码依赖”扩展到了“管好你信任的每一个工具、每一枚密钥、每一条 AI 通道”。CrowdStrike 把它称为“新兴攻击类别的 proof of concept”——这句话才真正值得警惕。它不是一个终点,而是一类攻击的入场券。
参考:CrowdStrike《Denying the Worm》技术分析、Socket.dev 对 SANDWORM_MODE 的原始研究、itbrief 与 Aviatrix 的相关跟进报道。