Drasrax/npm-shai-hulud-scanner
GitHub: Drasrax/npm-shai-hulud-scanner
一款针对 npm/PyPI 生态系统的供应链安全扫描工具,专注于检测并隔离已知恶意软件包及其变种攻击。
Stars: 15 | Forks: 4
# NPM 供应链安全扫描器
用于检测 NPM 项目中供应链漏洞的安全工具包,旨在检测 2025-2026 年重大 npm 供应链攻击的模式:
- **CVE-2025-54313**(Scavenger 恶意软件 - 2025 年 7 月)
- **Shai-Hulud 蠕虫**(2025 年 9 月)和 **Shai-Hulud 2.0 "The Second Coming"**(2025 年 11 月)
- **Mini Shai-Hulud / TeamPCP 家族**(2026 年 4 月-6 月):SAP CAP、Bitwarden CLI、TanStack(**CVE-2026-45321**)、AntV、Miasma (Red Hat)、Hades (PyPI)
## 目的
检测并通知 NPM(以及现在的 PyPI)依赖项中的安全漏洞,包括:
- **1340+ 个受损的软件包版本**(Shai-Hulud v1/v2 + CVE-2025-54313 + 2026 年 Mini Shai-Hulud 浪潮)
- **跨生态系统覆盖**:npm + PyPI(Hades 浪潮),并记录了波及 Maven 的情况
- 用于规避 EDR 的 Bun-runtime 加载器(`setup.mjs`, `execution.js`, `bw1.js`, `_index.js`,锁定 Bun v1.3.13)
- 通过 agent/IDE 配置文件实现恶意软件持久化(在 `npm uninstall` 后依然存活)
- OIDC / Trusted-Publishing 滥用以及 GitHub commit 锁定的 tarball 注入
- Shai-Hulud 2.0 Bun payloads(`setup_bun.js`, `bun_environment.js`)
- 域名抢注企图
- 注入的恶意代码(DLL/SO 文件、混淆脚本)
- 可疑的安装脚本
- 蠕虫式/传播行为
- C2 域名通信
- 云元数据端点 (IMDS) 访问
## 文件
- `npm-supply-chain-detector.py` - 主 Python 检测脚本
- `scan-npm-security.sh` - Bash 自动化与监控脚本
- `malicious-patterns.json` - 恶意模式数据库(生产环境)
- `shai-hulud-iocs.json` - 扩展 IOCs 数据库(740+ 个软件包 / 1340 个版本,29 个哈希值,C2 域名,2026 年 Mini Shai-Hulud + PyPI Hades 部分)
- `update-patterns.py` - 模式数据库生成器/更新器
## 安装
```
# 克隆或下载 scripts
chmod +x npm-supply-chain-detector.py scan-npm-security.sh
# 检查先决条件
./scan-npm-security.sh --help
```
### 前置条件
- Python 3.6+
- 已安装 npm/node
- 带有 package.json 的 NPM 项目
## 用法
### 简单扫描
```
# 扫描当前目录
python3 npm-supply-chain-detector.py
# 扫描特定项目
python3 npm-supply-chain-detector.py /path/to/project
# 生成详细报告
python3 npm-supply-chain-detector.py -v -o markdown -f report.md
```
### 自动化脚本
```
# 基本扫描
./scan-npm-security.sh
# 持续监控(每 5 分钟扫描一次)
./scan-npm-security.sh -c -i 300
# 深度扫描并保存
./scan-npm-security.sh -d -f security-report.md -o markdown /project
# 附带 webhook 通知(Slack、Discord 等)
./scan-npm-security.sh -w https://hooks.slack.com/services/XXX
# 隔离可疑 packages(移动到 .npm-quarantine/)
./scan-npm-security.sh --quarantine
# 如果是 false positive 则恢复被隔离的 packages
./.npm-quarantine/restore.sh
```
### 可用选项
#### Python 脚本 (`npm-supply-chain-detector.py`)
- `-o, --output`:输出格式(json, text, markdown)
- `-f, --file`:将报告保存到文件
- `-v, --verbose`:详细模式
- `--webhook`:用于通知的 Webhook URL
#### Bash 脚本 (`scan-npm-security.sh`)
- `-c, --continuous`:持续监控模式
- `-i, --interval`:扫描之间的间隔(秒)
- `-d, --deep`:深度扫描(包括 npm audit、过时的软件包)
- `--quarantine`:**将可疑软件包移动到隔离文件夹**
- `--update-patterns`:从文件更新模式
## 隔离功能
`--quarantine` 选项会自动隔离受损的软件包:
**工作原理:**
1. 扫描关键漏洞
2. 从扫描结果中识别受损的软件包
3. 将软件包从 `node_modules/` 移动到 `.npm-quarantine/packages/`
4. 创建包含元数据(版本、路径、时间戳)的 JSON 清单
5. 生成自动恢复脚本 `restore.sh`
**创建的目录结构:**
```
.npm-quarantine/
├── packages/ # Isolated packages
│ ├── package-name/
│ └── @scope_package-name/
├── logs/ # Scan logs
├── quarantine-manifest-*.json # Metadata
└── restore.sh # Restoration script
```
**恢复(如果是误报):**
```
cd .npm-quarantine
./restore.sh # Interactive confirmation required
```
## 检测项
### 1. 已知的受损软件包(1340 个版本)
**CVE-2025-54313 (Scavenger - 2025 年 7 月):**
- eslint-config-prettier (8.10.1, 9.1.1, 10.1.6, 10.1.7)
- eslint-plugin-prettier (4.2.2, 4.2.3)
- synckit (0.11.9)
- @pkgr/core (0.2.8)
- napi-postinstall (0.3.1)
- got-fetch (5.1.11, 5.1.12)
- is (3.3.1, 5.0.0)
- @crowdstrike/node-exporter (0.2.2)
- @crowdstrike/threat-center (1.205.2)
- tailwind-toucan-base (5.0.2)
- **Shai-Hulud 2.0 (Wiz, 2025 年 11 月 27 日)**:约 470 个软件包/版本(例如 `@asyncapi/*`, `@actbase/*`, `@accordproject/*`, `@antstackio/*` 等)——完整列表请参见 `shai-hulud-iocs.json`
**Shai-Hulud 蠕虫(2025 年 9 月):**
- CrowdStrike 软件包 (@crowdstrike/*)
- @ctrl/tinycolor (4.1.1, 4.1.2)
- @nativescript-community/* 软件包
- @operato/* 软件包
- @things-factory/* 软件包
- 许多其他(参见 shai-hulud-iocs.json)
**Shai-Hulud 2.0(2025 年 11 月,Unit42 和 Wiz)**
- 新的 payloads:`setup_bun.js`, `bun_environment.js`
- bun_environment.js 哈希值:`62ee164b9b306250c1172583f138c9614139264f889fa99614903c12755468d0`, `f099c5d9ec417d4445a0328ac0ada9cde79fc37410914103ae9c609cbc0ee068`, `cbb9bc5a8496243e02f3cc080efbe3e4a1430ba0671f2e43a202bf45b05479cd`
- setup_bun.js 哈希值:`a3894003ad1d293ba96d77881ccd2071446dc3f65f434669b49b3da92421901a`
- GitHub 数据外泄:仓库描述 "Sha1-Hulud: The Second Coming"
- 可能的破坏性后备方案(`rm -rf ~` / `$HOME`)
**Mini Shai-Hulud / TeamPCP 家族(2026 年 4 月-6 月)**
威胁行为者 **TeamPCP(又名 UNC6780)** 开源了他们的 "Mini Shai-Hulud" 恶意软件,引发了一系列的攻击浪潮(和模仿者)。它们全都使用 **Bun loader**(规避 EDR),并通过在受害者自己的账号上创建的 GitHub dead-drop 仓库进行数据外泄:
| 浪潮 | 日期 | 生态系统 | 关键软件包 |
|------|------|-----------|--------------|
| Bitwarden CLI ("The Third Coming") | 2026-04-22 | npm | `@bitwarden/cli@2026.4.0`(通过 Checkmarx 泄露) |
| SAP CAP ("A Mini Shai-Hulud has Appeared") | 2026-04-29 | npm | `mbt`, `@cap-js/sqlite`, `@cap-js/postgres`, `@cap-js/db-service` |
| TanStack (**CVE-2026-45321**) | 2026-05-11 | npm + PyPI | 42 个 `@tanstack/*` 软件包,`@mistralai/mistralai`, `@uipath/cli`(OIDC/Trusted-Publishing 劫持,有效的 SLSA 来源) |
| AntV ("Here We Go Again") | 2026-05-19 | npm | `@antv/g2,g6,l7,s2`, `echarts-for-react`, `timeago.js`, `size-sensor`(受损的 `atool` 维护者账号) |
| Miasma ("The Spreading Blight") | 2026-06-01 | npm | `@redhat-cloud-services/*`(通过 GitHub Actions OIDC) |
| Hades ("The End for the Damned") | 2026-06-07 | **PyPI** | 19 个项目,通过 `*-setup.pth` 钩子 → Bun → `_index.js` |
涵盖的新型 TTP:**Bun v1.3.13 runtime**(规避)、**通过 agent/IDE 配置文件实现持久化**(`.claude`/`.vscode`/`.cursor`,在 `npm uninstall` 后存活)、**OIDC/Trusted-Publishing 滥用**、**"living-off-trusted-host" 数据外泄**(`api.anthropic.com/v1/api`, `filev2.getsession.org`),以及在 token 失效时触发的**破坏性擦除**。
### 2. 域名抢注检测
- Levenshtein 距离分析
- 常见替换(0→o, 1→i 等)
- 破折号/下划线变体
### 3. 恶意代码模式
- 凭据外泄(AWS, npm, SSH, GitHub tokens)
- 远程代码执行(curl|sh, eval)
- 混淆(base64, atob, XOR 加密)
- 与 C2 域名的可疑网络通信
- 自我传播(蠕虫模式,npm 发布)
- 云元数据端点 (IMDS) 访问
- **CVE-2025-54313 特定:**DLL/SO 加载,logDiskSpace 函数
### 4. 可疑的安装脚本
- 恶意的 preinstall/postinstall 钩子
- 脚本下载和执行
- npm token 操作
- **Windows DLL 执行**(rundll32, regsvr32)
- 恶意文件:node-gyp.dll, loader.dll, version.dll
### 5. 基于哈希的检测(29 种变体)
- **Shai-Hulud bundle.js**(7 个 SHA-256 哈希值)
- **Shai-Hulud 2.0 Bun payloads**:`bun_environment.js`(3 个哈希值),`setup_bun.js`(1 个哈希值)
- **CVE-2025-54313 Scavenger**(3 个 SHA-256 哈希值)
- node-gyp.dll: c68e42f416f482d43653f36cd14384270b54b68d6496a8e34ce887687de5b441
- Scavenger stage 2: 5bed39728e404838ecd679df65048abcb443f8c7a9484702a2ded60104b8c4a9
- install.js: 32d0dbdfef0e5520ba96a2673244267e204b94a49716ea13bf635fa9af6f66bf
### 6. C2 域名检测
- firebase.su (CVE-2025-54313)
- dieorsuffer.com (CVE-2025-54313)
- smartscreen-api.com (CVE-2025-54313)
- npnjs.com(域名抢注)
- webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7 (Shai-Hulud)
- t.m-kosche.com (Mini Shai-Hulud AntV C2)
- filev2.getsession.org, api.masscan.cloud, git-tanstack.com (TanStack 浪潮)
- audit.checkmarx.cx (Bitwarden 浪潮数据外泄)
- `api.anthropic.com/v1/api` — **仅路径**检测(主机是合法的,通过伪造路径滥用;从不直接屏蔽)
### 7. 完整性分析
- 通过 `npm audit` 验证
- 大型 JS 文件检测(>3MB)
- npm 域名验证
## 报告格式
### JSON
```
{
"scan_date": "2025-01-22T10:30:00",
"project_path": "/path/to/project",
"findings": [
{
"severity": "critical",
"message": "KNOWN COMPROMISED PACKAGE",
"location": "package.json",
"details": {...}
}
],
"statistics": {
"total_findings": 5,
"critical": 2,
"warning": 3
}
}
```
### Markdown
带有表格和结构化部分的格式化报告。
Text
用于 CI/CD 集成的纯文本报告。
## 通知
### Webhook 配置
可将关键发现发送至 Webhook:
```
./scan-npm-security.sh -w https://your-webhook-url
```
Payload 格式:
```
{
"text": "NPM Security Alert: X critical vulnerabilities",
"findings": [...]
}
```
## CI/CD 集成
### GitHub Actions
```
- name: NPM Security Scan
run: |
python3 npm-supply-chain-detector.py . -o json -f scan-results.json
if [ $? -ne 0 ]; then
echo "Critical vulnerabilities found!"
exit 1
fi
```
### GitLab CI
```
npm-security-scan:
script:
- python3 npm-supply-chain-detector.py
artifacts:
reports:
paths:
- security-reports/
```
### Jenkins
```
stage('Security Scan') {
sh './scan-npm-security.sh -o json -f report.json'
}
```
## 自定义配置
修改 `malicious-patterns.json` 以:
- 添加新的受损软件包
- 定义自定义模式
- 调整通知阈值
- 排除误报
## 持续监控
用于 24/7 监控:
```
# 使用 systemd
sudo tee /etc/systemd/system/npm-security-monitor.service << EOF
[Unit]
Description=NPM Security Monitor
After=network.target
[Service]
Type=simple
User=youruser
WorkingDirectory=/path/to/project
ExecStart=/path/to/scan-npm-security.sh -c -i 600 -w https://webhook.url
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable npm-security-monitor
sudo systemctl start npm-security-monitor
```
## 发生检测时该怎么办?
1. **关键发现**:
- **使用隔离模式**:`./scan-npm-security.sh --quarantine`
- 立即隔离受损软件包
- 重新生成所有暴露的 tokens/secrets(npm, GitHub, AWS, SSH keys)
- 审查受影响系统的凭据暴露情况
- 检查名为 "Shai-Hulud" 的未授权 GitHub 仓库
- 审查云元数据端点 (IMDS) 访问日志
2. **CVE-2025-54313 特定项**:
- 检查恶意 DLL/SO 文件(node-gyp.dll, loader.dll 等)
- 扫描与 C2 域名的连接(firebase.su, dieorsuffer.com, smartscreen-api.com)
- Windows 系统:审查 rundll32/regsvr32 执行日志
3. **警告**:
- 调查可疑模式
- 在恢复前验证软件包合法性
- 更新到安全版本
- 审查软件包维护者更改
4. **事件处理后**:
- 替换为安全的软件包版本:`npm install @`
- 运行 `npm audit fix` 进行自动修复
- 依赖项审查和 lockfile 验证
- 设置持续监控(`-c -i 300`)
- 考虑仅在验证后从隔离区恢复
## 参考链接
- [CrowdStrike NPM 攻击 2025](https://socket.dev/blog/ongoing-supply-chain-attack-targets-crowdstrike-npm-packages)
- [CVE-2025-54313](https://nvd.nist.gov/vuln/detail/CVE-2025-54313)
- [CVE-2026-45321 (TanStack / Mini Shai-Hulud)](https://snyk.io/blog/tanstack-npm-packages-compromised/)
- [Mini Shai-Hulud SAP CAP (StepSecurity)](https://www.stepsecurity.io/blog/a-mini-shai-hulud-has-appeared)
- [Bitwarden CLI 劫持 (JFrog)](https://research.jfrog.com/post/bitwarden-cli-hijack/)
- [Shai-Hulud Miasma / Red Hat (Wiz)](https://www.wiz.io/blog/miasma-supply-chain-attack-targeting-redhat-npm-packages)
- [Shai-Hulud Hades PyPI 浪潮 (Socket)](https://socket.dev/blog/shai-hulud-descends-to-hades-miasma-pypi-wave)
- [AntV 生态系统受损 (Socket)](https://socket.dev/blog/antv-packages-compromised)
- [npm audit 文档](https://docs.npmjs.com/cli/v8/commands/npm-audit)
## 备注
- 跨 npm + PyPI 追踪 **1340 个受损软件包版本**(更新于 2026-06-08)
- 检测到 **29 个恶意软件文件哈希值**(Shai-Hulud v1/v2 + Scavenger + 2026 年 Mini Shai-Hulud 浪潮)
- 涵盖**多次攻击活动**:CVE-2025-54313、Shai-Hulud v1/v2 以及 2026 年 Mini Shai-Hulud / TeamPCP 家族(CVE-2026-45321)
- 扫描器旨在最大程度减少误报(已针对合法的 `.claude`/`.vscode` 配置、干净的 PyPI/npm 版本、真实的 Anthropic API 调用进行了验证)
- 模式基于观察到的真实攻击(2025 年 7 月 - 2026 年 6 月)
- 建议定期更新恶意模式
- 兼容所有标准 NPM 项目
- 隔离功能允许安全隔离并提供恢复选项
## 局限性
- 不能替代彻底的手动分析
- 可能无法检测到零日攻击
- 性能取决于项目大小
- 需要 node_modules 的读取权限
## 贡献
如需添加新模式或受损的软件包:
1. **更新模式文件:**
- 编辑 `update-patterns.py` 以添加新的软件包/模式
- 运行 `python3 update-patterns.py` 以重新生成 `shai-hulud-iocs.json`
- 或者手动编辑 `malicious-patterns.json` 以进行快速更新
2. **测试更改:**
python3 npm-supply-chain-detector.py -v test-project/
3. **更新文档:**
- 更新 `README.md` 中的统计数据
标签:Cilium, Homebrew安装, IP 地址批量处理, MITM代理, NPM, Python, StruQ, 威胁情报, 应用安全, 开发者工具, 文档安全, 无后门, 暗色界面, 网络信息收集, 逆向工具, 配置审计