一款安全工具,用于检测 Shai-Hulud 供应链攻击(2025年9月原始攻击及2025年11月 Shai-Hulud 2.0 攻击)中被入侵的 npm 软件包。同时扫描 package.json 和 package-lock.json 文件,以检测精确的已安装版本和入侵指标(IoC)。提供 Python 和 Node.js 两种实现,并采用集中式 YAML 配置便于维护。
最新更新: 2025年11月24日 - 追踪 738+ 个被入侵软件包,涵盖 1,291 个唯一的 package@version 组合。现已同时检测原始 Shai-Hulud 和 Shai-Hulud 2.0 攻击变种。
如需多生态系统扫描,请参阅 ore-mal-pkg-inspector。
如需多生态系统恶意软件包扫描(npm、PyPI、Maven、RubyGems、Go、Cargo),请参阅: ore-mal-pkg-inspector - 具有动态威胁情报的综合恶意软件包扫描器。
OreNPMGuard 专门专注于 npm 软件包的 Shai-Hulud 攻击防御。
Shai-Hulud 是一种自复制蠕虫,于 2025年9月14日至15日开始入侵 npm 软件包,代表了 npm 生态系统中首次成功的自传播攻击,也是迄今观察到的最严重的 JavaScript 供应链攻击之一。该恶意软件以 Frank Herbert《沙丘》系列中的巨型沙虫命名,现已演变为多种变种。
原始攻击感染了 200+ 个 npm 软件包(本工具已追踪),每个软件包有多个受影响版本。
2025年11月出现了一种新变种,具有重大变化:
preinstall 脚本(不仅仅是 postinstall)setup_bun.js 和 bun_environment.js(除 bundle.js 外)参考资料:Wiz Research - Shai-Hulud 2.0 博客文章
零号病人:攻击始于 2025年9月14日 17:58:50 UTC 发布的 rxnt-authentication 软件包,由已被入侵的 "techsupportrxnt" npm 账户发布。
攻击链(原始 Shai-Hulud):
postinstall 脚本,执行 bundle.js(3MB+ JavaScript 载荷)data.json 中(双重 base64 编码).github/workflows/shai-hulud-workflow.yml),将仓库机密外泄至 webhook[.]sitepostinstall 挂钩攻击链(Shai-Hulud 2.0 - 2025年11月):
preinstall 脚本,执行 setup_bun.js 或 bun_environment.js(新的载荷文件)cloud.json、contents.json、environment.json 和 truffleSecrets.json 文件.github/workflows/discussion.yaml 以作为后门访问.github/workflows/formatter_*.yml 用于机密外泄(随后删除工作流以隐藏活动)docker run --rm --privileged -v /:/host 获取 root 访问权限ghp_*、gho_*)、npm 认证令牌原始 Shai-Hulud(2025年9月):
@ctrl/tinycolor、ngx-bootstrap 等流行软件包)Shai-Hulud 2.0(2025年11月):
已确认的凭据窃取(来自约 20,000 个被分析的仓库):
关键提示:Wiz Research 已确认正在发生跨受害者外泄。这意味着:
调查启示:在审查您仓库中的外泄数据时,请验证这些数据确实属于您的组织还是其他受害者。
此次攻击与 2025年8月的 s1ngularity/Nx 入侵事件直接相关,该事件中最初的 GitHub 令牌窃取促成了更广泛的供应链攻击。许多最初的 Shai-Hulud 受害者是 s1ngularity 攻击的已知受害者。安全研究人员还指出,该攻击活动中包含 AI 生成的内容,并有中等置信度认为使用了 LLM 来生成恶意 bash 脚本。
原始 Shai-Hulud 攻击活动:
rxnt-authentication("零号病人")Shai-Hulud 2.0 攻击活动:
PyYAML(pip install pyyaml)js-yaml(npm install js-yaml)# 赋予可执行权限
chmod +x shai_hulud_scanner.py
# 扫描单个 package.json
python3 shai_hulud_scanner.py ./package.json
# 扫描 package-lock.json 以获取精确版本
python3 shai_hulud_scanner.py ./package-lock.json
# 扫描整个项目目录
python3 shai_hulud_scanner.py ./my-project
# 扫描当前目录
python3 shai_hulud_scanner.py .
# 先安装依赖
npm install
# 赋予可执行权限
chmod +x shai_hulud_scanner.js
# 扫描单个 package.json
node shai_hulud_scanner.js ./package.json
# 扫描 package-lock.json 以获取精确版本
node shai_hulud_scanner.js ./package-lock.json
# 扫描整个项目目录
node shai_hulud_scanner.js ./my-project
# 扫描当前目录
node shai_hulud_scanner.js .
✅ 精确匹配检测:识别与已知被入侵版本精确匹配的软件包
⚠️ 潜在风险检测:标记同名但不同版本的软件包(仍可能处于危险之中)
🔍 双文件支持:同时扫描 package.json(声明的依赖)和 package-lock.json(精确的已安装版本)
📦 全面覆盖:package-lock.json 扫描包含嵌套依赖和传递依赖
🔄 递归扫描:自动扫描所有子目录,同时跳过 node_modules
📋 详细报告:显示软件包名称、版本、依赖部分和受影响版本
🔎 IoC 检测:识别原始 Shai-Hulud 和 Shai-Hulud 2.0 的入侵指标:
"postinstall": "node bundle.js" 挂钩、bundle.js 文件、shai-hulud-workflow.yml"preinstall" 挂钩、setup_bun.js、bun_environment.js、discussion.yaml、formatter_*.yml 工作流webhook.site 外泄端点的引用、SHA1HULUD 运行器模式、Docker 权限提升🚨 严重(发现被入侵软件包):
🚨 CRITICAL: Found 2 CONFIRMED compromised packages:
• @ctrl/deluge v7.2.2 in dependencies
Affected versions: 7.2.2, 7.2.1
• ngx-bootstrap v19.0.3 in devDependencies
Affected versions: 18.1.4, 19.0.3, 20.0.4, 20.0.5, 20.0.6, 19.0.4, 20.0.3
⚠️ 警告(版本不匹配):
⚠️ WARNING: Found 1 packages with different versions:
• @ctrl/deluge v7.2.0 in dependencies
Known affected versions: 7.2.2, 7.2.1
✅ 干净:
✅ No affected packages found
npm uninstall <package-name>npm cache clean --forcerm -rf node_modules"postinstall": "node bundle.js"bundle.js 文件(3MB+ 大小,包含恶意载荷).github/workflows/shai-hulud-workflow.yml 文件"preinstall" 挂钩setup_bun.js 和 bun_environment.js 载荷文件cloud.json、contents.json、environment.json、truffleSecrets.json.github/workflows/discussion.yaml(带有自托管运行器)软件包数据集中存储在 affected_packages.yaml 中。要添加新的被入侵软件包:
affected_packages.yaml- name: "package-name"
versions: ["1.0.0", "1.0.1"]
这种集中式方法消除了在发现新威胁时需要更新多个文件的情况。
# 创建集中扫描脚本
curl -O https://your-domain.com/shai_hulud_scanner.py
chmod +x shai_hulud_scanner.py
# 批量扫描多个项目
for dir in /projects/*/; do
echo "Scanning $dir"
python3 shai_hulud_scanner.py "$dir"
done
# GitHub Actions 示例
- name: Scan for Shai-Hulud packages
run: |
curl -O https://your-domain.com/shai_hulud_scanner.js
npm install js-yaml
node shai_hulud_scanner.js .
if [ $? -ne 0 ]; then
echo "SECURITY ALERT: Compromised packages detected!"
exit 1
fi
# 添加到安全工具集
cp shai_hulud_scanner.py /usr/local/bin/
cp shai_hulud_scanner.js /usr/local/bin/
cp affected_packages.yaml /usr/local/bin/
# 创建别名以便快速访问
echo 'alias scan-shai="python3 /usr/local/bin/shai_hulud_scanner.py"' >> ~/.bashrc
postinstall,Shai-Hulud 2.0 使用 preinstall(增加了在构建环境中的暴露面)原始 Shai-Hulud(2025年9月):
"postinstall": "node bundle.js"bundle.js(通常为 3MB+ 压缩 JavaScript)webhook.site 域名的引用.github/workflows/shai-hulud-workflow.ymlshai-hulud 分支Shai-Hulud 2.0(2025年11月):
"preinstall": "node setup_bun.js" 或 "preinstall": "node bun_environment.js"setup_bun.js、bun_environment.js(除 bundle.js 外)cloud.json、contents.json、environment.json、truffleSecrets.json.github/workflows/discussion.yaml(带有 runs-on: self-hosted 和 RUNNER_TRACKING_ID: 0).github/workflows/formatter_*.yml(模式匹配,用于机密外泄)两个变种共有:
webhook.site 域名的引用preinstall 脚本(Shai-Hulud 2.0 执行阶段)setup_bun.js 和 bun_environment.jscloud.json、contents.json、environment.json、truffleSecrets.jsondiscussion.yaml 和 formatter_*.yml 工作流模式prevention/block-shai-hulud.sh如有问题或疑问:
.github/workflows/formatter_*.yml 文件docker run --rm --privileged -v /:/host)webhook.site 引用docker run --rm --privileged -v /:/host 之类的命令webhook.site 域名的引用(与原始相同)