AI供应链攻击:供应链就是攻击面

2026年3月19日,一个名为TeamPCP的威胁组织对Aqua Security的trivy-action GitHub代码仓库中的77个版本标签强制推送了其中的76个。Trivy是业界部署最广泛的开源漏洞扫描器。新标签指向包含凭证窃取程序的恶意提交。由于大多数CI/CD流水线通过可变版本标签而非固定的提交SHA来引用GitHub Actions,每个在构建流水线中运行Trivy的组织都立即开始执行恶意代码。扫描看起来仍然成功。扫描器仍然报告漏洞。它也悄悄收割了运行环境中的每一个机密。1

供应链攻击利用授权操作的组合来产生未经授权的行为。 攻击者通过GitHub Actions标签劫持入侵Trivy后,使用窃取的CI凭证在PyPI上为LiteLLM植入后门,46分钟内达到46,996次安装。每个组件都在其授予的权限内运行。结构性防御是将依赖项固定到不可变引用,并将软件包安装视为代码执行。

五天后,3月24日,TeamPCP使用从其中一个CI环境窃取的PyPI发布令牌,发布了LiteLLM的两个植入后门版本,这是一个流行的AI代理库,存在于36%的云环境中。2 版本1.82.8包含一个.pth文件,该文件在任何Python启动时自动执行,先于任何导入,先于任何应用层沙箱。该载荷扫荡了SSH密钥、云凭证、数据库密码、加密货币钱包和CI/CD机密,使用硬编码的RSA公钥对其加密,并将存档外传到攻击者前一天注册的域名。3

PyPI在46分钟后隔离了这两个版本。在该时间窗内,发生了46,996次安装。4 LiteLLM的维护者删除了他的GitHub账户,轮换了所有密钥,并聘请了Mandiant。5

安全扫描器在扫描。构建流水线在构建。包管理器在安装。每个组件都在做它被信任做的事情。

TL;DR

  • 攻击链:TeamPCP于3月19日通过GitHub Actions标签劫持入侵Trivy(安全扫描器),随后于3月24日使用从感染Trivy的CI环境中窃取的PyPI令牌入侵LiteLLM(AI代理)。46分钟内46,996次下载。4
  • 技术手段:版本1.82.8滥用Python的.pth机制,在受感染系统的每次python3调用时运行凭证窃取程序,无需导入LiteLLM。3
  • 影响范围:2,337个PyPI包依赖于LiteLLM。88%的版本规范允许安装受损版本。已确认对Google ADK、Stanford DSPy、MLflow、Guardrails AI和Cisco AI Defense SDK的下游影响。4
  • 攻击行动:TeamPCP在一周内攻击了五个生态系统:GitHub Actions、Docker Hub、npm(CanisterWorm,28+个包)、Open VSX(Checkmarx KICS)和PyPI(LiteLLM)。6
  • 结构性教训:链条中的每一环都在其授予的范围内运行。组合这些授权操作产生了未经授权的行为。该模式与代理层面的静默外传和CI/CD层面的Clinejection的组合性差距如出一辙。供应链攻击就是组合攻击。
  • 您能做什么:将依赖项固定到不可变引用。将发布凭证与CI运行器隔离。在操作系统级别监控出站网络请求。将pip install视为代码执行,因为它就是。

一个安全扫描器走进您的构建流水线

攻击始于2026年2月下旬Trivy的GitHub Actions环境中的一个错误配置。攻击者利用一个有漏洞的pull_request_target工作流外传了Aqua Security的aqua-bot个人访问令牌。Aqua在3月1日轮换了一些凭证,但遗漏了其他凭证。TeamPCP保留了有效令牌。1

3月19日,他们使用这些令牌强制推送了trivy-action仓库中77个版本标签中的76个,以及setup-trivy中所有7个标签,将每个可变标签引用重定向到恶意提交。他们还触发了发布自动化,将恶意Trivy二进制文件作为v0.69.4发布。1

载荷是一个凭证窃取程序,转储了Runner.Worker进程内存,收割了SSH密钥、云凭证、Kubernetes机密、Docker配置、Git凭证和.env文件。它使用AES-256和4096位RSA密钥加密所获,然后将存档外传到攻击者控制的服务器。恶意代码与合法的Trivy功能并行运行。扫描成功。扫描器仍然报告漏洞。窃取程序在后台运行。7

3月19日至23日间,攻击者还在trivy:0.69.4、trivy:0.69.5、trivy:0.69.6和trivy:latest标签下毒化了Docker Hub镜像。CrowdStrike、Microsoft、Wiz和Palo Alto都在数日内发布了技术分析。789

讽刺是结构性的:最具安全意识的组织暴露最严重。如果您因为关心漏洞扫描而在CI中运行Trivy,那么您的构建流水线就是收割凭证的那一个。

从扫描器到窃取程序再到AI代理

LiteLLM的CI流水线运行Trivy。具体来说,ci_cd/security_scans.sh从Aqua的仓库通过apt拉取Trivy,未指定版本。10 在入侵窗口期间,一次CI运行拉取了被毒化的Trivy二进制文件,从GitHub Actions环境中收割了PYPI_PUBLISH_PASSWORD。

3月23日,攻击者注册了litellm.cloud。3月24日UTC时间10:39,他们使用窃取的凭证向PyPI发布了litellm==1.82.7。版本1.82.8于UTC时间10:52跟进。4

两个版本使用了不同的攻击技术。版本1.82.7将载荷嵌入proxy_server.py,在import litellm.proxy时触发。版本1.82.8将一个.pth文件投放到site-packages/中,在任何Python解释器启动时触发。.pth机制是Python用于路径配置的合法功能。Python的site.py在解释器初始化期间自动执行它在site-packages/中找到的任何以.pth结尾的文件。大多数Python开发者不知道此功能的存在。3

两个版本中的载荷都收集了环境变量、SSH密钥、AWS/GCP/Azure凭证、Kubernetes配置、数据库密码、加密货币钱包和CI/CD机密。它使用随机会话密钥通过AES-256-CBC加密整个集合,使用硬编码的4096位RSA公钥包装会话密钥,并通过HTTPS POST外传存档。只有攻击者才能解密被窃取的数据。3

1.82.8恶意软件中的一个bug暴露了它。.pth文件生成一个子Python进程,该进程会重新触发.pth文件,造成指数级的fork炸弹。Andrej Karpathy在X上标记了这个bug。如果没有这个fork炸弹,窃取程序本会在每个受感染系统上的每次Python调用时悄无声息地运行,在被任何人发现之前可能持续数周。4

PyPI于UTC时间11:25隔离了这两个版本——46分钟的暴露时间,46,996次下载。4

影响范围

开发者每天大约下载LiteLLM 340万次。Wiz报告它运行在36%的云环境中。2 46分钟的暴露窗口已经足够。

FutureSearch分析了PyPI的BigQuery下载日志,发现在攻击窗口期间,pip拉取版本1.82.8的速率是任何安全版本的6倍。下载严重偏向pip(解析为最新版本)而非uv(使用锁定文件)。在46,996次下载中,23,142次是v1.82.8的pip安装,每一次都在安装本身期间执行了载荷,因为.pth文件在pip自己的Python进程期间触发。4

PyPI上有2,337个包依赖于LiteLLM。88%(2,054个包)的版本规范允许安装受损版本。下游暴露包括:4

项目 月下载量 影响
CrewAI 590万 存在风险
Browser-Use 420万 存在风险
Opik (Comet) 350万 已确认2个CI工作流运行了受损版本
Mem0 270万 存在风险
DSPy (Stanford NLP) 160万 已固定到<=1.82.6
Agno 160万 存在风险
Google ADK – 已确认:litellm破坏所有安装
MLflow – 已固定到<=1.82.6
Guardrails AI – 已发布紧急公告
Cisco AI Defense SDK – 已发布紧急公告

LiteLLM Cloud和Docker代理用户未受影响,因为他们的依赖项在requirements.txt中已被固定。”已固定”和”未固定”之间的区别就是受损与安全之间的区别。5

一周内的五个生态系统

TeamPCP并未止步于PyPI。这次攻击行动迅速接连命中了五个包生态系统:6

GitHub Actions(3月19日):76个trivy-action标签和所有7个setup-trivy标签被劫持。恶意Trivy二进制文件v0.69.4至v0.69.6被发布。

Docker Hub(3月19-22日):恶意Trivy镜像以aquasec/trivy:latest和特定版本标签被推送。传播到mirror.gcr.io。

Open VSX(3月23日):TeamPCP入侵了Checkmarx KICS GitHub Action,在UTC时间12:58至16:50之间劫持了35个标签。2

npm(3月23-24日):CanisterWorm,一个自传播蠕虫,部署在28+个npm包中。

PyPI(3月24日):LiteLLM版本1.82.7和1.82.8发布了带凭证窃取载荷的版本。

每个生态系统的入侵都使用了从前一个生态系统收割的凭证。这次攻击行动是一个信任利用的有向图,其中每个被入侵的节点都生出了通往下一个的钥匙。

供应链攻击就是组合攻击

TeamPCP攻击行动中的结构模式与我在代理安全和静默外传的语境中描述的模式相同:单独授权的组件组合成未经授权的行为。

Trivy有权限在CI中运行。CI按设计持有发布凭证。包管理器按命令安装包。每个.pth文件按预期配置Python路径。链条中的每一环都在其定义的范围内运行。组合这些合法操作产生了规模化的凭证外传。

Clinejection攻击在CI/CD层面展示了同样的模式:一个issue标题向Cline的自动化流水线注入对抗性文本,该流水线执行了一个npm preinstall脚本,毒化了构建缓存,污染了跨工作流的产物。每一步都持有自己的授权。11

MCPTox基准在代理层面展示了同样的模式:嵌入工具描述中的恶意指令将代理重定向,使其使用服务器上已有的合法工具外传凭证。代理本身从未执行被毒化的工具。它读取被毒化的描述,并使用自己的合法工具执行攻击。12

静默外传在运行时层面展示了它:网页元数据中的对抗性指令诱使代理通过代理本已有权发起的出站HTTP请求外传运行时上下文。13

攻击面不是单个有漏洞的组件。攻击面是受信任组件的组合。保护单个环节并不能保护整个链条。Trivy本身不是漏洞。LiteLLM本身不是漏洞。它们之间的信任关系——由可变版本标签和未固定依赖项中介——才是漏洞。

真正有效的方法

那些本可阻止此次攻击每个阶段的防御措施很乏味。它们也是大多数组织略过的那些。

固定到不可变引用。 LiteLLM通过apt拉取Trivy时未指定版本。如果security_scans.sh固定到特定版本或提交SHA,被毒化的v0.69.4二进制文件就永远不会运行。GitHub Actions应该引用提交SHA,而不是可变标签。uses: aquasecurity/[email protected](受损)与uses: aquasecurity/trivy-action@57a97c7(安全)之间的区别就是失去发布凭证与不失去之间的区别。1

将发布凭证与CI运行器隔离。 PYPI_PUBLISH_PASSWORD作为环境变量暴露在Trivy运行的GitHub Actions运行器中。如果团队将发布凭证隔离在一个没有第三方action依赖的单独工作流中,Trivy的入侵就不会带来PyPI访问权限。PyPI的Trusted Publishers(OIDC)完全消除了存储的令牌。5

监控出站网络请求。 凭证窃取程序通过HTTPS POST将数据外传到models.litellm.cloud,这是攻击者在攻击前24小时注册的域名。标记对新近注册域名请求的出站监控本可发现这一点。我自己的钩子系统会阻止对不在白名单上的域名的出站请求,正是这种模式本可拦截此次外传。14

我也曾在生产环境中以艰难的方式学到了同样的教训。一条受信任的Cloudflare缓存清除路径触发了一次完全授权的API调用,但仍产生了错误的结果,因为周围的护栏太松。那次失败促使我在高影响操作周围添加了破坏性操作的审批和预检钩子,而不仅仅是域名白名单。

将pip install视为代码执行。 site-packages/中的.pth文件会在每次Python启动时运行。没有退出选项。没有沙箱。如果您在可访问凭证的CI环境中运行pip install,您就授予了包中每个传递依赖项任意代码执行权限。缓解措施:在没有凭证访问权限的环境中运行pip install,然后将已安装的包复制到需要它们的环境中。

使用锁定文件。 FutureSearch的分析显示,uv用户(依赖锁定文件)很少拉取受损版本,而pip用户(解析为最新版本)则不断拉取。锁定文件不是完整的防御,但它们防止最常见的暴露:未固定的>=版本约束悄悄升级到受损版本。4

令人不安的含义

TeamPCP攻击行动表明,供应链安全不是位于应用安全、网络安全和端点保护之后的次要顾虑。对于运行具有工具访问权限的AI代理的组织而言,供应链是主要的攻击面。

一个在CI环境中调用pip install、获取URL或安装MCP服务器的AI代理在运行时组合信任关系。每个操作都带有自己的授权。组合可能不带。部署与防御悖论加速了这一点:组织部署代理的速度快于审计这些代理所组合的信任链的速度。

LiteLLM 1.82.8中的fork炸弹bug是任何人能够快速检测到此次攻击的唯一原因。如果没有那个实现错误,凭证窃取程序本会在每个受感染系统上的每次Python调用时悄无声息地运行。46分钟内46,996次安装。36%的云环境。2,337个下游包。攻击者犯了一个错误。下次,他们可能不会犯了。


更新——2026年3月31日:不同的载体,相同的结果

本文上线六天后,npm遭遇了下一次事件。3月31日,axios维护者Jason Saayman披露,他的个人计算机通过一次有针对性的社会工程行动加上远程访问木马恶意软件被入侵。攻击者使用他的npm凭证发布了axios 1.14.1和0.30.4,这两个版本都注入了一个名为[email protected]的新依赖项,该依赖项在macOS、Windows和Linux上安装了跨平台RAT。恶意版本保持上线大约三小时,之后社区贡献者分诊了这次事件,npm撤回了它们。16

axios载体与TeamPCP不同。没有受损的CI运行器,没有从第三方安全扫描器收割的凭证,没有跨多个生态系统的蠕虫。针对Saayman的攻击行动在发布前持续了大约两周,入侵通过维护者的个人设备直接传到npm发布流水线。补救工作要求完全擦除他所有的设备,并轮换他在使用过的所有平台(个人或其他)上的每一个凭证。C2基础设施是142.11.206.73:8000上的sfrclak[.]com。16

结构性教训是相同的。信任链现在将维护者的注意力和警觉作为环节包括在内,因为当对手操纵链中的某个人时,单独合法的操作会组合成未经授权的行为。axios团队正在采用的缓解措施(OIDC发布、不可变发布、设备隔离)16解决了Trivy到LiteLLM所暴露的同一组合性差距:发布凭证存储在已经入侵其相邻物的对手能够触及的地方。

三小时。46分钟。这些是现代供应链攻击当前所运作的窗口。固定和锁定文件仍然是主要防御:在3月31日UTC时间00:21-03:15窗口之外进行全新安装的axios用户未受影响。16


FAQ

我如何检查自己是否受影响?

在您的CI日志和本地环境中搜索2026年3月24日UTC时间10:39至11:25之间安装的LiteLLM版本1.82.7或1.82.8。如果您发现任一版本,请轮换该系统可触及的每一个凭证——环境变量、SSH密钥、配置文件。LiteLLM的官方指南:将运行过受损版本的任何系统视为完全受损。5

我应该跟踪哪个公告标识符?

跟踪OSV和PyPA公告数据库中的PYSEC-2026-2。OSV还将该事件别名为MAL-2026-2144。截至2026年3月25日,公开的OSV公告页面未列出针对恶意LiteLLM发布的CVE别名,因此事件响应团队应首先依据受影响版本、安装窗口和PYSEC-2026-2。15

LiteLLM Cloud或Docker代理用户受影响了吗?

没有。LiteLLM Cloud和官方Docker代理镜像在requirements.txt中固定了依赖项,防止自动解析到受损版本。只有在46分钟窗口期间通过pip install litellm(未固定)安装LiteLLM的用户受到影响。5

2026年10月新增的LiteLLM公告是同一起事件吗?

不是。3月那次是攻击:攻击者使用窃取的令牌发布了恶意版本1.82.7和1.82.8。PyPA数据库于2026年10月1日新增的11条LiteLLM公告(其中大部分自6月起已经公开)则是合法代理代码中的漏洞。其中一条是CVE-2026-84377,它让任何经过身份验证的代理用户都能让代理把其提供商凭证发送到自己选定的目的地。17 第一步也不同。对于3月的事件,需要检查自己安装了什么,并轮换它可触及的每一个凭证。对于这批公告,请将代理升级到1.97.0或更高版本;如果您所用的版本线有修复版本,也可以升级到该修复版本(1.88.6至1.96.2)。这些版本都不在任何已记录的受影响范围之内。同时,除非确有需要,请保持客户端提供的连接参数处于关闭状态(general_settings.allow_client_side_credentials)。如果在代理运行受影响版本期间,有您并不完全信任的人持有代理密钥,还应轮换提供商密钥以及代理上配置的其他机密。其中两条是1.84.0以下版本中的身份验证缺陷,因此对于这些版本,只要代理曾可从您不信任的网络访问,同样需要轮换。用Docker镜像运行代理在3月可以豁免,这次则不行:这些缺陷就在代理代码本身之中。每条公告的版本范围都写在其记录中,即PyPA公告数据库中的PYSEC-2026-4066至PYSEC-2026-4076。

什么是.pth文件,为什么它危险?

.pth文件是用于配置模块搜索路径的Python功能。Python的site.py模块在解释器初始化期间读取并执行site-packages/目录中任何以.pth结尾的文件。执行发生在任何import语句之前、任何应用代码之前、任何Python级沙箱之前。Python标准库记录了该机制,但很少有应用开发者知道它的存在。它是一个被重新利用作为攻击载体的合法功能。3

是的。LiteLLM入侵是Trivy入侵的直接后果。TeamPCP于3月19日入侵了Trivy的GitHub Actions,从在构建流水线中运行Trivy的组织那里收割了CI/CD凭证。其中一个凭证是LiteLLM的PyPI发布令牌。攻击者五天后使用该令牌发布了恶意的LiteLLM版本。10

什么是TeamPCP?

TeamPCP(也被跟踪为DeadCatx3、PCPcat、ShellForce、CipherForce)是一个威胁组织,于2026年3月开展了一次跨多个生态系统的供应链攻击行动,入侵了GitHub Actions、Docker Hub、npm、Open VSX和PyPI上的包。该组织在大约一周内跨五个包生态系统使用了凭证收割、标签劫持和自传播蠕虫技术。6

这与AI代理安全有什么关系?

安装包、获取URL或连接到MCP服务器的AI代理在运行时组合信任关系。每个操作都带有自己的权限授予。这些操作的组合可能产生未经授权的行为,正如静默外传(代理层)、Clinejection(CI/CD层)和此次攻击(供应链层)所展示的那样。运行时行为监控、域名白名单和凭证隔离在堆栈的不同层解决组合性差距。14


Sources


  1. CrowdStrike, “From Scanner to Stealer: Inside the trivy-action Supply Chain Compromise,” March 2026. Technical analysis of tag hijacking, credential harvesting, and attack timeline. ↩↩↩↩

  2. Wiz, “Three’s a Crowd: TeamPCP Trojanizes LiteLLM in Continuation of Campaign,” March 2026. LiteLLM present in 36% of cloud environments. Full campaign progression from Trivy to KICS to LiteLLM. ↩↩↩

  3. Sonatype, “Compromised litellm PyPI Package Delivers Multi-Stage Credential Stealer,” March 2026. Technical analysis of the .pth file technique, payload encryption, and exfiltration mechanism. ↩↩↩↩↩

  4. FutureSearch (Daniel Hnyk), “LiteLLM Hack: Were You One of the 47,000?” March 2026. PyPI BigQuery analysis: 46,996 downloads in 46 minutes. 2,337 dependent packages, 88% allowing compromised versions. Downstream exposure by monthly download volume. ↩↩↩↩↩↩↩↩↩

  5. LiteLLM, “Security Update: Suspected Supply Chain Incident,” March 2026. Official postmortem. Confirmed Trivy as the vector. Docker/Cloud users unaffected. Mandiant engaged. ↩↩↩↩↩

  6. Kaspersky, “Trojanization of Trivy, Checkmarx, and LiteLLM Solutions,” March 2026. Full campaign analysis across five ecosystems. ↩↩↩

  7. Microsoft, “Guidance for Detecting, Investigating, and Defending Against the Trivy Supply Chain Compromise,” March 2026. Detection guidance, affected version matrix, compromise indicators. ↩↩

  8. Aqua Security, “Trivy Supply Chain Attack: What You Need to Know,” March 2026. Official incident response. Incomplete credential rotation acknowledged. ↩

  9. Palo Alto Networks, “When Security Scanners Become the Weapon,” March 2026. Technical breakdown of the attack. ↩

  10. Snyk, “How a Poisoned Security Scanner Became the Key to Backdooring LiteLLM,” March 2026. Trivy-to-LiteLLM attack chain. Unpinned Trivy dependency in ci_cd/security_scans.sh. ↩↩

  11. Khan, Adnan, via Simon Willison, “Clinejection: Compromising Cline’s Production Releases,” simonwillison.net, March 2026. ↩

  12. Zhiqiang Wang et al., “MCPTox: A Benchmark for Tool Poisoning Attack on Real-World MCP Servers,” arXiv:2508.14925, AAAI 2026. ↩

  13. Lan, Qianlong et al., “Silent Egress: When Implicit Prompt Injection Makes LLM Agents Leak Without a Trace,” arXiv:2602.22450, February 2026. ↩

  14. Blake Crosley, “What I Told NIST About AI Agent Security,” blakecrosley.com, February 2026. ↩↩

  15. OSV / PyPA Advisory Database, “PYSEC-2026-2” published March 24, 2026. Public advisory for the malicious LiteLLM releases. Alias listed: MAL-2026-2144. ↩

  16. Jason Saayman, “Post Mortem: axios npm supply chain compromise,” github.com/axios/axios, March 31, 2026. Primary disclosure from the axios lead maintainer. Timeline, remediation, and vector analysis. Additional technical analysis: StepSecurity, “Axios Compromised on npm — Malicious Versions Drop Remote Access Trojan,” and Datadog Security Labs, “Axios npm Supply Chain Compromise,” March 2026. ↩↩↩↩

  17. GitHub Security Advisory GHSA-3cv6-jpf6-8222 (CVE-2026-84377), published in LiteLLM’s repository on August 26, 2026 and reviewed by GitHub on September 30, read on the repository page and through OSV on October 1, 2026; the count of eleven is PyPA advisory entries PYSEC-2026-4066 through PYSEC-2026-4076 for litellm, each dated October 1, 2026. Nine of the GitHub advisories behind them date to June 21, 2026, and every recorded version range ends at or below 1.96.2. ↩

相关文章

Fork 炸弹救了我们

LiteLLM 的攻击者只犯了一个实现上的错误。正是这个错误,让 47,000 次安装在 46 分钟内被发现。

7 分钟阅读

每个钩子都是一道疤:84 次智能体故障凝成的代码

84 个钩子拦截了 Claude Code 暴露的 26 种生命周期事件中的 15 种。每一个都能追溯到一次具体的生产事故:被清空的缓存、外泄的凭据、从未跑过的测试。

13 分钟阅读

Ralph循环:我如何在夜间运行自主AI代理

我构建了一个使用停止钩子、生成预算和文件系统记忆的自主代理系统。以下是失败经验以及真正能交付代码的方法。

8 分钟阅读