你的代码仓库,就是一把插在门上的钥匙。现在有人告诉你,GitHub 上有四千多把这样的钥匙被人摸走了,顺手连你家保险柜——云账号、AI 接口的密钥——都被翻了个底朝天。程序员圈最扎心的一句话出现了:代码没被人抄走,能调钱的钥匙先没了。这次不是漏洞攻击,是账号被盗后的滥用:门锁好好的,钥匙还在你兜里,开门的却是别人。


这次是怎么摸进门来的
11 月 10 日起,安全社区陆续曝光一起大规模账号盗窃:攻击者用四千八百多个偷来的 GitHub 账号,向六万一千多个仓库发出标题为「docs: dependency audit notes」的试探性拉取请求,分支名统一叫 wfx-docs。标题看着像例行文档更新,实则是机器人在替你同事的仓库挨家挨户试锁——账号是偷来的,仓库是放松警惕的,能推得动的就动手,推不动的就换下一家。
能写进去的仓库,被塞进一段约一千五百行的窃取脚本。Aikido 统计,脚本至少在 1806 个仓库里真实运行过并往外发数据;SafeDep 则数出 8093 个公开仓库收到恶意提交。两家口径不同,但方向一致:中招的绝不是个位数,公开仓库是重灾区,私有仓库也未必安全,侥幸没被扫到不等于没被盯上。
判断一:试探性 PR 像敲门声,先响后破门。看到标题正常、改动可疑的文档 PR,先查分支名和提交历史,再进 Actions 看跑没跑、跑了多久,别急着点合并,合并前多问一句「这活儿该我做吗」。

偷的都是能调钱的钥匙
攻击者要的不是你的代码,是代码里能调钱的钥匙:Actions secrets、GITHUB_TOKEN、OIDC 令牌、云平台凭证文件,还有 OpenAI、Anthropic、Gemini、HuggingFace、Cursor、Copilot、Codex 这些 AI 服务的 key,一个都没落下。代码本身不值钱,值钱的是代码身后那串能花出去的权限,密钥才是这次真正的赃物。
GitHub Actions 一跑起来,这些密钥就躺在工作流环境里等着被读取。账号一失守、仓库能写,脚本就能把密钥一把捞走。别以为 key 是虚拟的就没损失——被刷爆的账单是实打实的美元,你辛苦攒的额度,转头成了别人干活的燃料,月底还得由你买单。
判断二:把密钥当钱看,你才会心疼。凡是能调用云和 AI 的 token,都该按钱包标准管:最小权限、定期轮换、过期作废,更别写进代码里——钱包揣兜里是保管,揣门缝里是施舍,施舍的东西迟早被人顺走。

为什么连 AI 的 key 都成了目标
以前偷账号是为挖矿、发垃圾邮件,收益还看行情,起落都大;现在盯上 AI key,因为这东西太好变现。API key 按量计费,偷来的 key 能直接当自己的额度刷,账单记在别人头上,流水还难追踪,操作起来比偷信用卡还方便,用完一封邮件都不用发。
更现实的是,AI key 常被开发者图省事写进配置、写进环境变量,甚至直接提交到仓库里。攻击者不用猜,翻一翻提交历史就能捡到,等于把保险柜钥匙挂在门上,还贴心贴了标签。安全公司念叨多年的密钥入库老毛病,这次被批量收割了一轮,学费还是开发者自己交。
讽刺的是,越火的 AI 服务越容易成为目标:主流大模型厂商的 key 在灰产里全是硬通货,谁都想白嫖别人的额度。你辛苦调好的模型配置,在盗号者眼里只是免费的算力,这份尴尬真不能全甩给 AI 太火,得一半甩给手滑的自己。

中招了怎么办,先查这几处
先看工作流运行编号:攻击者得手后约一分钟内撤销改动、删运行记录和日志,手速比外卖小哥还快,唯一常留下的痕迹就是编号断号。去 Actions 页翻一翻,发现序号跳号、对应任务的记录又找不到,就要警惕——干净得反常的仓库,多半是有人进来过又收拾过现场。
再查这几处:仓库 Settings 里的 Secrets 有没有被动过;有没有自己没发起的 PR 被合并;GitHub 审计日志里有没有陌生登录和陌生设备;授权应用列表里有没有多出来的第三方。发现任何异常,立刻轮换所有密钥、吊销令牌,别等账单提醒——账单只会提醒你,不会替你止损。
最后是止损动作:开启双重验证或密钥登录,别让密码裸奔;给能写仓库的账号降权限,能只读的不给写,越小越安;对 AI 服务开通用量告警,账单突然涨了,比任何监控都灵敏。这次事件最该记住的一句话:钥匙现在还插在门上,趁没丢,赶紧拔下来,别等账单来了再后悔。