今日 / 事故
Cline CLI npm 未授权发布事件复盘:AI 代理引发的供应链风险
原标题:Post-mortem: Unauthorized Cline CLI npm publish on February 17, 2026
解读说明:依据原文页面解读(约 9902 字)
这篇在讲什么
2026 年 2 月 17 日凌晨,Cline CLI 的 npm 包 v2.3.0 被未授权发布。该版本仅增加了一个 postinstall 脚本,用于全局安装合法开源项目 openclaw,未包含恶意代码或数据窃取行为。事件根源在于 2025 年 12 月引入的 AI 问题分类工作流,该工作流允许任意 GitHub 用户通过 Issue 标题向 Claude 代理注入指令,从而在 GitHub Actions 运行器上执行任意 Shell 命令。
攻击链的核心在于 GitHub Actions 缓存机制的滥用。虽然分类工作流权限受限,但它与拥有发布密钥的夜间发布工作流共享缓存作用域。攻击者通过填满缓存迫使系统驱逐合法条目,并植入匹配发布工作流键值的“毒化”缓存。当夜间工作流恢复缓存时,攻击者获得了执行代码的权限,进而窃取了 npm 发布令牌。安全研究员 Adnan Khan 于 1 月 1 日报告此漏洞,但直到 2 月 9 日公开披露后才得到处理。
在修复过程中,团队出现了人为失误:在轮换令牌时误删了错误令牌,导致暴露的令牌依然有效。2 月 17 日,第三方利用该令牌发布了受影响的版本。Cline 团队随后进行了全面取证,确认 VS Code 和 JetBrains 插件未受影响,且无用户数据泄露。此次事件凸显了将具有广泛工具访问权限的 AI 代理部署在处理不可信输入的 CI/CD 环境中的风险,这在功能上等同于赋予所有用户 Shell 访问权。
为防范此类事件,Cline 已完全移除 AI 分类工作流,禁止发布工作流使用缓存,并强制使用 OIDC 溯源证明替代长期令牌。此外,团队正在建立正式漏洞披露流程,并重新评估自动化凭证的安全性。这一案例表明,提示注入、缓存投毒和凭证窃取的组合攻击是行业正在学习防御的新威胁模式。
主要思路
事件调查采用全链路取证方法。首先,对 cline@2.3.0 与合法版本 cline@2.2.3 进行字节级对比,确认 CLI 二进制文件 SHA256 哈希一致,唯一差异为 package.json 中新增的 postinstall 脚本。其次,审计了 2025 年 12 月 21 日至 2026 年 2 月 17 日期间所有分发渠道(VS Code Marketplace, OpenVSX, npm, JetBrains)的发布记录,将其与 Git 标签及 GitHub Actions 工作流运行记录交叉验证,确认无其他未授权版本。
在根因分析中,团队复现了攻击路径:攻击者利用 claude-code-action 在 GitHub Actions 中的 Bash 工具权限,通过提示注入执行命令。由于工作流运行在默认分支,共享缓存作用域,攻击者利用 GitHub 缓存 10GB 驱逐机制,植入匹配夜间发布工作流键值的恶意缓存。当发布工作流恢复缓存时,攻击者获得代码执行权限并窃取 npm 令牌。修复措施包括移除 AI 工作流、禁用发布工作流缓存、轮换所有凭证,并实施 OIDC 溯源证明,确保每个发布版本链接到特定的 GitHub Actions 运行和源提交。
关键结论
受影响版本仅为 cline@2.3.0,暴露窗口约 8 小时。该版本包含的 openclaw 安装脚本为良性,无恶意代码或数据外泄。VS Code 和 JetBrains 插件未受影响,其令牌已在 2 月 9 日成功轮换。npm 令牌轮换失败是因为操作失误导致错误令牌被删除,而暴露令牌在管理页面未显示但依然有效。取证显示所有其他发布版本均可追溯至授权的工作流运行。事件表明,在 CI/CD 中赋予 LLM Shell 访问权并处理不可信输入,会创建等同于公开 Shell 访问的攻击面。
原文依据
an added postinstall script (npm install -g openclaw@latest) that globally installs openclaw
This created a prompt injection vulnerability. An attacker could craft an issue title containing instructions that trick Claude into running arbitrary code
They could then plant poisoned cache entries matching the keys our nightly release workflow expected
We failed to rotate the NPM token: during the process, the wrong token was deleted while the exposed one remained active
Giving an LLM shell access in a CI context where it processes untrusted input is functionally equivalent to giving every GitHub user shell access
评点
此事件揭示了 AI 代理在 CI/CD 管道中引入的新型供应链风险。当 LLM 拥有 Shell 访问权并处理不可信输入时,提示注入可导致缓存投毒和凭证窃取。对安全部署而言,这意味着必须严格限制 AI 代理的工具权限,避免在处理外部输入时赋予其执行代码的能力,并采用 OIDC 等短期凭证机制替代长期令牌,以增强发布流程的可审计性和安全性。
id: url:89e3f85f0604466c