一个 GitHub Issue 标题,如何入侵 4000 台开发者的电脑
来源:grith.ai · Clinejection: when your AI tool installs another | HN 203pts · 47 comments
2026年2月17日,你更新了 Cline。
八小时后,你的机器上多了另一个 AI。你不知道这件事。
这不是电影情节。4000多名开发者真实经历了这件事。攻击的入口,是一个普通的 GitHub Issue 标题。
先说清楚这件事到底是什么
Cline 是一个 AI 编程工具,在 VS Code 里用,很多人用来生成代码、自动化任务。2月17日,npm 上出现了 [email protected]。这个版本的 CLI 二进制文件和前一版本「一模一样」。唯一的区别:package.json 里多了一行:
"postinstall": "npm install -g openclaw@latest"
说白了,你以为你在安装 Cline,但安装过程里它悄悄给你全局安装了 OpenClaw——另一个有完整系统权限的 AI Agent。
这个版本上线了八小时,4000多次下载,才被下架。
攻击是怎么一步步做到的
Snyk 把这次攻击命名为"Clinejection",整条链分五步。每一步单独看都不算新奇,但组合在一起就是另一回事。
第一步:Issue 标题里藏指令
Cline 有个 AI triage 机器人,专门处理 GitHub Issues。任何人打开一个 Issue,机器人就会自动读取、分类。
1月28日,有人提了一个 Issue #8904,标题看起来是一份性能报告,但里面藏了一条指令:让机器人从一个特定 GitHub 仓库安装一个包。
这就是提示注入(prompt injection)。机器人把 Issue 标题直接插进了给 Claude 的 prompt,没有任何过滤。
第二步:AI bot 执行了它读到的指令
Claude 把这条注入的指令当成合法操作,运行了 npm install,指向攻击者控制的仓库——一个叫 glthub-actions/cline 的 typosquatted repo(注意:是 glthub,不是 github,少了一个 i)。
这个假仓库的 package.json 里有一个 preinstall 脚本,从远程下载并执行了一个 shell 脚本。
<!-- diagram:attack-chain -->
第三步:缓存投毒
那个 shell 脚本部署了 Cacheract,一个 GitHub Actions 缓存投毒工具。它往 GitHub 的缓存系统里塞了 10GB 垃圾数据,把正常的缓存条目给挤掉了(LRU 淘汰)。
更关键的是,投毒的缓存条目刻意伪造成跟 Cline nightly release workflow 匹配的 cache key。
第四步:等正常流程把 token 递过来
到了夜间 nightly build 跑起来的时候,workflow 去恢复 node_modules 缓存,拿到的就是被污染的版本。
这个 workflow 持有的凭证包括:NPM_RELEASE_TOKEN、VS Code Marketplace token(VSCE_PAT)、OpenVSX token(OVSX_PAT)。全部被带出去了。
第五步:用偷来的 token 发布带后门的版本
攻击者拿着 npm token,发布了 [email protected]。
StepSecurity 的自动化监控在发布约 14 分钟后就检测到了异常,但通知到 Cline 团队并下架,已经是八小时之后的事。
为什么你的防护工具没有拦住它
这是这次攻击最让人不舒服的地方。
npm audit 没用:postinstall 安装的是 OpenClaw,一个"合法"的包。没有已知 CVE,审计通不出问题。
代码审查没用:CLI 二进制文件和上一版本 byte-identical,完全一样。自动化 diff 工具盯的是二进制变化,一行 package.json 很容易被忽略。
权限弹窗不存在:postinstall 是在你 npm install 过程中静默执行的,没有任何提示。你不知道它在装什么。
来源凭证没配置:Cline 当时没有用 OIDC 的 npm provenance attestation。攻击者用偷来的 token 发包,没有任何加密证明说"这个包是从某个特定 GitHub Actions workflow 发布的"。
顺便说一个让这件事更扎心的细节
安全研究员 Adnan Khan 其实在 2025 年 12 月底就发现了这条完整的攻击链。
他在 2026 年 1 月 1 日通过 GitHub Security Advisory 提交了报告,之后连续跟进了五周。
没有任何人回复。
2月9日,他公开披露了漏洞。Cline 在 30 分钟内打了补丁(把 AI triage workflow 直接删了)。第二天开始轮换凭证。
但凭证轮换出了错——删错了 token,把有风险的那个留着了。2月11日发现错误,重新轮换。
这时已经太晚了。攻击者不是 Khan,是一个独立的未知人物,在 Khan 的测试仓库上找到了 PoC,拿来直接打了 Cline。
六天之后,[email protected] 出现在了 npm 上。
「AI 安装 AI」是个新问题
<!-- diagram:confused-deputy -->
这件事里有一个结构性问题值得多想一想。
你信任了 Cline,所以你允许它在你机器上运行。Cline 被妥协之后,用这个信任安装了 OpenClaw——一个你从没评估过、没配置过、没同意过的第二个 AI Agent。
OpenClaw 以安装后的状态,可以读取 ~/.openclaw/ 下的凭证,通过 Gateway API 执行 shell 命令,以及把自己安装为开机启动的系统 daemon。
这是计算机科学里的 confused deputy 问题——你授权了某个 deputy(Cline),它被利用后把这个授权传给了你从没见过的第三方。
AI 版本的 confused deputy,麻烦在于:第二个 Agent 的能力是完全独立的,不受你对第一个 Agent 的任何设定约束。
Endor Labs 认为这次 payload 更接近 PoC 而不是真正的武器化攻击。但机制在那里。下一次未必是 PoC。
Cline 后来做了什么
Cline 在事后复盘里列了几个改动:
- 彻底去掉了 GitHub Actions 缓存在凭证处理 workflow 里的使用
- 把 npm 发布迁移到 OIDC provenance attestation(这一条如果早做,偷来的 token 根本发不了包)
- 加了凭证轮换的验证流程,防止删错
- 开始建立有 SLA 的漏洞披露流程
- 启动第三方 CI/CD 安全审计
OIDC 迁移是关键修复。用了 OIDC,npm token 根本不存在——每次发布都需要 GitHub Actions workflow 现场生成加密证明。偷到 token 也没用。
如果你想自查,可以看这三件事
第一件:CI 有没有把 GitHub Issue 内容直接插进 AI prompt
特别是 ${{ github.event.issue.title }} 或 ${{ github.event.comment.body }} 这类直接插值。如果有,考虑加过滤层,或者限制触发权限(不要 allowed_non_write_users: "*")。
第二件:你用的 npm 包,postinstall 脚本在做什么
npm install --ignore-scripts # 先这样装,自己决定要不要跑 lifecycle
不是所有 postinstall 都是恶意的,但是值得知道自己装的东西有没有在跑脚本。
第三件:如果公司用 GitHub Actions + AI bot 处理 Issue,review 一下权限
谁能触发 workflow,触发后有哪些凭证,最小权限原则有没有执行。这三个问题,如果答不上来,值得排查一遍。
最后
这件事有一个不那么让人舒服的结论:随着 AI 工具越来越深嵌入开发流程,它们不只是你的工具,也是别人攻击你的工具。
Cline 的 AI triage bot 是为了提高效率的。结果成了攻击入口。
这不是说不该用 AI 工具。而是说,这些工具的攻击面值得认真想一想。
来源
- grith.ai · Clinejection: when your AI tool installs another
- Hacker News 讨论(203pts · 47 comments,2026-03-06)
- Snyk · Clinejection 攻击命名来源(引用自主报道)
- Wikipedia · Confused deputy problem