@lateos/npm-scan 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/.dockerignore +20 -20
  2. package/.husky/pre-commit +1 -1
  3. package/CHANGELOG.md +199 -199
  4. package/LICENSING.md +19 -19
  5. package/README.de.md +708 -708
  6. package/README.fr.md +707 -707
  7. package/README.ja.md +704 -704
  8. package/README.md +826 -826
  9. package/README.zh.md +708 -708
  10. package/SECURITY.md +72 -72
  11. package/backend/cra.js +68 -68
  12. package/backend/db/schema.sql +32 -32
  13. package/backend/db.js +88 -88
  14. package/backend/detectors/atk-001-lifecycle.js +17 -17
  15. package/backend/detectors/atk-002-obfusc.js +261 -261
  16. package/backend/detectors/atk-003-creds.js +13 -13
  17. package/backend/detectors/atk-004-persist.js +13 -13
  18. package/backend/detectors/atk-005-exfil.js +13 -13
  19. package/backend/detectors/atk-006-depconf.js +14 -14
  20. package/backend/detectors/atk-007-typosquat.js +34 -34
  21. package/backend/detectors/atk-008-tarball-tamper.js +91 -91
  22. package/backend/detectors/atk-009-dormant-trigger.js +62 -62
  23. package/backend/detectors/atk-010-sandbox-evasion.js +50 -50
  24. package/backend/detectors/atk-011-transitive-prop.js +76 -76
  25. package/backend/detectors/cve-2026-48710-badhost/codePattern.js +99 -99
  26. package/backend/detectors/cve-2026-48710-badhost/findings.js +105 -105
  27. package/backend/detectors/cve-2026-48710-badhost/index.js +15 -15
  28. package/backend/detectors/cve-2026-48710-badhost/manifest.js +305 -305
  29. package/backend/detectors/cve-2026-48710-badhost/transitive.js +189 -189
  30. package/backend/detectors/hf-impersonation/index.js +396 -396
  31. package/backend/detectors/hf-impersonation/jaro-winkler.js +44 -44
  32. package/backend/detectors/hf-impersonation/known-orgs.js +5 -5
  33. package/backend/detectors/hf-impersonation/simhash.js +46 -46
  34. package/backend/detectors/index.js +75 -75
  35. package/backend/detectors/megalodon/d1-workflow-scan.js +147 -147
  36. package/backend/detectors/megalodon/d2-credential-harvest.js +61 -61
  37. package/backend/detectors/megalodon/d3-publish-velocity.js +67 -67
  38. package/backend/detectors/megalodon/d4-publisher-drift.js +124 -124
  39. package/backend/detectors/megalodon/d5-bot-commit-identity.js +3 -3
  40. package/backend/detectors/megalodon/d6-date-anachronism.js +3 -3
  41. package/backend/detectors/megalodon/index.js +80 -80
  42. package/backend/detectors/megalodon/types.js +9 -9
  43. package/backend/detectors/mini-shai-hulud/d1-burst-publish.js +42 -42
  44. package/backend/detectors/mini-shai-hulud/d2-sibling-compromise.js +116 -116
  45. package/backend/detectors/mini-shai-hulud/d3-slsa-mismatch.js +72 -72
  46. package/backend/detectors/mini-shai-hulud/d4-maintainer-anomaly.js +45 -45
  47. package/backend/detectors/mini-shai-hulud/d5-ioc-check.js +95 -95
  48. package/backend/detectors/mini-shai-hulud/d6-token-exfil.js +38 -38
  49. package/backend/detectors/mini-shai-hulud/index.js +118 -118
  50. package/backend/detectors/mini-shai-hulud/iocs.json +79 -79
  51. package/backend/fetch.js +175 -175
  52. package/backend/index.js +4 -4
  53. package/backend/license.js +89 -89
  54. package/backend/lockfile.js +379 -379
  55. package/backend/pdf.js +245 -245
  56. package/backend/policy.js +193 -193
  57. package/backend/report.js +254 -254
  58. package/backend/sbom.js +66 -66
  59. package/backend/siem/cef.js +32 -32
  60. package/backend/siem/ecs.js +40 -40
  61. package/backend/siem/index.js +18 -18
  62. package/backend/siem/qradar.js +56 -56
  63. package/backend/siem/sentinel.js +27 -27
  64. package/backend/vsix-scan/detectors/activation-event-risk.js +116 -116
  65. package/backend/vsix-scan/detectors/burst-publish.js +52 -52
  66. package/backend/vsix-scan/detectors/exfil-pattern.js +88 -88
  67. package/backend/vsix-scan/detectors/known-ioc.js +105 -105
  68. package/backend/vsix-scan/detectors/orphan-commit-fetch.js +69 -69
  69. package/backend/vsix-scan/detectors/publisher-anomaly.js +70 -70
  70. package/backend/vsix-scan/index.js +183 -183
  71. package/backend/vsix-scan/marketplace-client.js +145 -145
  72. package/backend/vsix-scan/vsix-iocs.json +31 -31
  73. package/cli/cli.js +458 -458
  74. package/deploy/helm/npm-scan/Chart.yaml +21 -21
  75. package/deploy/helm/npm-scan/templates/_helpers.tpl +8 -8
  76. package/deploy/helm/npm-scan/templates/api.yaml +93 -93
  77. package/deploy/helm/npm-scan/templates/ingress.yaml +27 -27
  78. package/deploy/helm/npm-scan/templates/postgresql.yaml +66 -66
  79. package/deploy/helm/npm-scan/templates/secrets.yaml +18 -18
  80. package/deploy/helm/npm-scan/templates/worker.yaml +31 -31
  81. package/deploy/helm/npm-scan/values.byoc.yaml +74 -74
  82. package/deploy/helm/npm-scan/values.yaml +102 -102
  83. package/package.json +57 -57
  84. package/scripts/download-corpus.js +30 -30
  85. package/scripts/gen-mal-corpus.js +34 -34
  86. package/test/fixtures/lockfiles/npm-lock.json +68 -68
  87. package/test/fixtures/lockfiles/pnpm-lock.yaml +117 -117
  88. package/test/fixtures/lockfiles/yarn.lock +103 -103
  89. package/test/fixtures/mock-data.js +69 -69
package/README.zh.md CHANGED
@@ -1,709 +1,709 @@
1
- # @lateos/npm-scan
2
-
3
- [![English](https://img.shields.io/badge/lang-en-blue?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.md)
4
- [![中文](https://img.shields.io/badge/lang-zh--CN-red?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.zh.md)
5
- [![日本語](https://img.shields.io/badge/lang-ja-purple?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.ja.md)
6
- [![Français](https://img.shields.io/badge/lang-fr-orange?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.fr.md)
7
- [![Deutsch](https://img.shields.io/badge/lang-de-green?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.de.md)
8
-
9
- [![npm version](https://img.shields.io/npm/v/@lateos/npm-scan?style=flat-square)](https://www.npmjs.com/package/@lateos/npm-scan)
10
- [![License](https://img.shields.io/badge/license-Apache%202.0%20%2B%20Commons%20Clause-blue?style=flat-square)](LICENSING.md)
11
- [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square)](package.json)
12
- [![Tests](https://img.shields.io/badge/tests-459%20passing-brightgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
13
- [![Coverage](https://img.shields.io/badge/coverage-85%25-yellowgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
14
- [![Docker](https://img.shields.io/badge/docker-lateos%2Fnpm--scan-2496ED?style=flat-square&logo=docker)](https://hub.docker.com/r/lateos/npm-scan)
15
- [![Sigstore](https://img.shields.io/static/v1?label=Sigstore&message=Provenance&color=green&style=flat-square&logo=sigstore)](https://github.com/lateos-ai/npm-scan/actions/workflows/publish.yml)
16
-
17
- **适用于 npm 生态系统的现代供应链安全工具。**
18
- 静态 + 行为分析,捕获 npm audit、Snyk 和 Socket 遗漏的威胁——混淆载荷、凭证窃取器、条件触发器、沙箱逃逸以及蠕虫式传播。
19
-
20
- ---
21
-
22
- ## 📌 问题
23
-
24
- 2025–2026 年 npm 供应链攻击浪潮证明,传统工具已无法应对。
25
-
26
- 攻击者早已超越简单的域名抢注。他们现在投放的是**混淆的预安装钩子**、**隐藏在环境检测背后的凭证窃取器**、**基于时间激活的潜伏后门**,以及通过同级依赖传播的**蠕虫式传递传播**。
27
-
28
- **Megalodon 活动**(2026 年)仅一次活动就通过虚假 GitHub PR、恶意工作流注入和云凭证外泄,攻陷了 5,500+ 个仓库。**@lateos/npm-scan** 现可开箱即用地检测此活动的痕迹。
29
-
30
- **Mini Shai-Hulud 蠕虫活动**(2026 年 5 月)分三波冲击 npm 生态系统——TanStack CI/CD 劫持(6 分钟内 84 个工件)、AntV/atool 维护者账户沦陷(300+ 个包中 600+ 个恶意版本)、以及 Nx Console VS Code 扩展投毒(CVE-2026-48027)——全部使用 ctf-scramble-v2 混淆、带 CI 环境检查的守护化持久化、针对受制裁区域的地理围栏终止开关,以及用于令牌恢复的 GitHub C2 死信通道。**@lateos/npm-scan** 现可检测横跨两个检测套件的全部 10 个 Mini Shai-Hulud 信号。
31
-
32
- 一个不断增长的攻击向量是 **HuggingFace 组织冒充**。
33
-
34
- **TrapDoor 活动**(2026 年 5 月)横跨 npm、PyPI 和 Crates.io。
35
-
36
- **node-ipc 沦陷**(2026 年 5 月 14 日)利用了一个过期的维护者邮箱域名。
37
-
38
- **大规模域名抢注活动(vpmdhaj)**(2026 年 5 月)武器化了 `vpmdhaj` npm 维护者账户,在 4 小时内发布了 14 个域名抢注包——使用预安装加载器、Bun 运行时滥用和云凭证外泄,瞄准 AWS/CI/CD 环境。**@lateos/npm-scan** 现可检测全部 3 个域名抢注活动信号。
39
-
40
- **Axios 注册表投毒活动**(2026 年 5 月)攻陷了 npm 注册表的 axios 包元数据,发布了包含跨平台 RAT 恶意载荷的 `axios@1.14.1` 和 `axios@0.30.4`。**@lateos/npm-scan** 现可检测全部 3 个 Axios 投毒信号。
41
-
42
- **npm audit** 检查已知 CVE。**Snyk** 扫描漏洞。**Socket** 分析包行为。但它们都不是为了应对 2025 年涌现的攻击而设计的。
43
-
44
- **@lateos/npm-scan** 为此而生。
45
-
46
- ---
47
-
48
- ## 🔬 为什么选择 @lateos/npm-scan?
49
-
50
- | 能力 | npm audit | Snyk | Socket | **@lateos/npm-scan** |
51
- |---|---|---|---|---|
52
- | 已知 CVE 匹配 | ✅ | ✅ | ❌ | ✅ |
53
- | 静态分析 | ❌ | ✅ | ✅ | ✅ |
54
- | 混淆载荷检测 | ❌ | ❌ | ❌ | ✅ |
55
- | AST 级启发式分析 | ❌ | ❌ | ❌ | ✅ |
56
- | 运行时行为沙箱 | ❌ | ❌ | ✅ | ✅ |
57
- | 条件触发器检测 (ATK-009) | ❌ | ❌ | ❌ | ✅ |
58
- | 沙箱逃逸检测 (ATK-010) | ❌ | ❌ | ❌ | ✅ |
59
- | 传递性蠕虫传播 (ATK-011) | ❌ | ❌ | ❌ | ✅ |
60
- | 活动检测 (Megalodon CI/CD) | ❌ | ❌ | ❌ | ✅ |
61
- | 蠕虫活动检测 (Mini Shai-Hulud 第1-3波) | ❌ | ❌ | ❌ | ✅ |
62
- | HF 模型仓库冒充 + README 克隆 | ❌ | ❌ | ❌ | ✅ |
63
- | VS Code 扩展供应链扫描 (--vsix) | ❌ | ❌ | ❌ | ✅ |
64
- | Python 漏洞检测 (CVE-2026-48710 BadHost) | ❌ | ❌ | ❌ | ✅ |
65
- | 跨生态系统攻击检测 (TrapDoor) | ❌ | ❌ | ❌ | ✅ |
66
- | 过期域名劫持检测 (node-ipc) | ❌ | ❌ | ❌ | ✅ |
67
- | 恶意软件混淆检测 (ctf-scramble-v2) | ❌ | ❌ | ❌ | ✅ |
68
- | 大规模域名抢注活动 (vpmdhaj 维护者) | ❌ | ❌ | ❌ | ✅ |
69
- | 注册表投毒检测 (axios 虚假版本) | ❌ | ❌ | ❌ | ✅ |
70
- | 攻击分类 (ATK 系列) | ❌ | ❌ | ❌ | ✅ |
71
- | SBOM 输出 (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
72
- | NIST 800-161 合规报告 | ❌ | ❌ | ❌ | ✅ |
73
- | EU CRA 合规报告 | ❌ | ❌ | ❌ | ✅ |
74
- | SIEM 导出 (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
75
- | 完全本地运行——无遥测 | ✅ | ❌ | ❌ | ✅ |
76
- | 策略即代码 (YAML 白名单) | ❌ | ❌ | ❌ | ✅ |
77
-
78
- > **隐私优先。** 所有扫描在您的机器上完成。没有代码离开您的环境。没有遥测。没有云依赖。
79
-
80
- ---
81
-
82
- ## ✨ 核心功能
83
-
84
- | 图标 | 功能 | 描述 |
85
- |------|---------|-------------|
86
- | 🕵️ | **启发式静态分析** | AST 级别检查捕获混淆、eval 链、环境探测以及基于正则的工具遗漏的可疑生命周期脚本 |
87
- | 🧠 | **行为检测** | 识别条件触发器(基于时间、CI 感知)、沙箱逃逸和潜伏激活模式 |
88
- | 🧬 | **ATK 攻击分类** | 11 种分类攻击类型,附带 NIST 800-161 映射——可版本控制、可文档化、可 PR |
89
- | 🪱 | **蠕虫活动检测** | Mini Shai-Hulud——两个套件中的 10 个子检查:突发发布、兄弟沦陷、SLSA 证明不匹配、发布者漂移、IOC 匹配、令牌外泄、ctf-scramble-v2 混淆、守护化持久化、地理终止开关、GitHub C2 死信 |
90
- | 🧩 | **VSIX 扩展扫描** | `npm-scan scan --vsix`——检测 VS Code Marketplace 供应链攻击 |
91
- | 🐍 | **Python 漏洞检测** | CVE-2026-48710 (BadHost)——Starlette Host 头注入 |
92
- | 🪤 | **跨生态系统攻击检测** | TrapDoor——9 个子检查 |
93
- | 📡 | **过期域名劫持检测** | node-ipc 沦陷——11 个子检查 |
94
- | ☣️ | **恶意软件混淆检测** | ctf-scramble-v2——扫描包 dist/lib 中的已知恶意软件混淆模式,以最高严重性 CRITICAL 停止条件立即停止分析 |
95
- | 🎭 | **大规模域名抢注活动检测** | vpmdhaj 维护者黑名单与停止条件,基于 Levenshtein 的域名抢注检测,预安装加载器识别,AWS ECS/Vault/GitHub 凭证外泄模式 |
96
- | ☠️ | **注册表投毒检测** | Axios 版本黑名单 (1.14.1/0.30.4) 与停止条件,诱饵依赖发现 (plain-crypto-js),跨平台 RAT 载荷检测 |
97
- | 🔏 | **溯源审计追踪** | Aureus-Elicitor v1.7 框架——HMAC-SHA256 签名的检测清单,内容哈希验证的审计追踪,规则溯源 URL,活动来源归属 |
98
- | 📦 | **SBOM 生成** | CycloneDX 1.5 和 SPDX 2.3,发现项嵌入为漏洞 |
99
- | 🧾 | **合规报告** | NIST SP 800-161 可追溯性矩阵 + EU 网络弹性法案映射(免费) |
100
- | 🔌 | **SIEM 导出** | Splunk CEF、Elastic ECS、Microsoft Sentinel、IBM QRadar 格式(高级版) |
101
- | 📜 | **策略即代码** | YAML/JSON 策略引擎,支持白名单、严重性覆盖、抑制和失败阈值 |
102
- | 🐳 | **Docker + GitHub Action** | 多架构镜像,一键 Compose 流水线,PR 扫描操作 |
103
- | 🛡️ | **零遥测** | 没有数据离开您的机器。没有云。没有回调。 |
104
- | 💾 | **本地扫描历史** | SQLite 驱动的持久化,零外部依赖 |
105
-
106
- ---
107
-
108
- ## ⚡ 快速开始
109
-
110
- ```bash
111
- # 全局安装
112
- npm install -g @lateos/npm-scan
113
-
114
- # 扫描单个包
115
- npm-scan scan lodash
116
-
117
- # 扫描你的锁定文件
118
- npm-scan scan-lockfile
119
-
120
- # 查看最新扫描
121
- npm-scan report
122
- ```
123
-
124
- **无需安装?没问题:**
125
-
126
- ```bash
127
- npx @lateos/npm-scan scan commander
128
- ```
129
-
130
- ---
131
-
132
- ## 🐳 在任何地方通过 Docker 运行 @lateos/npm-scan — 零安装
133
-
134
- ```bash
135
- # 拉取并运行单次扫描 — 无需 Node.js 或 npm
136
- docker run --rm lateos/npm-scan:cli scan lodash
137
-
138
- # 使用持久化存储和 Compose 的完整流水线
139
- docker compose --profile pipeline up -d
140
- ```
141
-
142
- 无需 Node.js。无需 `npm install`。无需全局包。适用于任何拥有 Docker 的系统——CI 服务器、气隙环境、Kubernetes 集群。支持 `linux/amd64` 和 `linux/arm64` 的多架构镜像。
143
-
144
- ---
145
-
146
- ## 🛡️ 政府与 SOC 2 就绪
147
-
148
- | 功能 | SOC 2 控制 | NIST 800-161 | STIG/FedRAMP 对齐 |
149
- |------|-------|--------------|--------------|
150
- | 审计日志 (--audit-log) | CC6.8 | AU-2 | ✓ |
151
- | FIPS 加密 (--fips) | CC6.1 | SC-13 | ✓ |
152
- | STIG 报告 (--stig) | CC7.3 | RA-5 | ✓ |
153
- | 离线缓存 (--cache-dir) | A1.2 | SC-8 | ✓ |
154
- | Sigstore 溯源 | CC6.2 | SI-7 | ✓ |
155
- | SBOM (SPDX/CycloneDX) | CC7.4 | SA-10 | ✓ |
156
-
157
- ```bash
158
- # 气隙环境下的完整合规扫描
159
- npm-scan scan-lockfile --cache-dir /offline/cache --audit-log /var/log/npm-scan.audit --fips
160
- npm-scan report --stig
161
- ```
162
-
163
- ---
164
-
165
- ## 📖 使用示例
166
-
167
- ### 扫描单个包
168
-
169
- ```bash
170
- # 默认 JSON 输出,包含所有发现
171
- npm-scan scan axios
172
-
173
- # 扫描时同时生成 SBOM
174
- npm-scan scan express --sbom # CycloneDX JSON
175
- npm-scan scan express --sbom xml # CycloneDX XML
176
- npm-scan scan express --sbom spdx # SPDX 2.3
177
-
178
- # 应用 YAML 策略
179
- npm-scan scan some-package --policy .npm-scan.yml
180
-
181
- # 扫描本地 tarball(无需从注册表获取)
182
- npm-scan scan --file path/to/malicious-package.tgz
183
- ```
184
-
185
- ### 扫描锁定文件
186
-
187
- ```bash
188
- # 扫描当前项目的依赖
189
- npm-scan scan-lockfile
190
-
191
- # 扫描特定锁定文件
192
- npm-scan scan-lockfile -f ./path/to/package-lock.json
193
-
194
- # 在高危或严重问题时使 CI/CD 失败(退出码 1)
195
- npm-scan scan-lockfile --fail-on high
196
-
197
- # 任何发现项都使构建失败(low 及以上)
198
- npm-scan scan-lockfile --fail-on low
199
-
200
- # 生成 SARIF v2.1 输出,用于 GitHub Advanced Security / VS Code
201
- npm-scan scan-lockfile --sarif results.sarif
202
-
203
- # 仅输出风险分数(0-10)用于仪表板/阈值
204
- npm-scan scan-lockfile --score-only
205
- ```
206
-
207
- ### 生成报告
208
-
209
- ```bash
210
- # 列出所有最近的扫描
211
- npm-scan report
212
-
213
- # 查看特定扫描
214
- npm-scan report -i 42
215
-
216
- # 生成 HTML 报告(免费),包含完整的发现项 + NIST 表格
217
- npm-scan report -i 42 --html
218
-
219
- # 打印 NIST 800-161 合规表格
220
- npm-scan report -i 42 --nist
221
-
222
- # 打印 EU CRA 合规表格
223
- npm-scan report --cra
224
-
225
- # CSV 导出用于 Excel / Sheets(审计就绪)
226
- npm-scan report --csv risks.csv
227
- npm-scan scan lodash --csv # CSV 输出到标准输出
228
-
229
- # 文本报告(免费)
230
- npm-scan report --text
231
-
232
- # PDF 报告(高级版)
233
- npm-scan report --pdf --license-key <key>
234
-
235
- # SIEM 导出(高级版)
236
- npm-scan report --siem cef # Splunk CEF
237
- npm-scan report --siem ecs # Elastic ECS
238
- npm-scan report --siem sentinel # Microsoft Sentinel
239
- npm-scan report --siem qradar # IBM QRadar
240
-
241
- # 合并所有扫描到单个报告
242
- npm-scan report --html # 所有扫描
243
- npm-scan report --pdf # 所有扫描(高级版)
244
- ```
245
-
246
- ---
247
-
248
- ## 🧬 检测能力(ATK 分类)
249
-
250
- | ID | 攻击类型 | 检测方法 | 严重性 | NIST 800-161 |
251
- |---|---|---|---|---|
252
- | **ATK-001** | 恶意生命周期脚本(`preinstall`, `postinstall`, `install`) | 静态 | 🔴 高 | SR-3.1 |
253
- | **ATK-002** | 混淆载荷投递(hex、base64、eval 链) | 静态 | 🟠 中 | SR-4.2 |
254
- | **ATK-003** | 凭证窃取(环境变量、.npmrc、SSH 密钥) | 静态 + 动态 | 🔴 高 | SR-5.3 |
255
- | **ATK-004** | 通过编辑器/配置目录持久化(.vscode、.claude、.cursor) | 静态 | 🔴 高 | SR-6.4 |
256
- | **ATK-005** | 网络外泄(GitHub API、DNS 隧道、HTTP C2) | 静态 + 动态 | ⚫ 严重 | SR-7.5 |
257
- | **ATK-006** | 依赖混淆 / 命名空间抢占 | 静态(锁定文件) | 🟠 中 | SR-2.2 |
258
- | **ATK-007** | 域名抢注(编辑距离匹配) | 静态 | 🟢 低 | SR-2.1 |
259
- | **ATK-008** | tarball 篡改(发布版 ≠ 源代码) | 静态 | 🔴 高 | SR-8.1 |
260
- | **ATK-009** | 条件/潜伏触发器(CI 检测、基于时间) | 行为 | 🔴 高 | SR-9.2 |
261
- | **ATK-010** | 沙箱逃逸 / 反分析 | 行为 | 🟠 中 | SR-10.3 |
262
- | **ATK-011** | 传递性传播(蠕虫式横向扩散) | 行为 | 🔴 高 | SR-11.4 |
263
- | **CVE-2026-48710** | BadHost — Starlette Host 头注入认证绕过 (CVE-2026-48710, CVSS 7.0)。Python 依赖版本检测 (requirements.txt, pyproject.toml, poetry.lock, Pipfile, setup.py/cfg),传递性启发式检测 (15 个已知下游包:fastapi, vllm, litellm, MCP 服务器等),auth/middleware 上下文中危险 `request.url.path` 使用的静态代码模式扫描,支持 `request.scope["path"]` 抑制 | 静态 + 注册表 | 🔴 高 / 🟠 中 / ℹ️ 信息 | SR-3.1, SR-5.3 |
264
- | **TRAPDOOR** | TrapDoor 跨生态系统攻击活动 — 活动标记 P-2024-001,trap-core.js 载荷指纹,发布者黑名单 asdxzxc,基于 Gist 的凭证窃取,AI 上下文注入(零宽 Unicode),加密/DeFi 诱饵名称,Fernet+ECDH 加密,XOR 密钥 cargo-build-helper-2026,STS/GitHub API 凭证验证 | 静态 + 注册表 | 🟠 中 / 🔴 高 / ⚫ 严重 | SR-3.1, SR-5.3, SR-7.5 |
265
- | **NODE_IPC_COMPROMISE** | node-ipc 供应链入侵(2026年5月14日)— 版本黑名单 (9.1.6/9.2.3/12.0.1) 及安全锁定,tarball SHA-256 验证,CJS 载荷 IIFE 注入检测,DNS 非标准端口 C2 模式,引导解析器 sh.azurestaticprovider.net,DNS TXT 外泄区域 bt.node.js,setImmediate() 运行时触发,~/nt-*/ 临时制品检测,未授权发布者 atiertant,锁定文件影响范围检测并推荐安全固定版本 | 静态 + 注册表 | ⚫ 严重 | SR-3.1, SR-5.3, SR-7.5 |
266
- | **MSH_SUPPLEMENT** | Mini Shai-Hulud 补充——ctf-scramble-v2 混淆(匹配即停止),守护化持久化,地理终止开关检测 (ru_RU/be_BY),C2 死信指标 (OhNoWhatsGoingOnWithGitHub) | 静态 + 行为 | ⚫ 严重 | SR-3.1, SR-7.5, SR-9.2 |
267
- | **TYPOSQUAT_VPMDHAJ** | 大规模域名抢注活动 (vpmdhaj)——维护者黑名单(匹配即停止),vpmdhaj-* 命名空间前缀检测,Levenshtein 域名抢注匹配,预安装加载器,云凭证外泄 (AWS IMDSv2, ECS, Vault, GitHub) | 静态 + 注册表 | ⚫ 严重 | SR-2.1, SR-3.1, SR-5.3 |
268
- | **AXIOS_POISONING** | Axios 注册表投毒——版本黑名单 (1.14.1/0.30.4,匹配即停止),诱饵依赖注入 (plain-crypto-js),跨平台 RAT 载荷检测 (PowerShell, launchd, systemd, DLL, C2) | 静态 + 行为 | ⚫ 严重 | SR-3.1, SR-5.3, SR-7.5 |
269
-
270
- > **如何捕获逃避式攻击:** ATK-009 检测检查 `process.env.CI`、探测主机名或使用时间激活的包。ATK-010 标记 `debugger` 语句、`os.hostname()` 探测和环境指纹采集。ATK-011 追踪同级依赖图以检测蠕虫式传播模式。
271
- > 完整逃避面文档和 PoC 示例请参阅 [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md)。
272
-
273
- ---
274
-
275
- ## 📊 输出与报告
276
-
277
- ### 格式
278
-
279
- | 格式 | 可用性 | 描述 |
280
- |--------|-------------|-------------|
281
- | JSON | ✅ 免费 | 结构化机器可读的发现项 |
282
- | HTML | ✅ 免费 | 丰富 HTML 报告,含 NIST 合规表、严重性徽章、控制矩阵 |
283
- | 文本 | ✅ 免费 | 简洁的终端友好文本报告 |
284
- | CycloneDX SBOM | ✅ 免费 | 行业标准 SBOM,发现项嵌入为漏洞 |
285
- | SPDX SBOM | ✅ 免费 | SPDX 2.3 文档格式 |
286
- | NIST 800-161 | ✅ 免费 | 控制可追溯性矩阵(SR-2.1 → SR-11.4) |
287
- | EU CRA | ✅ 免费 | 网络弹性法案条款映射 |
288
- | PDF | 🔐 高级版 | 多页 PDF,含标题页、发现项表格、NIST 合规矩阵 |
289
- | Splunk CEF | 🔐 高级版 | 用于 Splunk 导入的通用事件格式 |
290
- | Elastic ECS | 🔐 高级版 | Elastic 通用模式格式 |
291
- | Microsoft Sentinel | 🔐 高级版 | Sentinel 就绪格式化输出 |
292
- | IBM QRadar | 🔐 高级版 | QRadar DSM 就绪格式,含 QID 映射 |
293
-
294
- ### 示例输出
295
-
296
- ```json
297
- {
298
- "scanId": 1,
299
- "findings": [
300
- {
301
- "id": "ATK-003",
302
- "severity": "high",
303
- "title": "Credential harvesting",
304
- "evidence": "process.env.NPM_TOKEN detected in postinstall.js:17"
305
- }
306
- ]
307
- }
308
- ```
309
-
310
- ---
311
-
312
- ## ⚙️ 配置与高级用法
313
-
314
- ### 策略即代码
315
-
316
- 在 YAML 文件中定义白名单、严重性覆盖、抑制和失败阈值:
317
-
318
- ```yaml
319
- # .npm-scan.yml
320
- allowlist:
321
- - lodash
322
- - chalk
323
-
324
- severity_overrides:
325
- - id: ATK-001
326
- severity: medium
327
-
328
- suppress:
329
- - atk_id: ATK-009
330
- - package: some-package
331
-
332
- fail_on: high
333
- ```
334
-
335
- ```bash
336
- npm-scan scan target --policy .npm-scan.yml
337
- ```
338
-
339
- ### 环境变量
340
-
341
- | 变量 | 描述 | 默认值 |
342
- |----------|-------------|---------|
343
- | `NPM_SCAN_LICENSE_KEY` | 高级版/企业版许可证密钥 | — |
344
- | `NPM_SCAN_DATA_DIR` | 扫描历史目录 | `./.npm-scan` |
345
- | `NPM_SCAN_LOG_LEVEL` | 日志详细级别 | `info` |
346
-
347
- ### 高级版许可
348
-
349
- 请联系 leo@lateos.ai 获取高级版/企业版许可密钥。
350
-
351
- ```bash
352
- # 使用它
353
- npm-scan scan target --license-key <key>
354
- npm-scan report --pdf --license-key <key>
355
- npm-scan report --siem cef --license-key <key>
356
- ```
357
-
358
- ---
359
-
360
- ## 🔗 集成
361
-
362
- ### GitHub Actions CI(针对本仓库)
363
-
364
- 每次推送和 PR 在 Node 18、20 和 22 上运行测试:
365
-
366
- ```yaml
367
- # .github/workflows/ci.yml
368
- name: CI
369
- on:
370
- push:
371
- branches: [ main ]
372
- pull_request:
373
- branches: [ main ]
374
- jobs:
375
- test:
376
- runs-on: ubuntu-latest
377
- strategy:
378
- matrix:
379
- node-version: [18, 20, 22]
380
- steps:
381
- - uses: actions/checkout@v4
382
- - uses: actions/setup-node@v4
383
- with:
384
- node-version: ${{ matrix.node-version }}
385
- cache: 'npm'
386
- - run: npm ci
387
- - run: npm test
388
- - run: npm run test:coverage
389
- - run: node --test test/detectors-corpus.test.js
390
- - run: npm run lint
391
- - run: npm run build
392
- ```
393
-
394
- ### GitHub Action(面向下游用户)
395
-
396
- 在每个 PR 上扫描您项目的 `package-lock.json`——在它们进入生产环境之前检测域名抢注、混淆载荷、凭证窃取器和蠕虫传播:
397
-
398
- ```yaml
399
- # .github/workflows/scan.yml
400
- name: npm-scan
401
- on:
402
- pull_request:
403
- paths:
404
- - 'package-lock.json'
405
- - '**/package.json'
406
- jobs:
407
- scan:
408
- runs-on: ubuntu-latest
409
- steps:
410
- - uses: actions/checkout@v4
411
- - uses: actions/setup-node@v4
412
- with:
413
- node-version: 20
414
- - name: Scan lockfile
415
- uses: lateos/npm-scan@v1
416
- with:
417
- scan-type: lockfile
418
- fail-on: high
419
- ```
420
-
421
- #### Action 输入
422
-
423
- | 输入 | 默认值 | 描述 |
424
- |-------|---------|-------------|
425
- | `scan-type` | `lockfile` | `lockfile` 扫描 `package-lock.json` 或 `package` 扫描特定 npm 包 |
426
- | `package` | — | 包名(`scan-type=package` 时需要) |
427
- | `fail-on` | `high` | 在此严重性阈值处使工作流失败:`none`、`low`、`medium`、`high`、`critical` |
428
- | `policy-file` | — | YAML/JSON 策略文件路径,用于白名单、严重性覆盖和抑制 |
429
- | `license-key` | — | 用于 SIEM 导出和 PDF 报告的高级版许可证密钥 |
430
- | `siem-format` | — | SIEM 输出:`cef`、`ecs`、`sentinel`、`qradar`(高级版) |
431
- | `sbom-format` | — | SBOM 输出:`json`、`xml`、`spdx` |
432
-
433
- #### Action 输出
434
-
435
- | 输出 | 描述 |
436
- |--------|-------------|
437
- | `findings-count` | 检测到的发现项数量 |
438
- | `scan-id` | 扫描 ID,用于后续报告引用 |
439
-
440
- #### 示例:使用策略 + SBOM 扫描特定包
441
-
442
- ```yaml
443
- - uses: lateos/npm-scan@v1
444
- with:
445
- scan-type: package
446
- package: lodash
447
- policy-file: .npm-scan.yml
448
- sbom-format: spdx
449
- fail-on: critical
450
- ```
451
-
452
- #### 示例:使用 SIEM 导出扫描(高级版)
453
-
454
- ```yaml
455
- - uses: lateos/npm-scan@v1
456
- with:
457
- scan-type: lockfile
458
- siem-format: cef
459
- license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
460
- ```
461
-
462
- ### CI/CD 流水线
463
-
464
- 直接集成到您现有的流水线中,无需复合操作:
465
-
466
- ```bash
467
- # 扫描锁定文件,在高严重性时使构建失败
468
- npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
469
-
470
- # 扫描特定包,仅在严重时失败
471
- npm-scan scan lodash --policy .npm-scan.yml || exit 1
472
-
473
- # 生成 SBOM 作为构建产物
474
- npm-scan scan express --sbom spdx > express-sbom.spdx.json
475
-
476
- # 在 CI 中生成 HTML 合规报告
477
- npm-scan report --html > report.html
478
-
479
- # 上传报告作为产物
480
- # uses: actions/upload-artifact@v4
481
- # with:
482
- # name: npm-scan-report
483
- # path: report.html
484
- ```
485
-
486
- ### Docker
487
-
488
- 请参见上方的 [Docker 快速入门部分](#-在任何地方通过-docker-运行-lateosnpm-scan--零安装),了解拉取命令、Compose 流水线和多架构镜像。
489
-
490
- 在每个 PR 上扫描您项目的 `package-lock.json`——在它们进入生产环境之前检测域名抢注、混淆载荷、凭证窃取器和蠕虫传播:
491
-
492
- ```yaml
493
- # .github/workflows/scan.yml
494
- name: npm-scan
495
- on:
496
- pull_request:
497
- paths:
498
- - 'package-lock.json'
499
- - '**/package.json'
500
- jobs:
501
- scan:
502
- runs-on: ubuntu-latest
503
- steps:
504
- - uses: actions/checkout@v4
505
- - uses: actions/setup-node@v4
506
- with:
507
- node-version: 20
508
- - name: Scan lockfile
509
- uses: lateos/npm-scan@v1
510
- with:
511
- scan-type: lockfile
512
- fail-on: high
513
- ```
514
-
515
- #### Action 输入
516
-
517
- | 输入 | 默认值 | 描述 |
518
- |-------|---------|-------------|
519
- | `scan-type` | `lockfile` | `lockfile` 扫描 `package-lock.json` 或 `package` 扫描特定 npm 包 |
520
- | `package` | — | 包名(`scan-type=package` 时需要) |
521
- | `fail-on` | `high` | 在此严重性阈值处使工作流失败:`none`、`low`、`medium`、`high`、`critical` |
522
- | `policy-file` | — | YAML/JSON 策略文件路径,用于白名单、严重性覆盖和抑制 |
523
- | `license-key` | — | 用于 SIEM 导出和 PDF 报告的高级版许可证密钥 |
524
- | `siem-format` | — | SIEM 输出:`cef`、`ecs`、`sentinel`、`qradar`(高级版) |
525
- | `sbom-format` | — | SBOM 输出:`json`、`xml`、`spdx` |
526
-
527
- #### Action 输出
528
-
529
- | 输出 | 描述 |
530
- |--------|-------------|
531
- | `findings-count` | 检测到的发现项数量 |
532
- | `scan-id` | 扫描 ID,用于后续报告引用 |
533
-
534
- #### 示例:使用策略 + SBOM 扫描特定包
535
-
536
- ```yaml
537
- - uses: lateos/npm-scan@v1
538
- with:
539
- scan-type: package
540
- package: lodash
541
- policy-file: .npm-scan.yml
542
- sbom-format: spdx
543
- fail-on: critical
544
- ```
545
-
546
- #### 示例:使用 SIEM 导出扫描(高级版)
547
-
548
- ```yaml
549
- - uses: lateos/npm-scan@v1
550
- with:
551
- scan-type: lockfile
552
- siem-format: cef
553
- license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
554
- ```
555
-
556
- ### CI/CD 流水线
557
-
558
- 直接集成到您现有的流水线中,无需复合操作:
559
-
560
- ```bash
561
- # 扫描锁定文件,在高严重性时使构建失败
562
- npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
563
-
564
- # 扫描特定包,仅在严重时失败
565
- npm-scan scan lodash --policy .npm-scan.yml || exit 1
566
-
567
- # 生成 SBOM 作为构建产物
568
- npm-scan scan express --sbom spdx > express-sbom.spdx.json
569
-
570
- # 在 CI 中生成 HTML 合规报告
571
- npm-scan report --html > report.html
572
-
573
- # 上传报告作为产物
574
- # uses: actions/upload-artifact@v4
575
- # with:
576
- # name: npm-scan-report
577
- # path: report.html
578
- ```
579
-
580
- ### Docker
581
-
582
- 请参见上方的 [Docker 快速入门部分](#-在任何地方通过-docker-运行-lateosnpm-scan--零安装),了解拉取命令、Compose 流水线和多架构镜像。
583
-
584
- ---
585
-
586
- ## 🗺️ 路线图与企业功能
587
-
588
- ### 免费版(已发布)
589
-
590
- - 全部 11 个 ATK 检测器 + **MEGALODON** (D1-D6) + **HF_IMPERSONATION** + **MINI_SHAI_HULUD** (D1-D7, 3 波,含 **MSH_SUPPLEMENT** D1-D4) + **VSIX_SCAN** (6 个检测器) + **CVE-2026-48710 (BadHost)** (3 层) + **TRAPDOOR** (9 条规则) + **NODE_IPC_COMPROMISE** (11 条规则) + **TYPOSQUAT_VPMDHAJ** (3 条规则) + **AXIOS_POISONING** (3 条规则)
591
- - SBOM 输出(CycloneDX + SPDX)
592
- - HTML、文本和合规报告(NIST + EU CRA)
593
- - 策略即代码引擎(YAML)
594
- - 本地 SQLite 扫描历史
595
- - GitHub Action
596
- - Docker 镜像 + Compose 流水线
597
-
598
- ### 高级版(🔐 许可证密钥)
599
-
600
- - PDF 合规报告,含 NIST 可追溯性矩阵
601
- - SIEM 导出(Splunk CEF、Elastic ECS、Microsoft Sentinel、IBM QRadar)
602
- - 动态沙箱(基于 gVisor — ATK-008–010)
603
- - 可达性分析(调用图过滤)
604
-
605
- ### 企业版(🏢 自定义许可证)
606
-
607
- - SAML 2.0 SSO(Okta、Azure AD、OneLogin、Keycloak)
608
- - REST API + webhooks(FastAPI)
609
- - 团队 RBAC + 审计日志
610
- - 用于 Kubernetes 部署的 Helm Chart
611
- - 用于托管/团队版的 PostgreSQL 后端
612
- - SLA 保障的优先支持
613
-
614
- ---
615
-
616
- ## 🤝 贡献
617
-
618
- 我们欢迎贡献——特别是新的检测器、改进的逃避抵抗能力和合规模板。
619
-
620
- 请参阅 [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) 了解 ATK 治理流程。每个新的检测器需要:
621
-
622
- 1. 概念验证样本
623
- 2. 附带测试的检测规则
624
- 3. 对前 500 个 npm 包的误报分析
625
- 4. NIST 800-161 控制映射
626
-
627
- ### 测试
628
-
629
- 该项目使用 **Node.js 原生测试运行器**(`node:test` + `assert/strict`)。
630
-
631
- ```bash
632
- # 运行所有测试
633
- npm test
634
-
635
- # 运行测试并带覆盖率
636
- npm run test:coverage
637
-
638
- # 运行测试并带详细输出
639
- npm run test:verbose
640
-
641
- # 运行本地恶意/清洁语料库(无需网络)
642
- node --test test/detectors-corpus.test.js
643
- ```
644
-
645
- **测试结构:**
646
- - `test/fixtures/mock-data.js` — 共享的模拟扫描、包和代码片段
647
- - `test/db.test.js` — 数据库 CRUD(保存、查询、持久化)
648
- - `test/detectors-edge-cases.test.js` — 每个检测器的边界测试(无操作、清洁清除、严重性)
649
- - `test/detectors-corpus.test.js` — 33 个恶意 + 50 个清洁 tarball 集成测试(离线)
650
- - `test/fetch.test.js` — tarball 提取、临时目录清理
651
- - `test/policy-edge-cases.test.js` — 抑制、覆盖、加载验证的边缘情况
652
- - `test/report-snapshots.test.js` — HTML/文本/CRA/PDF 格式断言
653
- - `test/cve-2026-48710-badhost/manifest.test.js` — 13 个 Python 清单解析测试(requirements.txt, pyproject.toml, poetry.lock, 版本边界情况)
654
- - `test/cve-2026-48710-badhost/transitive.test.js` — 7 个传递性依赖测试(Tier 1/2, fastapi 版本门控, 固定版本抑制)
655
- - `test/cve-2026-48710-badhost/codePattern.test.js` — 6 个静态代码模式测试(auth 上下文, INFO 穿透, scope 抑制)
656
- - `test/cve-2026-48710-badhost/integration.test.js` — 4 个集成测试(端到端复合发现项, 清洁项目, 无 Python 文件)
657
- - `test/trapdoor.test.js` — 40 个 TrapDoor 活动检测测试(D1–D9:活动标记、载荷指纹、发布者黑名单、Gist 外泄、AI 注入、诱饵名称、加密原语、XOR 密钥、凭证验证)
658
- - `test/node-ipc.test.js` — 37 个 node-ipc 入侵检测测试(D1–D11:版本黑名单、tarball 哈希、CJS 注入、载荷哈希、DNS C2 模式、引导解析器、DNS TXT 外泄、运行时触发、临时制品、未授权发布者、影响范围)
659
- - `test/msh-supplement.test.js`——17 个 MSH 补充测试 (ctf-scramble-v2 停止,守护化,地理终止开关,C2 死信)
660
- - `test/typosquat-vpmdhaj.test.js`——16 个域名抢注活动测试 (维护者阻止,前缀检测,Levenshtein,预安装加载器,Bun 加载器,AWS/ECS/Vault/GitHub 凭证外泄)
661
- - `test/axios-poisoning.test.js`——13 个 Axios 投毒测试 (版本黑名单停止,诱饵依赖,加密启发式,跨平台 RAT,C2 回调)
662
- - `test/cli.test.js` — commander 集成测试(帮助、版本、扫描、报告、错误处理)
663
-
664
- ### 需要帮助?
665
-
666
- - 🔒 查看[安全策略](SECURITY.md)了解漏洞披露流程
667
- - 📖 阅读[项目计划](docs/project-plan.md)
668
- - 🧬 查看[攻击分类](docs/attack-taxonomy.md)
669
- - 🐛 提交 issue 或 PR
670
-
671
- ---
672
-
673
- ## 📄 许可证
674
-
675
- Apache-2.0 核心 + Commons Clause。
676
- 请参阅 [`LICENSING.md`](LICENSING.md) 了解免费版和高级版功能之间的确切界限。
677
-
678
- ---
679
-
680
- ## 👤 关于维护者
681
-
682
- **Roongrunchai Chongolnee** — `@lateos/npm-scan` 的创建者和维护者。持有 CISSP、CEH、思科安全、AWS 云从业者认证的安全专业人士,在飞利浦拥有十年的基础设施和应用安全经验。我构建这个工具是为了让开源社区拥有一个实用、检测器驱动的供应链恶意软件防御方案——我致力于保持其透明、社区拥有和持续改进。
683
-
684
- [![LinkedIn](https://img.shields.io/badge/LinkedIn-0A66C2?style=flat-square&logo=linkedin)](https://www.linkedin.com/in/roongrunchai-chong-c-ab9742108/)
685
- [![GitHub](https://img.shields.io/badge/GitHub-lateos--ai-181717?style=flat-square&logo=github)](https://github.com/lateos-ai/npm-scan)
686
-
687
- 欢迎提交 issue、想法和 PR——安全在协作中最强大。
688
-
689
- ---
690
-
691
- ```
692
- @lateos/npm-scan — npm supply chain security scanner
693
- Copyright (C) 2026 Lateos
694
-
695
- Licensed under the Apache License, Version 2.0 (the "License");
696
- you may not use this file except in compliance with the License.
697
-
698
- Unless required by applicable law or agreed to in writing, software
699
- distributed under the License is distributed on an "AS IS" BASIS,
700
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
701
- ```
702
-
703
- ---
704
-
705
- **立即扫描您的第一个包:**
706
-
707
- ```bash
708
- npx @lateos/npm-scan scan lodash
1
+ # @lateos/npm-scan
2
+
3
+ [![English](https://img.shields.io/badge/lang-en-blue?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.md)
4
+ [![中文](https://img.shields.io/badge/lang-zh--CN-red?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.zh.md)
5
+ [![日本語](https://img.shields.io/badge/lang-ja-purple?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.ja.md)
6
+ [![Français](https://img.shields.io/badge/lang-fr-orange?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.fr.md)
7
+ [![Deutsch](https://img.shields.io/badge/lang-de-green?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.de.md)
8
+
9
+ [![npm version](https://img.shields.io/npm/v/@lateos/npm-scan?style=flat-square)](https://www.npmjs.com/package/@lateos/npm-scan)
10
+ [![License](https://img.shields.io/badge/license-Apache%202.0%20%2B%20Commons%20Clause-blue?style=flat-square)](LICENSING.md)
11
+ [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square)](package.json)
12
+ [![Tests](https://img.shields.io/badge/tests-459%20passing-brightgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
13
+ [![Coverage](https://img.shields.io/badge/coverage-85%25-yellowgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
14
+ [![Docker](https://img.shields.io/badge/docker-lateos%2Fnpm--scan-2496ED?style=flat-square&logo=docker)](https://hub.docker.com/r/lateos/npm-scan)
15
+ [![Sigstore](https://img.shields.io/static/v1?label=Sigstore&message=Provenance&color=green&style=flat-square&logo=sigstore)](https://github.com/lateos-ai/npm-scan/actions/workflows/publish.yml)
16
+
17
+ **适用于 npm 生态系统的现代供应链安全工具。**
18
+ 静态 + 行为分析,捕获 npm audit、Snyk 和 Socket 遗漏的威胁——混淆载荷、凭证窃取器、条件触发器、沙箱逃逸以及蠕虫式传播。
19
+
20
+ ---
21
+
22
+ ## 📌 问题
23
+
24
+ 2025–2026 年 npm 供应链攻击浪潮证明,传统工具已无法应对。
25
+
26
+ 攻击者早已超越简单的域名抢注。他们现在投放的是**混淆的预安装钩子**、**隐藏在环境检测背后的凭证窃取器**、**基于时间激活的潜伏后门**,以及通过同级依赖传播的**蠕虫式传递传播**。
27
+
28
+ **Megalodon 活动**(2026 年)仅一次活动就通过虚假 GitHub PR、恶意工作流注入和云凭证外泄,攻陷了 5,500+ 个仓库。**@lateos/npm-scan** 现可开箱即用地检测此活动的痕迹。
29
+
30
+ **Mini Shai-Hulud 蠕虫活动**(2026 年 5 月)分三波冲击 npm 生态系统——TanStack CI/CD 劫持(6 分钟内 84 个工件)、AntV/atool 维护者账户沦陷(300+ 个包中 600+ 个恶意版本)、以及 Nx Console VS Code 扩展投毒(CVE-2026-48027)——全部使用 ctf-scramble-v2 混淆、带 CI 环境检查的守护化持久化、针对受制裁区域的地理围栏终止开关,以及用于令牌恢复的 GitHub C2 死信通道。**@lateos/npm-scan** 现可检测横跨两个检测套件的全部 10 个 Mini Shai-Hulud 信号。
31
+
32
+ 一个不断增长的攻击向量是 **HuggingFace 组织冒充**。
33
+
34
+ **TrapDoor 活动**(2026 年 5 月)横跨 npm、PyPI 和 Crates.io。
35
+
36
+ **node-ipc 沦陷**(2026 年 5 月 14 日)利用了一个过期的维护者邮箱域名。
37
+
38
+ **大规模域名抢注活动(vpmdhaj)**(2026 年 5 月)武器化了 `vpmdhaj` npm 维护者账户,在 4 小时内发布了 14 个域名抢注包——使用预安装加载器、Bun 运行时滥用和云凭证外泄,瞄准 AWS/CI/CD 环境。**@lateos/npm-scan** 现可检测全部 3 个域名抢注活动信号。
39
+
40
+ **Axios 注册表投毒活动**(2026 年 5 月)攻陷了 npm 注册表的 axios 包元数据,发布了包含跨平台 RAT 恶意载荷的 `axios@1.14.1` 和 `axios@0.30.4`。**@lateos/npm-scan** 现可检测全部 3 个 Axios 投毒信号。
41
+
42
+ **npm audit** 检查已知 CVE。**Snyk** 扫描漏洞。**Socket** 分析包行为。但它们都不是为了应对 2025 年涌现的攻击而设计的。
43
+
44
+ **@lateos/npm-scan** 为此而生。
45
+
46
+ ---
47
+
48
+ ## 🔬 为什么选择 @lateos/npm-scan?
49
+
50
+ | 能力 | npm audit | Snyk | Socket | **@lateos/npm-scan** |
51
+ |---|---|---|---|---|
52
+ | 已知 CVE 匹配 | ✅ | ✅ | ❌ | ✅ |
53
+ | 静态分析 | ❌ | ✅ | ✅ | ✅ |
54
+ | 混淆载荷检测 | ❌ | ❌ | ❌ | ✅ |
55
+ | AST 级启发式分析 | ❌ | ❌ | ❌ | ✅ |
56
+ | 运行时行为沙箱 | ❌ | ❌ | ✅ | ✅ |
57
+ | 条件触发器检测 (ATK-009) | ❌ | ❌ | ❌ | ✅ |
58
+ | 沙箱逃逸检测 (ATK-010) | ❌ | ❌ | ❌ | ✅ |
59
+ | 传递性蠕虫传播 (ATK-011) | ❌ | ❌ | ❌ | ✅ |
60
+ | 活动检测 (Megalodon CI/CD) | ❌ | ❌ | ❌ | ✅ |
61
+ | 蠕虫活动检测 (Mini Shai-Hulud 第1-3波) | ❌ | ❌ | ❌ | ✅ |
62
+ | HF 模型仓库冒充 + README 克隆 | ❌ | ❌ | ❌ | ✅ |
63
+ | VS Code 扩展供应链扫描 (--vsix) | ❌ | ❌ | ❌ | ✅ |
64
+ | Python 漏洞检测 (CVE-2026-48710 BadHost) | ❌ | ❌ | ❌ | ✅ |
65
+ | 跨生态系统攻击检测 (TrapDoor) | ❌ | ❌ | ❌ | ✅ |
66
+ | 过期域名劫持检测 (node-ipc) | ❌ | ❌ | ❌ | ✅ |
67
+ | 恶意软件混淆检测 (ctf-scramble-v2) | ❌ | ❌ | ❌ | ✅ |
68
+ | 大规模域名抢注活动 (vpmdhaj 维护者) | ❌ | ❌ | ❌ | ✅ |
69
+ | 注册表投毒检测 (axios 虚假版本) | ❌ | ❌ | ❌ | ✅ |
70
+ | 攻击分类 (ATK 系列) | ❌ | ❌ | ❌ | ✅ |
71
+ | SBOM 输出 (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
72
+ | NIST 800-161 合规报告 | ❌ | ❌ | ❌ | ✅ |
73
+ | EU CRA 合规报告 | ❌ | ❌ | ❌ | ✅ |
74
+ | SIEM 导出 (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
75
+ | 完全本地运行——无遥测 | ✅ | ❌ | ❌ | ✅ |
76
+ | 策略即代码 (YAML 白名单) | ❌ | ❌ | ❌ | ✅ |
77
+
78
+ > **隐私优先。** 所有扫描在您的机器上完成。没有代码离开您的环境。没有遥测。没有云依赖。
79
+
80
+ ---
81
+
82
+ ## ✨ 核心功能
83
+
84
+ | 图标 | 功能 | 描述 |
85
+ |------|---------|-------------|
86
+ | 🕵️ | **启发式静态分析** | AST 级别检查捕获混淆、eval 链、环境探测以及基于正则的工具遗漏的可疑生命周期脚本 |
87
+ | 🧠 | **行为检测** | 识别条件触发器(基于时间、CI 感知)、沙箱逃逸和潜伏激活模式 |
88
+ | 🧬 | **ATK 攻击分类** | 11 种分类攻击类型,附带 NIST 800-161 映射——可版本控制、可文档化、可 PR |
89
+ | 🪱 | **蠕虫活动检测** | Mini Shai-Hulud——两个套件中的 10 个子检查:突发发布、兄弟沦陷、SLSA 证明不匹配、发布者漂移、IOC 匹配、令牌外泄、ctf-scramble-v2 混淆、守护化持久化、地理终止开关、GitHub C2 死信 |
90
+ | 🧩 | **VSIX 扩展扫描** | `npm-scan scan --vsix`——检测 VS Code Marketplace 供应链攻击 |
91
+ | 🐍 | **Python 漏洞检测** | CVE-2026-48710 (BadHost)——Starlette Host 头注入 |
92
+ | 🪤 | **跨生态系统攻击检测** | TrapDoor——9 个子检查 |
93
+ | 📡 | **过期域名劫持检测** | node-ipc 沦陷——11 个子检查 |
94
+ | ☣️ | **恶意软件混淆检测** | ctf-scramble-v2——扫描包 dist/lib 中的已知恶意软件混淆模式,以最高严重性 CRITICAL 停止条件立即停止分析 |
95
+ | 🎭 | **大规模域名抢注活动检测** | vpmdhaj 维护者黑名单与停止条件,基于 Levenshtein 的域名抢注检测,预安装加载器识别,AWS ECS/Vault/GitHub 凭证外泄模式 |
96
+ | ☠️ | **注册表投毒检测** | Axios 版本黑名单 (1.14.1/0.30.4) 与停止条件,诱饵依赖发现 (plain-crypto-js),跨平台 RAT 载荷检测 |
97
+ | 🔏 | **溯源审计追踪** | Aureus-Elicitor v1.7 框架——HMAC-SHA256 签名的检测清单,内容哈希验证的审计追踪,规则溯源 URL,活动来源归属 |
98
+ | 📦 | **SBOM 生成** | CycloneDX 1.5 和 SPDX 2.3,发现项嵌入为漏洞 |
99
+ | 🧾 | **合规报告** | NIST SP 800-161 可追溯性矩阵 + EU 网络弹性法案映射(免费) |
100
+ | 🔌 | **SIEM 导出** | Splunk CEF、Elastic ECS、Microsoft Sentinel、IBM QRadar 格式(高级版) |
101
+ | 📜 | **策略即代码** | YAML/JSON 策略引擎,支持白名单、严重性覆盖、抑制和失败阈值 |
102
+ | 🐳 | **Docker + GitHub Action** | 多架构镜像,一键 Compose 流水线,PR 扫描操作 |
103
+ | 🛡️ | **零遥测** | 没有数据离开您的机器。没有云。没有回调。 |
104
+ | 💾 | **本地扫描历史** | SQLite 驱动的持久化,零外部依赖 |
105
+
106
+ ---
107
+
108
+ ## ⚡ 快速开始
109
+
110
+ ```bash
111
+ # 全局安装
112
+ npm install -g @lateos/npm-scan
113
+
114
+ # 扫描单个包
115
+ npm-scan scan lodash
116
+
117
+ # 扫描你的锁定文件
118
+ npm-scan scan-lockfile
119
+
120
+ # 查看最新扫描
121
+ npm-scan report
122
+ ```
123
+
124
+ **无需安装?没问题:**
125
+
126
+ ```bash
127
+ npx @lateos/npm-scan scan commander
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 🐳 在任何地方通过 Docker 运行 @lateos/npm-scan — 零安装
133
+
134
+ ```bash
135
+ # 拉取并运行单次扫描 — 无需 Node.js 或 npm
136
+ docker run --rm lateos/npm-scan:cli scan lodash
137
+
138
+ # 使用持久化存储和 Compose 的完整流水线
139
+ docker compose --profile pipeline up -d
140
+ ```
141
+
142
+ 无需 Node.js。无需 `npm install`。无需全局包。适用于任何拥有 Docker 的系统——CI 服务器、气隙环境、Kubernetes 集群。支持 `linux/amd64` 和 `linux/arm64` 的多架构镜像。
143
+
144
+ ---
145
+
146
+ ## 🛡️ 政府与 SOC 2 就绪
147
+
148
+ | 功能 | SOC 2 控制 | NIST 800-161 | STIG/FedRAMP 对齐 |
149
+ |------|-------|--------------|--------------|
150
+ | 审计日志 (--audit-log) | CC6.8 | AU-2 | ✓ |
151
+ | FIPS 加密 (--fips) | CC6.1 | SC-13 | ✓ |
152
+ | STIG 报告 (--stig) | CC7.3 | RA-5 | ✓ |
153
+ | 离线缓存 (--cache-dir) | A1.2 | SC-8 | ✓ |
154
+ | Sigstore 溯源 | CC6.2 | SI-7 | ✓ |
155
+ | SBOM (SPDX/CycloneDX) | CC7.4 | SA-10 | ✓ |
156
+
157
+ ```bash
158
+ # 气隙环境下的完整合规扫描
159
+ npm-scan scan-lockfile --cache-dir /offline/cache --audit-log /var/log/npm-scan.audit --fips
160
+ npm-scan report --stig
161
+ ```
162
+
163
+ ---
164
+
165
+ ## 📖 使用示例
166
+
167
+ ### 扫描单个包
168
+
169
+ ```bash
170
+ # 默认 JSON 输出,包含所有发现
171
+ npm-scan scan axios
172
+
173
+ # 扫描时同时生成 SBOM
174
+ npm-scan scan express --sbom # CycloneDX JSON
175
+ npm-scan scan express --sbom xml # CycloneDX XML
176
+ npm-scan scan express --sbom spdx # SPDX 2.3
177
+
178
+ # 应用 YAML 策略
179
+ npm-scan scan some-package --policy .npm-scan.yml
180
+
181
+ # 扫描本地 tarball(无需从注册表获取)
182
+ npm-scan scan --file path/to/malicious-package.tgz
183
+ ```
184
+
185
+ ### 扫描锁定文件
186
+
187
+ ```bash
188
+ # 扫描当前项目的依赖
189
+ npm-scan scan-lockfile
190
+
191
+ # 扫描特定锁定文件
192
+ npm-scan scan-lockfile -f ./path/to/package-lock.json
193
+
194
+ # 在高危或严重问题时使 CI/CD 失败(退出码 1)
195
+ npm-scan scan-lockfile --fail-on high
196
+
197
+ # 任何发现项都使构建失败(low 及以上)
198
+ npm-scan scan-lockfile --fail-on low
199
+
200
+ # 生成 SARIF v2.1 输出,用于 GitHub Advanced Security / VS Code
201
+ npm-scan scan-lockfile --sarif results.sarif
202
+
203
+ # 仅输出风险分数(0-10)用于仪表板/阈值
204
+ npm-scan scan-lockfile --score-only
205
+ ```
206
+
207
+ ### 生成报告
208
+
209
+ ```bash
210
+ # 列出所有最近的扫描
211
+ npm-scan report
212
+
213
+ # 查看特定扫描
214
+ npm-scan report -i 42
215
+
216
+ # 生成 HTML 报告(免费),包含完整的发现项 + NIST 表格
217
+ npm-scan report -i 42 --html
218
+
219
+ # 打印 NIST 800-161 合规表格
220
+ npm-scan report -i 42 --nist
221
+
222
+ # 打印 EU CRA 合规表格
223
+ npm-scan report --cra
224
+
225
+ # CSV 导出用于 Excel / Sheets(审计就绪)
226
+ npm-scan report --csv risks.csv
227
+ npm-scan scan lodash --csv # CSV 输出到标准输出
228
+
229
+ # 文本报告(免费)
230
+ npm-scan report --text
231
+
232
+ # PDF 报告(高级版)
233
+ npm-scan report --pdf --license-key <key>
234
+
235
+ # SIEM 导出(高级版)
236
+ npm-scan report --siem cef # Splunk CEF
237
+ npm-scan report --siem ecs # Elastic ECS
238
+ npm-scan report --siem sentinel # Microsoft Sentinel
239
+ npm-scan report --siem qradar # IBM QRadar
240
+
241
+ # 合并所有扫描到单个报告
242
+ npm-scan report --html # 所有扫描
243
+ npm-scan report --pdf # 所有扫描(高级版)
244
+ ```
245
+
246
+ ---
247
+
248
+ ## 🧬 检测能力(ATK 分类)
249
+
250
+ | ID | 攻击类型 | 检测方法 | 严重性 | NIST 800-161 |
251
+ |---|---|---|---|---|
252
+ | **ATK-001** | 恶意生命周期脚本(`preinstall`, `postinstall`, `install`) | 静态 | 🔴 高 | SR-3.1 |
253
+ | **ATK-002** | 混淆载荷投递(hex、base64、eval 链) | 静态 | 🟠 中 | SR-4.2 |
254
+ | **ATK-003** | 凭证窃取(环境变量、.npmrc、SSH 密钥) | 静态 + 动态 | 🔴 高 | SR-5.3 |
255
+ | **ATK-004** | 通过编辑器/配置目录持久化(.vscode、.claude、.cursor) | 静态 | 🔴 高 | SR-6.4 |
256
+ | **ATK-005** | 网络外泄(GitHub API、DNS 隧道、HTTP C2) | 静态 + 动态 | ⚫ 严重 | SR-7.5 |
257
+ | **ATK-006** | 依赖混淆 / 命名空间抢占 | 静态(锁定文件) | 🟠 中 | SR-2.2 |
258
+ | **ATK-007** | 域名抢注(编辑距离匹配) | 静态 | 🟢 低 | SR-2.1 |
259
+ | **ATK-008** | tarball 篡改(发布版 ≠ 源代码) | 静态 | 🔴 高 | SR-8.1 |
260
+ | **ATK-009** | 条件/潜伏触发器(CI 检测、基于时间) | 行为 | 🔴 高 | SR-9.2 |
261
+ | **ATK-010** | 沙箱逃逸 / 反分析 | 行为 | 🟠 中 | SR-10.3 |
262
+ | **ATK-011** | 传递性传播(蠕虫式横向扩散) | 行为 | 🔴 高 | SR-11.4 |
263
+ | **CVE-2026-48710** | BadHost — Starlette Host 头注入认证绕过 (CVE-2026-48710, CVSS 7.0)。Python 依赖版本检测 (requirements.txt, pyproject.toml, poetry.lock, Pipfile, setup.py/cfg),传递性启发式检测 (15 个已知下游包:fastapi, vllm, litellm, MCP 服务器等),auth/middleware 上下文中危险 `request.url.path` 使用的静态代码模式扫描,支持 `request.scope["path"]` 抑制 | 静态 + 注册表 | 🔴 高 / 🟠 中 / ℹ️ 信息 | SR-3.1, SR-5.3 |
264
+ | **TRAPDOOR** | TrapDoor 跨生态系统攻击活动 — 活动标记 P-2024-001,trap-core.js 载荷指纹,发布者黑名单 asdxzxc,基于 Gist 的凭证窃取,AI 上下文注入(零宽 Unicode),加密/DeFi 诱饵名称,Fernet+ECDH 加密,XOR 密钥 cargo-build-helper-2026,STS/GitHub API 凭证验证 | 静态 + 注册表 | 🟠 中 / 🔴 高 / ⚫ 严重 | SR-3.1, SR-5.3, SR-7.5 |
265
+ | **NODE_IPC_COMPROMISE** | node-ipc 供应链入侵(2026年5月14日)— 版本黑名单 (9.1.6/9.2.3/12.0.1) 及安全锁定,tarball SHA-256 验证,CJS 载荷 IIFE 注入检测,DNS 非标准端口 C2 模式,引导解析器 sh.azurestaticprovider.net,DNS TXT 外泄区域 bt.node.js,setImmediate() 运行时触发,~/nt-*/ 临时制品检测,未授权发布者 atiertant,锁定文件影响范围检测并推荐安全固定版本 | 静态 + 注册表 | ⚫ 严重 | SR-3.1, SR-5.3, SR-7.5 |
266
+ | **MSH_SUPPLEMENT** | Mini Shai-Hulud 补充——ctf-scramble-v2 混淆(匹配即停止),守护化持久化,地理终止开关检测 (ru_RU/be_BY),C2 死信指标 (OhNoWhatsGoingOnWithGitHub) | 静态 + 行为 | ⚫ 严重 | SR-3.1, SR-7.5, SR-9.2 |
267
+ | **TYPOSQUAT_VPMDHAJ** | 大规模域名抢注活动 (vpmdhaj)——维护者黑名单(匹配即停止),vpmdhaj-* 命名空间前缀检测,Levenshtein 域名抢注匹配,预安装加载器,云凭证外泄 (AWS IMDSv2, ECS, Vault, GitHub) | 静态 + 注册表 | ⚫ 严重 | SR-2.1, SR-3.1, SR-5.3 |
268
+ | **AXIOS_POISONING** | Axios 注册表投毒——版本黑名单 (1.14.1/0.30.4,匹配即停止),诱饵依赖注入 (plain-crypto-js),跨平台 RAT 载荷检测 (PowerShell, launchd, systemd, DLL, C2) | 静态 + 行为 | ⚫ 严重 | SR-3.1, SR-5.3, SR-7.5 |
269
+
270
+ > **如何捕获逃避式攻击:** ATK-009 检测检查 `process.env.CI`、探测主机名或使用时间激活的包。ATK-010 标记 `debugger` 语句、`os.hostname()` 探测和环境指纹采集。ATK-011 追踪同级依赖图以检测蠕虫式传播模式。
271
+ > 完整逃避面文档和 PoC 示例请参阅 [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md)。
272
+
273
+ ---
274
+
275
+ ## 📊 输出与报告
276
+
277
+ ### 格式
278
+
279
+ | 格式 | 可用性 | 描述 |
280
+ |--------|-------------|-------------|
281
+ | JSON | ✅ 免费 | 结构化机器可读的发现项 |
282
+ | HTML | ✅ 免费 | 丰富 HTML 报告,含 NIST 合规表、严重性徽章、控制矩阵 |
283
+ | 文本 | ✅ 免费 | 简洁的终端友好文本报告 |
284
+ | CycloneDX SBOM | ✅ 免费 | 行业标准 SBOM,发现项嵌入为漏洞 |
285
+ | SPDX SBOM | ✅ 免费 | SPDX 2.3 文档格式 |
286
+ | NIST 800-161 | ✅ 免费 | 控制可追溯性矩阵(SR-2.1 → SR-11.4) |
287
+ | EU CRA | ✅ 免费 | 网络弹性法案条款映射 |
288
+ | PDF | 🔐 高级版 | 多页 PDF,含标题页、发现项表格、NIST 合规矩阵 |
289
+ | Splunk CEF | 🔐 高级版 | 用于 Splunk 导入的通用事件格式 |
290
+ | Elastic ECS | 🔐 高级版 | Elastic 通用模式格式 |
291
+ | Microsoft Sentinel | 🔐 高级版 | Sentinel 就绪格式化输出 |
292
+ | IBM QRadar | 🔐 高级版 | QRadar DSM 就绪格式,含 QID 映射 |
293
+
294
+ ### 示例输出
295
+
296
+ ```json
297
+ {
298
+ "scanId": 1,
299
+ "findings": [
300
+ {
301
+ "id": "ATK-003",
302
+ "severity": "high",
303
+ "title": "Credential harvesting",
304
+ "evidence": "process.env.NPM_TOKEN detected in postinstall.js:17"
305
+ }
306
+ ]
307
+ }
308
+ ```
309
+
310
+ ---
311
+
312
+ ## ⚙️ 配置与高级用法
313
+
314
+ ### 策略即代码
315
+
316
+ 在 YAML 文件中定义白名单、严重性覆盖、抑制和失败阈值:
317
+
318
+ ```yaml
319
+ # .npm-scan.yml
320
+ allowlist:
321
+ - lodash
322
+ - chalk
323
+
324
+ severity_overrides:
325
+ - id: ATK-001
326
+ severity: medium
327
+
328
+ suppress:
329
+ - atk_id: ATK-009
330
+ - package: some-package
331
+
332
+ fail_on: high
333
+ ```
334
+
335
+ ```bash
336
+ npm-scan scan target --policy .npm-scan.yml
337
+ ```
338
+
339
+ ### 环境变量
340
+
341
+ | 变量 | 描述 | 默认值 |
342
+ |----------|-------------|---------|
343
+ | `NPM_SCAN_LICENSE_KEY` | 高级版/企业版许可证密钥 | — |
344
+ | `NPM_SCAN_DATA_DIR` | 扫描历史目录 | `./.npm-scan` |
345
+ | `NPM_SCAN_LOG_LEVEL` | 日志详细级别 | `info` |
346
+
347
+ ### 高级版许可
348
+
349
+ 请联系 leo@lateos.ai 获取高级版/企业版许可密钥。
350
+
351
+ ```bash
352
+ # 使用它
353
+ npm-scan scan target --license-key <key>
354
+ npm-scan report --pdf --license-key <key>
355
+ npm-scan report --siem cef --license-key <key>
356
+ ```
357
+
358
+ ---
359
+
360
+ ## 🔗 集成
361
+
362
+ ### GitHub Actions CI(针对本仓库)
363
+
364
+ 每次推送和 PR 在 Node 18、20 和 22 上运行测试:
365
+
366
+ ```yaml
367
+ # .github/workflows/ci.yml
368
+ name: CI
369
+ on:
370
+ push:
371
+ branches: [ main ]
372
+ pull_request:
373
+ branches: [ main ]
374
+ jobs:
375
+ test:
376
+ runs-on: ubuntu-latest
377
+ strategy:
378
+ matrix:
379
+ node-version: [18, 20, 22]
380
+ steps:
381
+ - uses: actions/checkout@v4
382
+ - uses: actions/setup-node@v4
383
+ with:
384
+ node-version: ${{ matrix.node-version }}
385
+ cache: 'npm'
386
+ - run: npm ci
387
+ - run: npm test
388
+ - run: npm run test:coverage
389
+ - run: node --test test/detectors-corpus.test.js
390
+ - run: npm run lint
391
+ - run: npm run build
392
+ ```
393
+
394
+ ### GitHub Action(面向下游用户)
395
+
396
+ 在每个 PR 上扫描您项目的 `package-lock.json`——在它们进入生产环境之前检测域名抢注、混淆载荷、凭证窃取器和蠕虫传播:
397
+
398
+ ```yaml
399
+ # .github/workflows/scan.yml
400
+ name: npm-scan
401
+ on:
402
+ pull_request:
403
+ paths:
404
+ - 'package-lock.json'
405
+ - '**/package.json'
406
+ jobs:
407
+ scan:
408
+ runs-on: ubuntu-latest
409
+ steps:
410
+ - uses: actions/checkout@v4
411
+ - uses: actions/setup-node@v4
412
+ with:
413
+ node-version: 20
414
+ - name: Scan lockfile
415
+ uses: lateos/npm-scan@v1
416
+ with:
417
+ scan-type: lockfile
418
+ fail-on: high
419
+ ```
420
+
421
+ #### Action 输入
422
+
423
+ | 输入 | 默认值 | 描述 |
424
+ |-------|---------|-------------|
425
+ | `scan-type` | `lockfile` | `lockfile` 扫描 `package-lock.json` 或 `package` 扫描特定 npm 包 |
426
+ | `package` | — | 包名(`scan-type=package` 时需要) |
427
+ | `fail-on` | `high` | 在此严重性阈值处使工作流失败:`none`、`low`、`medium`、`high`、`critical` |
428
+ | `policy-file` | — | YAML/JSON 策略文件路径,用于白名单、严重性覆盖和抑制 |
429
+ | `license-key` | — | 用于 SIEM 导出和 PDF 报告的高级版许可证密钥 |
430
+ | `siem-format` | — | SIEM 输出:`cef`、`ecs`、`sentinel`、`qradar`(高级版) |
431
+ | `sbom-format` | — | SBOM 输出:`json`、`xml`、`spdx` |
432
+
433
+ #### Action 输出
434
+
435
+ | 输出 | 描述 |
436
+ |--------|-------------|
437
+ | `findings-count` | 检测到的发现项数量 |
438
+ | `scan-id` | 扫描 ID,用于后续报告引用 |
439
+
440
+ #### 示例:使用策略 + SBOM 扫描特定包
441
+
442
+ ```yaml
443
+ - uses: lateos/npm-scan@v1
444
+ with:
445
+ scan-type: package
446
+ package: lodash
447
+ policy-file: .npm-scan.yml
448
+ sbom-format: spdx
449
+ fail-on: critical
450
+ ```
451
+
452
+ #### 示例:使用 SIEM 导出扫描(高级版)
453
+
454
+ ```yaml
455
+ - uses: lateos/npm-scan@v1
456
+ with:
457
+ scan-type: lockfile
458
+ siem-format: cef
459
+ license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
460
+ ```
461
+
462
+ ### CI/CD 流水线
463
+
464
+ 直接集成到您现有的流水线中,无需复合操作:
465
+
466
+ ```bash
467
+ # 扫描锁定文件,在高严重性时使构建失败
468
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
469
+
470
+ # 扫描特定包,仅在严重时失败
471
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
472
+
473
+ # 生成 SBOM 作为构建产物
474
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
475
+
476
+ # 在 CI 中生成 HTML 合规报告
477
+ npm-scan report --html > report.html
478
+
479
+ # 上传报告作为产物
480
+ # uses: actions/upload-artifact@v4
481
+ # with:
482
+ # name: npm-scan-report
483
+ # path: report.html
484
+ ```
485
+
486
+ ### Docker
487
+
488
+ 请参见上方的 [Docker 快速入门部分](#-在任何地方通过-docker-运行-lateosnpm-scan--零安装),了解拉取命令、Compose 流水线和多架构镜像。
489
+
490
+ 在每个 PR 上扫描您项目的 `package-lock.json`——在它们进入生产环境之前检测域名抢注、混淆载荷、凭证窃取器和蠕虫传播:
491
+
492
+ ```yaml
493
+ # .github/workflows/scan.yml
494
+ name: npm-scan
495
+ on:
496
+ pull_request:
497
+ paths:
498
+ - 'package-lock.json'
499
+ - '**/package.json'
500
+ jobs:
501
+ scan:
502
+ runs-on: ubuntu-latest
503
+ steps:
504
+ - uses: actions/checkout@v4
505
+ - uses: actions/setup-node@v4
506
+ with:
507
+ node-version: 20
508
+ - name: Scan lockfile
509
+ uses: lateos/npm-scan@v1
510
+ with:
511
+ scan-type: lockfile
512
+ fail-on: high
513
+ ```
514
+
515
+ #### Action 输入
516
+
517
+ | 输入 | 默认值 | 描述 |
518
+ |-------|---------|-------------|
519
+ | `scan-type` | `lockfile` | `lockfile` 扫描 `package-lock.json` 或 `package` 扫描特定 npm 包 |
520
+ | `package` | — | 包名(`scan-type=package` 时需要) |
521
+ | `fail-on` | `high` | 在此严重性阈值处使工作流失败:`none`、`low`、`medium`、`high`、`critical` |
522
+ | `policy-file` | — | YAML/JSON 策略文件路径,用于白名单、严重性覆盖和抑制 |
523
+ | `license-key` | — | 用于 SIEM 导出和 PDF 报告的高级版许可证密钥 |
524
+ | `siem-format` | — | SIEM 输出:`cef`、`ecs`、`sentinel`、`qradar`(高级版) |
525
+ | `sbom-format` | — | SBOM 输出:`json`、`xml`、`spdx` |
526
+
527
+ #### Action 输出
528
+
529
+ | 输出 | 描述 |
530
+ |--------|-------------|
531
+ | `findings-count` | 检测到的发现项数量 |
532
+ | `scan-id` | 扫描 ID,用于后续报告引用 |
533
+
534
+ #### 示例:使用策略 + SBOM 扫描特定包
535
+
536
+ ```yaml
537
+ - uses: lateos/npm-scan@v1
538
+ with:
539
+ scan-type: package
540
+ package: lodash
541
+ policy-file: .npm-scan.yml
542
+ sbom-format: spdx
543
+ fail-on: critical
544
+ ```
545
+
546
+ #### 示例:使用 SIEM 导出扫描(高级版)
547
+
548
+ ```yaml
549
+ - uses: lateos/npm-scan@v1
550
+ with:
551
+ scan-type: lockfile
552
+ siem-format: cef
553
+ license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
554
+ ```
555
+
556
+ ### CI/CD 流水线
557
+
558
+ 直接集成到您现有的流水线中,无需复合操作:
559
+
560
+ ```bash
561
+ # 扫描锁定文件,在高严重性时使构建失败
562
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
563
+
564
+ # 扫描特定包,仅在严重时失败
565
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
566
+
567
+ # 生成 SBOM 作为构建产物
568
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
569
+
570
+ # 在 CI 中生成 HTML 合规报告
571
+ npm-scan report --html > report.html
572
+
573
+ # 上传报告作为产物
574
+ # uses: actions/upload-artifact@v4
575
+ # with:
576
+ # name: npm-scan-report
577
+ # path: report.html
578
+ ```
579
+
580
+ ### Docker
581
+
582
+ 请参见上方的 [Docker 快速入门部分](#-在任何地方通过-docker-运行-lateosnpm-scan--零安装),了解拉取命令、Compose 流水线和多架构镜像。
583
+
584
+ ---
585
+
586
+ ## 🗺️ 路线图与企业功能
587
+
588
+ ### 免费版(已发布)
589
+
590
+ - 全部 11 个 ATK 检测器 + **MEGALODON** (D1-D6) + **HF_IMPERSONATION** + **MINI_SHAI_HULUD** (D1-D7, 3 波,含 **MSH_SUPPLEMENT** D1-D4) + **VSIX_SCAN** (6 个检测器) + **CVE-2026-48710 (BadHost)** (3 层) + **TRAPDOOR** (9 条规则) + **NODE_IPC_COMPROMISE** (11 条规则) + **TYPOSQUAT_VPMDHAJ** (3 条规则) + **AXIOS_POISONING** (3 条规则)
591
+ - SBOM 输出(CycloneDX + SPDX)
592
+ - HTML、文本和合规报告(NIST + EU CRA)
593
+ - 策略即代码引擎(YAML)
594
+ - 本地 SQLite 扫描历史
595
+ - GitHub Action
596
+ - Docker 镜像 + Compose 流水线
597
+
598
+ ### 高级版(🔐 许可证密钥)
599
+
600
+ - PDF 合规报告,含 NIST 可追溯性矩阵
601
+ - SIEM 导出(Splunk CEF、Elastic ECS、Microsoft Sentinel、IBM QRadar)
602
+ - 动态沙箱(基于 gVisor — ATK-008–010)
603
+ - 可达性分析(调用图过滤)
604
+
605
+ ### 企业版(🏢 自定义许可证)
606
+
607
+ - SAML 2.0 SSO(Okta、Azure AD、OneLogin、Keycloak)
608
+ - REST API + webhooks(FastAPI)
609
+ - 团队 RBAC + 审计日志
610
+ - 用于 Kubernetes 部署的 Helm Chart
611
+ - 用于托管/团队版的 PostgreSQL 后端
612
+ - SLA 保障的优先支持
613
+
614
+ ---
615
+
616
+ ## 🤝 贡献
617
+
618
+ 我们欢迎贡献——特别是新的检测器、改进的逃避抵抗能力和合规模板。
619
+
620
+ 请参阅 [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) 了解 ATK 治理流程。每个新的检测器需要:
621
+
622
+ 1. 概念验证样本
623
+ 2. 附带测试的检测规则
624
+ 3. 对前 500 个 npm 包的误报分析
625
+ 4. NIST 800-161 控制映射
626
+
627
+ ### 测试
628
+
629
+ 该项目使用 **Node.js 原生测试运行器**(`node:test` + `assert/strict`)。
630
+
631
+ ```bash
632
+ # 运行所有测试
633
+ npm test
634
+
635
+ # 运行测试并带覆盖率
636
+ npm run test:coverage
637
+
638
+ # 运行测试并带详细输出
639
+ npm run test:verbose
640
+
641
+ # 运行本地恶意/清洁语料库(无需网络)
642
+ node --test test/detectors-corpus.test.js
643
+ ```
644
+
645
+ **测试结构:**
646
+ - `test/fixtures/mock-data.js` — 共享的模拟扫描、包和代码片段
647
+ - `test/db.test.js` — 数据库 CRUD(保存、查询、持久化)
648
+ - `test/detectors-edge-cases.test.js` — 每个检测器的边界测试(无操作、清洁清除、严重性)
649
+ - `test/detectors-corpus.test.js` — 33 个恶意 + 50 个清洁 tarball 集成测试(离线)
650
+ - `test/fetch.test.js` — tarball 提取、临时目录清理
651
+ - `test/policy-edge-cases.test.js` — 抑制、覆盖、加载验证的边缘情况
652
+ - `test/report-snapshots.test.js` — HTML/文本/CRA/PDF 格式断言
653
+ - `test/cve-2026-48710-badhost/manifest.test.js` — 13 个 Python 清单解析测试(requirements.txt, pyproject.toml, poetry.lock, 版本边界情况)
654
+ - `test/cve-2026-48710-badhost/transitive.test.js` — 7 个传递性依赖测试(Tier 1/2, fastapi 版本门控, 固定版本抑制)
655
+ - `test/cve-2026-48710-badhost/codePattern.test.js` — 6 个静态代码模式测试(auth 上下文, INFO 穿透, scope 抑制)
656
+ - `test/cve-2026-48710-badhost/integration.test.js` — 4 个集成测试(端到端复合发现项, 清洁项目, 无 Python 文件)
657
+ - `test/trapdoor.test.js` — 40 个 TrapDoor 活动检测测试(D1–D9:活动标记、载荷指纹、发布者黑名单、Gist 外泄、AI 注入、诱饵名称、加密原语、XOR 密钥、凭证验证)
658
+ - `test/node-ipc.test.js` — 37 个 node-ipc 入侵检测测试(D1–D11:版本黑名单、tarball 哈希、CJS 注入、载荷哈希、DNS C2 模式、引导解析器、DNS TXT 外泄、运行时触发、临时制品、未授权发布者、影响范围)
659
+ - `test/msh-supplement.test.js`——17 个 MSH 补充测试 (ctf-scramble-v2 停止,守护化,地理终止开关,C2 死信)
660
+ - `test/typosquat-vpmdhaj.test.js`——16 个域名抢注活动测试 (维护者阻止,前缀检测,Levenshtein,预安装加载器,Bun 加载器,AWS/ECS/Vault/GitHub 凭证外泄)
661
+ - `test/axios-poisoning.test.js`——13 个 Axios 投毒测试 (版本黑名单停止,诱饵依赖,加密启发式,跨平台 RAT,C2 回调)
662
+ - `test/cli.test.js` — commander 集成测试(帮助、版本、扫描、报告、错误处理)
663
+
664
+ ### 需要帮助?
665
+
666
+ - 🔒 查看[安全策略](SECURITY.md)了解漏洞披露流程
667
+ - 📖 阅读[项目计划](docs/project-plan.md)
668
+ - 🧬 查看[攻击分类](docs/attack-taxonomy.md)
669
+ - 🐛 提交 issue 或 PR
670
+
671
+ ---
672
+
673
+ ## 📄 许可证
674
+
675
+ Apache-2.0 核心 + Commons Clause。
676
+ 请参阅 [`LICENSING.md`](LICENSING.md) 了解免费版和高级版功能之间的确切界限。
677
+
678
+ ---
679
+
680
+ ## 👤 关于维护者
681
+
682
+ **Roongrunchai Chongolnee** — `@lateos/npm-scan` 的创建者和维护者。持有 CISSP、CEH、思科安全、AWS 云从业者认证的安全专业人士,在飞利浦拥有十年的基础设施和应用安全经验。我构建这个工具是为了让开源社区拥有一个实用、检测器驱动的供应链恶意软件防御方案——我致力于保持其透明、社区拥有和持续改进。
683
+
684
+ [![LinkedIn](https://img.shields.io/badge/LinkedIn-0A66C2?style=flat-square&logo=linkedin)](https://www.linkedin.com/in/roongrunchai-chong-c-ab9742108/)
685
+ [![GitHub](https://img.shields.io/badge/GitHub-lateos--ai-181717?style=flat-square&logo=github)](https://github.com/lateos-ai/npm-scan)
686
+
687
+ 欢迎提交 issue、想法和 PR——安全在协作中最强大。
688
+
689
+ ---
690
+
691
+ ```
692
+ @lateos/npm-scan — npm supply chain security scanner
693
+ Copyright (C) 2026 Lateos
694
+
695
+ Licensed under the Apache License, Version 2.0 (the "License");
696
+ you may not use this file except in compliance with the License.
697
+
698
+ Unless required by applicable law or agreed to in writing, software
699
+ distributed under the License is distributed on an "AS IS" BASIS,
700
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
701
+ ```
702
+
703
+ ---
704
+
705
+ **立即扫描您的第一个包:**
706
+
707
+ ```bash
708
+ npx @lateos/npm-scan scan lodash
709
709
  ```