DNSZLSK/muad-dib
GitHub: DNSZLSK/muad-dib
专注于npm和PyPI生态的供应链安全扫描工具,结合静态分析、动态沙箱和行为异常检测来识别恶意包。
Stars: 7 | Forks: 0
安装 |
使用 |
功能 |
VS Code |
CI/CD
法语版本
## 为什么选择 MUAD'DIB?
npm 和 PyPI 供应链攻击呈爆发式增长。Shai-Hulud 在 2025 年入侵了超过 2.5 万个代码库。现有工具可以检测威胁,但无法帮助你进行响应。
MUAD'DIB 结合了静态分析 + **反混淆引擎** (v2.2.5) + **模块间数据流** (v2.2.6) + **单文件最大评分** (v2.2.11) + 动态分析(具有 **monkey-patching preload** 的 Docker 沙箱,用于检测定时炸弹,v2.4.9)+ **行为异常检测** (v2.0) + **真值验证** (v2.1) + **安全审计**(修复了 41 个问题,v2.5.0–v2.5.6),不仅能检测威胁,还能指导你的响应 —— 甚至在它们出现在任何 IOC 数据库之前。
## 定位
MUAD'DIB 是一个教育工具和免费的第一道防线。它检测**已知**的 npm 和 PyPI 威胁(225,000+ IOC)以及基本的可疑模式。
**如需企业级保护**,请使用:
- [Socket.dev](https://socket.dev) - ML 行为分析,云端沙箱
- [Snyk](https://snyk.io) - 海量漏洞数据库,CI/CD 集成
- [Opengrep](https://opengrep.dev) - 高级数据流分析,Semgrep 规则
MUAD'DIB 不能替代这些工具。对于那些希望在安装未知包之前进行快速、免费检查的开发者,它是这些工具的补充。
## 安装
### npm (推荐)
```
npm install -g muaddib-scanner
```
### 从源码安装
```
git clone https://github.com/DNSZLSK/muad-dib
cd muad-dib
npm install
npm link
```
## 使用
### 基础扫描
```
muaddib scan .
muaddib scan /path/to/project
```
同时扫描 npm(package.json, node_modules)和 Python(requirements.txt, setup.py, pyproject.toml)依赖。
### 交互模式
```
muaddib
```
启动交互菜单,引导你使用所有功能。
### 安全安装
```
muaddib install
muaddib install lodash axios --save-dev
muaddib i express -g
muaddib install suspicious-pkg --force # Force install despite threats
```
在安装前扫描包中的威胁。拦截已知的恶意包。
### 风险评分
每次扫描显示 0-100 的风险评分:
```
[SCORE] 58/100 [***********---------] HIGH
```
### 解释模式(完整详情)
```
muaddib scan . --explain
```
显示每次检测的:
- 规则 ID
- MITRE ATT&CK 技术
- 参考资料(文章、CVE)
- 响应剧本
### 导出
```
muaddib scan . --json > results.json # JSON
muaddib scan . --html report.html # HTML
muaddib scan . --sarif results.sarif # SARIF (GitHub Security)
```
### 严重性阈值
```
muaddib scan . --fail-on critical # Fail only on CRITICAL
muaddib scan . --fail-on high # Fail on HIGH and CRITICAL (default)
muaddib scan . --fail-on medium # Fail on MEDIUM, HIGH, CRITICAL
```
### 偏执模式
```
muaddib scan . --paranoid
```
超严格的检测,容忍度更低。适用于关键项目。检测任何网络访问、子进程执行、动态代码评估和敏感文件访问。
### Discord/Slack Webhook
```
muaddib scan . --webhook "https://discord.com/api/webhooks/..."
```
向 Discord 或 Slack 发送包含评分和威胁的警报。严格过滤 (v2.1.2):仅在 IOC 匹配、沙箱确认的威胁或金丝雀令牌(canary token)泄露时发送警报 —— 减少仅基于启发式检测的噪音。
### 实时监控
```
muaddib watch .
```
### 守护进程模式
```
muaddib daemon
muaddib daemon --webhook "https://discord.com/api/webhooks/..."
```
自动监控所有 `npm install` 命令并扫描新包。
### 更新 IOC(快速,约 5 秒)
```
muaddib update
```
加载包中内置的 225,000+ 个 IOC,合并 YAML IOC 和额外的 GitHub 源(GenSecAI, DataDog)。在 `npm install` 后运行此命令可立即刷新 IOC。
### 抓取 IOC(完整,约 5 分钟)
```
muaddib scrape
```
从所有主要来源进行完整刷新。下载 npm 和 PyPI 的 OSV 批量转储(约 100-200MB)、OSSF 和所有其他来源。当你想要绝对最新的数据时运行此命令。
来源:
- **OSV.dev npm dump** - 所有 MAL-* 条目的批量下载
- **OSV.dev PyPI dump** - 所有 PyPI MAL-* 条目的批量下载
- **GenSecAI Shai-Hulud 2.0 Detector** - 700+ 个 Shai-Hulud 包的整合列表
- **DataDog Security Labs** - 来自多个供应商的整合 IOC
- **OSSF Malicious Packages** - OpenSSF 数据库(通过 OSV.dev 获取 8000+ 份报告)
- **GitHub Advisory Database** - 标记为恶意软件的公告
- **Snyk Known Malware** - 历史恶意软件包
- **Static IOCs** - Socket.dev, Phylum, npm-removed 包
### Docker 沙箱
```
muaddib sandbox
muaddib sandbox --strict
```
动态分析:在隔离的 Docker 容器中安装包,并通过 strace、tcpdump 和文件系统差异监控运行时行为。
多层监控:
- **系统追踪** (strace):文件访问、进程生成、系统调用监控
- **网络捕获** (tcpdump):DNS 解析(包含解析的 IP)、HTTP 请求(方法、主机、路径、正文)、TLS SNI 检测
- **文件系统差异**:安装前/后快照,检测在可疑位置创建的文件
- **数据泄露检测**:16 种敏感模式(令牌、凭据、SSH 密钥、私钥、.env)
- **CI 感知环境** (v2.1.2):模拟 CI 环境(GITHUB_ACTIONS, GITLAB_CI, TRAVIS, CIRCLECI, JENKINS)以触发原本会处于休眠状态的 CI 感知恶意软件
- **增强型金丝雀令牌** (v2.1.2):6 个作为环境变量注入的蜜罐凭据(GITHUB_TOKEN, NPM_TOKEN, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SLACK_WEBHOOK_URL, DISCORD_WEBHOOK_URL)。如果通过网络、DNS 或文件系统泄露,则触发 CRITICAL 警报并增加 50 分
- **Monkey-patching preload** (v2.4.9):通过 `NODE_OPTIONS=--require /opt/preload.js` 进行运行时插桩。修补时间 API(Date.now, setTimeout→0, setInterval→immediate),拦截网络/文件系统/进程/环境调用。在 [0h, 72h, 7d] 偏移量下多轮运行,以检测定时炸弹恶意软件(MITRE T1497.003)
- **评分引擎**:基于行为严重程度的 0-100 风险评分
使用 `--strict` 通过 iptables 阻止所有非必要的出站网络流量。
需要安装 Docker Desktop。
```
muaddib sandbox lodash # Safe package
muaddib sandbox suspicious-pkg # Analyze unknown package
```
### 沙箱网络报告
```
muaddib sandbox-report
muaddib sandbox-report --strict
```
与 `sandbox` 相同,但显示详细的网络报告:DNS 解析、HTTP 请求、TLS 连接、被阻止的连接(严格模式)和数据泄露警报。
### Diff(版本对比)
```
muaddib diff [ [path]
```
比较当前版本与先前 commit/tag 之间的威胁。仅显示自参考点以来引入的**新**威胁。
```
muaddib diff HEAD~1 # Compare with previous commit
muaddib diff v1.2.0 # Compare with tag
muaddib diff main # Compare with branch
muaddib diff abc1234 # Compare with specific commit
```
示例输出:
```
[MUADDIB DIFF] Comparing abc1234 -> def5678
Risk Score: 25 -> 45 (+20 worse)
Threats: 3 -> 5
NEW threats: 2
REMOVED threats: 0
Unchanged: 3
NEW THREATS (introduced since v1.2.0)
------------------------------------
1. [HIGH] suspicious_dependency
Known malicious package detected
File: package.json
```
在 CI 中使用,以便仅在出现**新**威胁时失败,而不是因为现有的技术债务:
```
- run: muaddib diff ${{ github.event.pull_request.base.sha }} --fail-on high
```
### Pre-commit 钩子
```
muaddib init-hooks [options]
```
在每次提交前自动扫描。支持多种钩子系统:
```
muaddib init-hooks # Auto-detect (husky/pre-commit/git)
muaddib init-hooks --type husky # Force husky
muaddib init-hooks --type pre-commit # Force pre-commit framework
muaddib init-hooks --type git # Force native git hooks
muaddib init-hooks --mode diff # Only block NEW threats
```
#### 使用 pre-commit 框架
添加到 `.pre-commit-config.yaml`:
```
repos:
- repo: https://github.com/DNSZLSK/muad-dib
rev: v2.5.8
hooks:
- id: muaddib-scan # Scan all threats
# - id: muaddib-diff # Or: only new threats
# - id: muaddib-paranoid # Or: ultra-strict mode
```
#### 使用 husky
```
npx husky add .husky/pre-commit "npx muaddib scan . --fail-on high"
# 或者用于 diff 模式:
npx husky add .husky/pre-commit "npx muaddib diff HEAD --fail-on high"
```
#### 移除钩子
```
muaddib remove-hooks [path]
```
移除所有 MUAD'DIB 钩子(husky 和 git 原生)。
#### 原生 git 钩子
```
muaddib init-hooks --type git
# 创建 .git/hooks/pre-commit
```
### 零日监控
MUAD'DIB 实时持续监控 npm 和 PyPI 注册表中的新包,使用 Docker 沙箱分析和 Webhook 警报自动扫描每一个新包。这在我们的基础设施内部运行 —— 检测到的威胁会输入到 IOC 数据库和威胁源 API 中。
### 评分细分
```
muaddib scan . --breakdown
```
显示可解释的评分细分:每项发现如何影响最终风险评分,包含单规则权重和严重性乘数。
### 真值回放
```
muaddib replay
muaddib ground-truth
```
针对扫描器回放真实世界的供应链攻击,以验证检测覆盖率。当前结果:**45/49 已检测 (91.8% TPR)**,来自 51 个样本(49 个活跃)。
4 个超出范围的漏检:lottie-player, polyfill-io, trojanized-jquery(仅浏览器 DOM 攻击),websocket-rat(误报风险高的模式)。
### 版本检查
MUAD'DIB 在启动时自动检查新版本,并在有更新可用时通知你。
## 功能
### Python / PyPI 支持
MUAD'DIB 自动检测并扫描 Python 项目:
- **requirements.txt** - 所有格式,包括 `-r` 递归包含、extras、环境标记
- **setup.py** - 提取 `install_requires` 和 `setup_requires`
- **pyproject.toml** - PEP 621 依赖和 Poetry 依赖
Python 包会根据 14,000+ 个已知恶意 PyPI 包(来自 OSV.dev)进行检查,并使用 PEP 503 名称规范化针对流行的 PyPI 包(requests, numpy, flask, django, pandas 等)进行拼写欺诈(typosquatting)测试。
```
[PYTHON] Detected Python project (3 dependency files)
requirements.txt: 12 packages
setup.py: 3 packages
pyproject.toml: 8 packages
[CRITICAL] PyPI IOC match: malicious-pkg (all versions)
[HIGH] PyPI typosquat: "reqeusts" looks like "requests"
```
### 拼写欺诈检测
MUAD'DIB 检测名称与流行包相似的包(npm 和 PyPI):
```
[HIGH] Package "lodahs" looks like "lodash" (swapped_chars). Possible typosquatting.
```
### 数据流分析
检测代码何时读取凭据并通过网络发送它们:
```
[CRITICAL] Suspicious flow: credential read (readFileSync, GITHUB_TOKEN) + network send (fetch)
```
### GitHub Actions 扫描
检测 `.github/workflows/` YAML 文件中的恶意模式,包括 Shai-Hulud 2.0 后门指标。
### 检测到的攻击
| 攻击活动 | 包名 | 状态 |
|----------|----------|--------|
| Shai-Hulud v1 (2025 年 9 月) | @ctrl/tinycolor, ng2-file-upload | 已检测 |
| Shai-Hulud v2 (2025 年 11 月) | @asyncapi/specs, posthog-node, kill-port | 已检测 |
| Shai-Hulud v3 (2025 年 12 月) | @vietmoney/react-big-calendar | 已检测 |
| event-stream (2018) | flatmap-stream, event-stream | 已检测 |
| eslint-scope (2018) | eslint-scope | 已检测 |
| Protestware | node-ipc, colors, faker | 已检测 |
| Typosquats | crossenv, mongose, babelcli | 已检测 |
### 检测到的技术
| 技术 | MITRE | 检测方式 |
|-----------|-------|-----------|
| 凭据窃取 (.npmrc, .ssh) | T1552.001 | AST |
| 环境变量泄露 | T1552.001 | AST |
| 远程代码执行 | T1105 | Pattern |
| 反向 Shell | T1059.004 | Pattern |
| 死人开关 | T1485 | Pattern |
| 混淆代码 | T1027 | Heuristics |
| JS 混淆模式 | T1027.002 | Pattern detection |
| 香农熵(字符串) | T1027 | Entropy calculation |
| 拼写欺诈 (npm + PyPI) | T1195.002 | Levenshtein |
| 供应链入侵 | T1195.002 | IOC matching |
| PyPI 恶意包 | T1195.002 | IOC matching |
| 沙箱动态分析 | Multiple | Docker + strace + tcpdump |
| 突然添加生命周期脚本 | T1195.002 | Temporal analysis |
| 版本间危险 API 注入 | T1195.002 | Temporal AST diff |
| 发布频率异常 | T1195.002 | Registry metadata |
| 维护者/发布者变更 | T1195.002 | Registry metadata |
| 金丝雀令牌泄露 | T1552.001 | Sandbox honey tokens |
| AI Agent 武器化 | T1059.004 | AST (s1ngularity/Nx flags) |
| AI 配置提示注入 | T1059.004 | File scanning (.cursorrules, CLAUDE.md) |
| 凭据 CLI 窃取 (gh, gcloud, aws) | T1552.001 | AST |
| 二进制投放器 (chmod + exec /tmp) | T1105 | AST |
| 原型钩子 (fetch, XMLHttpRequest) | T1557 | AST |
| 工作流注入 (.github/workflows) | T1195.002 | AST |
| 加密货币钱包窃取 | T1005 | Dataflow |
| Require 缓存污染 | T1574.001 | AST |
| 分阶段 eval 解码 (eval+atob/Buffer) | T1140 | AST |
| 反混淆(字符串拼接、charcode、base64、hex) | T1140 | AST pre-processing| 跨文件数据流(模块间泄露) | T1041 | Module graph |
## 供应链异常检测 (v2.0)
MUAD'DIB 2.0 引入了一个范式转变:从**基于 IOC 的检测**(被动,需要已知威胁)转变为**行为异常检测**(主动,通过发现可疑变更来检测未知威胁)。
传统的供应链扫描器依赖于已知恶意包的黑名单。问题在于:它们只能在威胁被识别和报告**之后**才能检测到。像 **ua-parser-js** (2021)、**event-stream** (2018) 和 **Shai-Hulud** (2025) 这样的攻击在数小时或数天内未被发现,因为当时还没有 IOC。
MUAD'DIB 2.0 增加了 5 项行为检测功能,可以通过分析包版本之间的变更,在这些攻击出现在任何 IOC 数据库**之前**捕获它们。
### 新功能
#### 1. 突发生命周期脚本检测 (`--temporal`)
检测 `preinstall`、`install` 或 `postinstall` 脚本是否突然出现在以前从未有过这些脚本的新版本包中。这是供应链攻击的头号攻击媒介。
```
muaddib scan . --temporal
```
#### 2. 时序 AST 差异 (`--temporal-ast`)
下载每个依赖项的最新两个版本,并比较它们的 AST(抽象语法树)以检测新添加的危险 API:`child_process`、`eval`、`Function`、`net.connect`、`process.env`、`fetch` 等。
```
muaddib scan . --temporal-ast
```
#### 3. 发布频率异常 (`--temporal-publish`)
检测异常的发布模式:24 小时内版本爆发、休眠 6 个月以上的包突然更新、快速版本连续(1 小时内多次发布)。
```
muaddib scan . --temporal-publish
```
#### 4. 维护者变更检测 (`--temporal-maintainer`)
检测版本之间包维护者的变更:添加了新维护者、唯一维护者被替换(event-stream 模式)、可疑的维护者名称、新发布者。
```
muaddib scan . --temporal-maintainer
```
#### 5. 金丝雀令牌 / 蜜罐令牌 (沙箱)
在安装包之前将虚假凭据注入沙箱环境。如果包尝试通过 HTTP、DNS、文件系统或 stdout 泄露这些蜜罐令牌,则将其标记为已确认的恶意软件。
注入了 6 个蜜罐凭据:
- `GITHUB_TOKEN` / `NPM_TOKEN` — 包注册表令牌
- `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` — 云凭据
- `SLACK_WEBHOOK_URL` / `DISCORD_WEBHOOK_URL` — 消息 Webhook
同时使用动态令牌(每个会话随机,来自 `canary-tokens.js`)和静态后备令牌(在 `sandbox-runner.sh` 中)以实现纵深防御。
```
muaddib sandbox suspicious-package
```
### 完整时序扫描
一次启用所有时序分析功能:
```
muaddib scan . --temporal-full
```
### 使用示例
```
# 完整行为扫描 (所有 5 个功能)
muaddib scan . --temporal-full
# 仅生命周期脚本检测
muaddib scan . --temporal
# AST diff + 维护者变更
muaddib scan . --temporal-ast --temporal-maintainer
# 带有 canary tokens 的沙箱 (默认启用)
muaddib sandbox suspicious-package
# 不带有 canary tokens 的沙箱
muaddib sandbox suspicious-package --no-canary
```
### 新检测规则 (v2.0)
| 规则 ID | 名称 | 严重性 | 功能 |
|---------|------|----------|---------|
| MUADDIB-TEMPORAL-001 | Sudden Lifecycle Script Added (Critical) | CRITICAL | `--temporal` |
| MUADDIB-TEMPORAL-002 | Sudden Lifecycle Script Added | HIGH | `--temporal` |
| MUADDIB-TEMPORAL-003 | Lifecycle Script Modified | MEDIUM | `--temporal` |
| MUADDIB-TEMPORAL-AST-001 | Dangerous API Added (Critical) | CRITICAL | `--temporal-ast` |
| MUADDIB-TEMPORAL-AST-002 | Dangerous API Added (High) | HIGH | `--temporal-ast` |
| MUADDIB-TEMPORAL-AST-003 | Dangerous API Added (Medium) | MEDIUM | `--temporal-ast` |
| MUADDIB-PUBLISH-001 | Publish Burst Detected | HIGH | `--temporal-publish` |
| MUADDIB-PUBLISH-002 | Dormant Package Spike | HIGH | `--temporal-publish` |
| MUADDIB-PUBLISH-003 | Rapid Version Succession | MEDIUM | `--temporal-publish` |
| MUADDIB-MAINTAINER-001 | New Maintainer Added | HIGH | `--temporal-maintainer` |
| MUADDIB-MAINTAINER-002 | Suspicious Maintainer Detected | CRITICAL | `--temporal-maintainer` |
| MUADDIB-MAINTAINER-003 | Sole Maintainer Changed | HIGH | `--temporal-maintainer` |
| MUADDIB-MAINTAINER-004 | New Publisher Detected | MEDIUM | `--temporal-maintainer` |
| MUADDIB-CANARY-001 | Canary Token Exfiltration | CRITICAL | sandbox |
### 为何重要
这些功能可以检测如下攻击:
- **Shai-Hulud** (2025):可以通过时序生命周期 + AST 差异捕获(突然添加 `postinstall` + `child_process`)
- **ua-parser-js** (2021):可以通过维护者变更 + 生命周期脚本检测捕获
- **event-stream** (2018):可以通过唯一维护者变更 + AST 差异(带有 `eval` 的新 `flatmap-stream` 依赖项)捕获
- **coa/rc** (2021):可以通过发布爆发 + 生命周期脚本检测捕获
所有这些都不需要任何 IOC 条目。
## IOC 来源
MUAD'DIB 仅汇总来自经过验证来源的威胁情报:
| 来源 | 类型 | 覆盖范围 |
|--------|------|----------|
| [OSV.dev npm dump](https://osv.dev) | Bulk zip | 200,000+ npm MAL-* entries |
| [OSV.dev PyPI dump](https://osv.dev) | Bulk zip | 14,000+ PyPI MAL-* entries |
| [GenSecAI Shai-Hulud Detector](https://github.com/gensecaihq/Shai-Hulud-2.0-Detector) | GitHub | 700+ Shai-Hulud packages |
| [DataDog Security Labs](https://github.com/DataDog/indicators-of-compromise) | GitHub | Consolidated IOCs from 7 vendors |
| [OSSF Malicious Packages](https://github.com/ossf/malicious-packages) | OSV API | 8000+ malware reports |
| [GitHub Advisory](https://github.com/advisories?query=type%3Amalware) | OSV API | Malware-tagged advisories |
| Snyk Known Malware | Static | Historical attacks |
| Socket.dev / Phylum | Static | Manual additions |
## VS Code
VS Code 扩展会自动扫描你的 npm 项目。
### 安装
在 VS Code 扩展中搜索 "MUAD'DIB",或者:
```
code --install-extension dnszlsk.muaddib-vscode
```
### 命令
- `MUAD'DIB: Scan Project` - 扫描整个项目
- `MUAD'DIB: Scan Current File` - 扫描当前文件
### 设置
- `muaddib.autoScan` - 打开项目时自动扫描(默认:true)
- `muaddib.webhookUrl` - Discord/Slack Webhook URL
- `muaddib.failLevel` - 警报级别
## CI/CD
### GitHub Actions (Marketplace)
使用 GitHub Marketplace 中的官方 MUAD'DIB Action:
```
name: Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
permissions:
security-events: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: DNSZLSK/muad-dib@v1
with:
path: '.'
fail-on: 'high'
sarif: 'results.sarif'
```
#### Action 输入
| 输入项 | 描述 | 默认值 |
|-------|-------------|---------|
| `path` | 要扫描的路径 | `.` |
| `fail-on` | 失败的最低严重性 | `high` |
| `sarif` | SARIF 输出文件的路径 | `` |
| `paranoid` | 启用超严格检测 | `false` |
#### Action 输出
| 输出项 | 描述 |
|--------|-------------|
| `sarif-file` | 生成的 SARIF 文件的路径 |
| `risk-score` | 风险评分 (0-100) |
| `threats-count` | 检测到的威胁数量 |
| `exit-code` | 退出代码 (0 = clean) |
警报会显示在 Security > Code scanning alerts 中。
## 架构
```
MUAD'DIB 2.5.8 Scanner
|
+-- IOC Match (225,000+ packages, JSON DB)
| +-- OSV.dev npm dump (200K+ MAL-* entries)
| +-- OSV.dev PyPI dump (14K+ MAL-* entries)
| +-- GenSecAI Shai-Hulud Detector
| +-- DataDog Consolidated IOCs
| +-- OSSF Malicious Packages (via OSV)
| +-- GitHub Advisory (malware)
| +-- Snyk Known Malware
| +-- Static IOCs (Socket, Phylum)
|
+-- Deobfuscation Pre-processing (v2.2.5, --no-deobfuscate to disable)
| +-- String concat folding, CharCode reconstruction
| +-- Base64 decode, Hex array resolution
| +-- Const propagation (Phase 2)
|
+-- Inter-module Dataflow (v2.2.6, --no-module-graph to disable)
| +-- Module dependency graph, tainted export annotation
| +-- 3-hop re-export chains, class method analysis
| +-- Cross-file credential read -> network sink detection
|
+-- 14 Parallel Scanners (113 rules)
| +-- AST Parse (acorn) — eval/Function, credential CLI theft, binary droppers, prototype hooks
| +-- Pattern Matching (shell, scripts)
| +-- Obfuscation Detection (skip .min.js, ignore hex/unicode alone)
| +-- Typosquat Detection (npm + PyPI, Levenshtein)
| +-- Python Scanner (requirements.txt, setup.py, pyproject.toml)
| +-- Shannon Entropy (string-level, 5.5 bits + 50 chars min)
| +-- JS Obfuscation Patterns (_0x* vars, encoded arrays, eval+entropy)
| +-- GitHub Actions Scanner
| +-- AI Config Scanner (.cursorrules, CLAUDE.md, copilot-instructions.md)
| +-- Package, Dependencies, Hash, npm-registry, Dataflow scanners
|
+-- Supply Chain Anomaly Detection (v2.0)
| +-- Temporal Lifecycle Script Detection (--temporal)
| +-- Temporal AST Diff (--temporal-ast)
| +-- Publish Frequency Anomaly (--temporal-publish)
| +-- Maintainer Change Detection (--temporal-maintainer)
| +-- Canary Tokens / Honey Tokens (sandbox)
|
+-- Validation & Observability (v2.1)
| +-- Datadog 17K Benchmark (88.2% raw, ~100% JS/Node.js adjusted)
| +-- Ground Truth Dataset (51 real-world attacks, 91.8% TPR)
| +-- Detection Time Logging (first_seen tracking, lead time metrics)
| +-- FP Rate Tracking (daily stats, false positive rate)
| +-- Score Breakdown (explainable per-rule scoring)
| +-- Threat Feed API (HTTP server, JSON feed for SIEM)
|
+-- FP Reduction Post-processing (v2.2.8-v2.2.9, v2.3.0-v2.3.1, v2.5.7-v2.5.8)
| +-- Count-based severity downgrade (dynamic_require, dataflow, module_compile, etc.)
| +-- Framework prototype scoring cap + HTTP client whitelist
| +-- Obfuscation in dist/build/.cjs/.mjs → LOW
| +-- Safe env var + prefix filtering
| +-- Dataflow telemetry source categorization (os.platform/arch → telemetry_read)
| +-- DEP whitelist (es5-ext, bootstrap-sass) + npm alias skip
| +-- IOC wildcard audit (v2.5.8): FPR 10.8% → 6.0%
|
+-- Per-File Max Scoring (v2.2.11)
| +-- Score = max(file_scores) + package_level_score
| +-- Eliminates score accumulation across many files
| +-- Package-level threats (lifecycle, typosquat, IOC) scored separately
|
+-- Sandbox Monkey-Patching Preload (v2.4.9)
| +-- Runtime time manipulation (Date.now, setTimeout→0, setInterval→immediate)
| +-- Network/filesystem/process/env interception and logging
| +-- Multi-run [0h, 72h, 7d] for time-bomb detection (T1497.003)
|
+-- Security Audit (v2.5.0-v2.5.6)
| +-- 41 issues remediated (14 CRITICAL, 18 HIGH, 9 MEDIUM)
| +-- Native addon path traversal, atomic writes, AST bypasses
|
+-- Paranoid Mode (ultra-strict)
+-- Docker Sandbox (behavioral analysis, network capture, canary tokens, CI-aware, preload)
+-- Zero-Day Monitor (internal: npm + PyPI RSS polling, Discord alerts, daily report)
|
v
Dataflow Analysis (credential read -> network send)
|
v
Threat Enrichment (rules, MITRE ATT&CK, playbooks)
|
v
Output (CLI, JSON, HTML, SARIF, Webhook, Threat Feed)
```
## 评估指标
| 指标 | 结果 | 详情 |
|--------|--------|---------|
| **Wild TPR** (Datadog 17K) | **88.2%** 原始 · **~100%** 调整后 | 17,922 个真实恶意软件样本。2,077 个漏检均属超出范围(见下文) |
| **TPR** (Ground Truth) | **91.8%** (45/49) | 51 个真实世界攻击(49 个活跃)。4 个超出范围:仅浏览器 (3) + 高 FP 风险 (1) |
| **FPR** (Benign, global) | **6.0%** (32/529) | 529 个 npm 包,通过 `npm pack` 获取真实源代码,阈值 > 20 |
| **ADR** (Adversarial + Holdout) | **98.8%** (82/83) | 43 个对抗性 + 40 个保留集逃避样本。1 个记录在案的漏检:`require-cache-poison`(接受的权衡) |
**Datadog 17K 基准测试** — [DataDog Malicious Software Packages Dataset](https://github.com/DataDog/malicious-software-packages-dataset),17,922 个真实恶意软件样本。原始 TPR:88.2% (15,810/17,922)。2,077 个漏检(score=0)被人工分类为:
| 类别 | 数量 | 原因 |
|----------|-------|--------|
| 钓鱼页面(HTML/CSS/JS 前端) | 1,233 | 无 Node.js API(无 `require`, `child_process`, `fs`, `process.env`)。虚假登录页面、重定向、验证码。 |
| 原生二进制文件(无 JS 文件) | 824 | 特定于平台的二进制文件(darwin-arm64, linux-x64 等)。仅 @42ailab 就有 201 个。 |
| 已修正的库 | 20 | 暂时被入侵随后修复。扫描前已移除恶意代码。 |
所有 2,077 个漏检都缺乏 Node.js 恶意软件模式。MUAD'DIB 执行基于 AST 的 Node.js 静态分析 —— 钓鱼 HTML 和原生二进制文件超出范围。针对 JS/Node.js 恶意软件的调整后 TPR:**~100%** (15,810/~15,845)。参见[评估方法](docs/EVALUATION_METHODOLOGY.md#14-datadog-17k-benchmark)。
**按包大小的 FPR** — FPR 与包大小呈线性相关。单文件最大评分 (v2.2.11) 显著降低了中型/大型包上的 FP:
| 类别 | 包数量 | FP | FPR |
|----------|----------|-----|-----|
| 小型(<10 个 JS 文件) | 290 | 18 | **6.2%** |
| 中型(10-50 个 JS 文件) | 135 | 16 | 11.9% |
| 大型(50-100 个 JS 文件) | 40 | 10 | 25.0% |
| 超大型(100+ 个 JS 文件) | 62 | 25 | 40.3% |
**FPR 演进**:0%(无效,空目录,v2.2.0-v2.2.6)→ 38%(首次实际测量,v2.2.7)→ 19.4% (v2.2.8) → 17.5% (v2.2.9) → ~13% (v2.2.11,单文件最大评分) → 8.9% (v2.3.0, P2) → 7.4% (v2.3.1, P3) → **6.0%** (v2.5.8, P4 + IOC 通配符审计)
**保留集演进**(调优前分数,规则冻结):
| 保留集 | 分数 | 重点 |
|---------|-------|-------|
| v1 | 30% (3/10) | 通用模式 |
| v2 | 40% (4/10) | Env charcode, lifecycle, prototype |
| v3 | 60% (6/10) | Require cache, DNS TXT, reverse shell |
| v4 | **80%** (8/10) | 反混淆有效性 |
| v5 | 50% (5/10) | 模块间数据流(新扫描器) |
- **Wild TPR**(Datadog 基准测试):针对来自 [DataDog Malicious Software Packages Dataset](https://github.com/DataDog/malicious-software-packages-dataset) 的 17,922 个真实恶意软件包的检测率。原始 88.2% (15,810/17,922)。排除超出范围的样本(1,233 个钓鱼 HTML 页面,824 个原生二进制文件,20 个已修正的库)后,针对 JS/Node.js 恶意软件的调整后 TPR 约为 100%。参见[评估方法](docs/EVALUATION_METHODOLOGY.md#14-datadog-17k-benchmark)。
- **TPR**(真阳性率):针对 49 个真实世界供应链攻击(event-stream, ua-parser-js coa, flatmap-stream, eslint-scope, solana-web3js 等 43 个)的检测率。4 个漏检是仅浏览器端的或修复风险较高的—— 参见[威胁模型](docs/threat-model.md)。
- **FPR**(假阳性率):529 个真实 npm 包中评分 > 20 的包比例(扫描源代码,而非空目录)。
- **ADR**(对抗性检测率):针对 83 个逃避性恶意样本的检测率 —— 43 个对抗性 + 40 个保留集(5 批次,每批 10 个,测试混淆、模块间数据流等)。1 个记录在案的漏检:`require-cache-poison`(分数 10 < 阈值 20,FP 缩减 P3 带来的可接受权衡)。
- **保留集**(调优前):规则冻结情况下对 10 个未见样本的检测率(衡量泛化能力)
数据集:17,922 个 Datadog 恶意软件样本,529 个 npm + 132 个 PyPI 良性包,83 个对抗性/保留集样本,51 个真值攻击(65 个记录在案的恶意软件包)。**1656 项测试**,86% 代码覆盖率。
完整实验方案请参见[评估方法](docs/EVALUATION_METHODOLOGY.md)。
## 贡献
### 添加 IOC
编辑 `iocs/` 中的 YAML 文件:
```
- id: NEW-MALWARE-001
name: "malicious-package"
version: "*"
severity: critical
confidence: high
source: community
description: "Threat description"
references:
- https://example.com/article
mitre: T1195.002
```
### 开发
```
git clone https://github.com/DNSZLSK/muad-dib
cd muad-dib
npm install
npm test
```
### 测试
- **1656 个单元/集成测试**,分布在 42 个模块化测试文件中 - 通过 [Codecov](https://codecov.io/gh/DNSZLSK/muad-dib) 实现了 86% 的代码覆盖率
- **56 个模糊测试** - 格式错误的 YAML、无效的 JSON、二进制文件、ReDoS、unicode、10MB 输入
- **Datadog 17K 基准测试** - 17,922 个真实恶意软件样本,88.2% 原始 TPR,针对 JS/Node.js 恶意软件约 100%(2,077 个超出范围的漏检:钓鱼、二进制文件、已修正库)
- **83 个对抗性/保留集样本** - 43 个对抗性 + 40 个保留集,82/83 检测率(98.8% ADR)。1 个记录在案的漏检:`require-cache-poison`(接受的权衡)
- **真值验证** - 51 个真实世界攻击(45/49 已检测 = 91.8% TPR)。4 个超出范围:仅浏览器 (3) + 高 FP 风险 (1)
- **假阳性验证** - 通过 `npm pack` 在真实 npm 源代码上进行的 6.0% 全局 FPR (32/529)
- **ESLint 安全审计** - 启用了 14 条规则的 `eslint-plugin-security`
## 社区
- Discord: https://discord.gg/y8zxSmue
## 文档
- [评估方法](docs/EVALUATION_METHODOLOGY.md) - 实验方案、原始保留集分数、攻击来源
- [威胁模型](docs/threat-model.md) - MUAD'DIB 能检测和不能检测什么
- [安全审计报告 v1.4.1](docs/MUADDIB_Security_Audit_Report_v1.4.1.pdf) - 完整安全审计(已修复 58 个问题)
- [IOCs YAML](iocs/) - 威胁数据库
## 许可证
MIT
]
香料必须流淌。虫子必须死。
标签:AMSI绕过, C2通信, CI/CD安全, DNS 反向解析, DNS重绑定攻击, GitHub Actions, IOCs, IP 地址批量处理, Llama, MITM代理, Monkey-Patching, Node.js安全, npm安全, PyPI安全, Shai-Hulud, typo-squatting, typosquatting, 云安全监控, 供应链攻击, 反弹Shell, 反混淆引擎, 域名仿冒, 威胁检测, 定时炸弹, 异常检测, 文档安全, 沙箱, 混淆检测, 自动笔记, 自定义脚本, 请求拦截, 软件开发工具包, 防御 evasion, 静态分析