SHA1-HULUD 病毒硬盘递归检测器
SHA1-HULUD 病毒硬盘递归检测器
🚨 一场席卷 npm 生态的供应链攻击
2025 年 11 月,npm 生态系统遭受了一次大规模的供应链攻击 —— SHA1-HULUD pt 2。这次攻击影响了 288+ 个流行的 npm 包,包括:
- PostHog 全家桶 (
@posthog/*,posthog-node) - Zapier 包 (
@zapier/*) - AsyncAPI 工具链 (
@asyncapi/*) - Postman 相关包 (
@postman/*) - ENS Domains (
@ensdomains/*,ethereum-ens) - MCP 包 (
mcp-use,@mcp-use/*) - 以及更多...
如果你的项目依赖了这些包,你的敏感信息可能已经泄露:GitHub tokens、AWS 凭证、NPM tokens、API keys 等等。
🛡️ 解决方案:SHA1-HULUD Scanner(递归扫描增强版)
SHA1-HULUD Scanner 是一个专门用于检测 SHA1-HULUD pt 2 攻击的 bash 扫描工具。
在原版的基础上,我添加了递归扫描功能(v2.2,https://github.com/zhaokang555/sha1-hulud-scanner ),使其能够一次性扫描整个目录树中的所有 Node.js 项目,极大地提升了扫描效率和覆盖范围。
✨ 核心特性
🆕 递归扫描,一键搞定(v2.2 新增)
原版只能逐个扫描项目,现在
使用 -r 递归模式,可以一次性扫描整个目录下的所有 Node.js 项目(扫描最多 3 层深度的所有项目):
# 扫描整个用户主目录
./sha1-hulud-scanner.sh -r ~
# 扫描工作目录下的所有项目
./sha1-hulud-scanner.sh -r ~/Projects
递归模式的优势:
- 💼 批量检查工作项目 -
~/Projects下几十个项目一次搞定 - 🏠 全盘安全检查 - 扫描整个用户目录,不遗漏任何项目
- 📊 综合报告 - 自动汇总所有项目的扫描结果
- 🛡️ 容错设计 - 某个项目扫描失败不影响其他项目
🚀 快速开始
安装
推荐:v2.2 增强版(支持递归扫描)
# 克隆增强版(包含递归扫描功能)
git clone git@github.com:zhaokang555/sha1-hulud-scanner.git
cd sha1-hulud-scanner
chmod +x sha1-hulud-scanner.sh
使用
递归扫描多个项目
# 扫描当前目录下的所有项目
./sha1-hulud-scanner.sh -r .
# 扫描指定目录
./sha1-hulud-scanner.sh -r ~/Projects
# 扫描整个用户主目录
./sha1-hulud-scanner.sh -r ~
📊 实际效果展示
递归模式汇总报告
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 SCAN SUMMARY
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total projects scanned: 15
✅ Clean projects: 14
🚨 Compromised projects: 1
⚠️ Failed scans: 0
🚨 Compromised Projects:
• /Users/username/work/legacy-project
🔧 技术实现
扫描原理
阶段 1-3:模式匹配
使用正则表达式在不同的文件中搜索受感染的包名:
package.json中的dependencies和devDependenciesnode_modules目录结构- 各种锁文件格式(包括二进制的
bun.lock)
阶段 4:特征检测
SHA1-HULUD 攻击的一个特征是恶意包名称中包含 "sha1",扫描器会:
- 提取所有包含 "sha1" 的包名
- 与已知的合法包列表对比
- 标记可疑的包
递归扫描架构
用户调用: ./sha1-hulud-scanner.sh -r ~/Projects
↓
find_all_projects() # 查找所有 package.json 文件
↓
validate_project() # 验证每个项目
↓
scan_all_projects() # 批量扫描循环
├─ scan_single_project(project1) # 4阶段扫描
├─ scan_single_project(project2) # 容错:失败不中断
└─ scan_single_project(project3)
↓
print_summary() # 综合报告
├─ 统计信息(总数、干净、受感染、失败)
├─ 受感染项目列表
├─ 失败项目列表
└─ 修复建议
↓
exit_with_code() # 返回正确的退出码

浙公网安备 33010602011771号