
一个用于 npm/yarn 和 Python(pip/poetry/uv)供应链攻击的应急响应工具包 —— 免费、本地化、零依赖。
SCG 不是一个在覆盖范围上与商业工具竞争的扫描引擎。它是一个 Claude Code 技能和独立 shell 工具包,擅长三件事:(1) 当特定事件发生时,提供快速、可重复的第一响应("我的机器现在是否受影响?"),(2) 将现有 OSS 扫描器(npm audit、osv-scanner、pip-audit)编排为一次结构化扫描,(3) 记录来之不易的设计卫生经验教训 —— 尤其是针对 AI 开发环境 —— 这是通用扫描器无法覆盖的。
它是在真实事件中构建并经受锤炼的,包括:
scripts/project-scan-py.sh,支持 pip-audit / osv-scanner / CVE 标记版本检测2026 年 3 月 31 日,广泛使用的 axios npm 包(v1.14.1 和 v0.30.4)因维护者账户被接管而遭到入侵,攻击归因于 UNC1069/DPRK-APT(据 Google Threat Intelligence Group 报道)。该攻击注入了一个幽灵依赖([email protected]),通过 postinstall 脚本部署了一个跨平台 RAT,并伪装成合法的系统进程。
Supply Chain Guard(SCG) 是在事件期间构建的,旨在提供:
SCG 不是现有安全工具的替代品。它将多个检测层与结构化验证框架和引导式修复相结合 —— 专为活跃事件期间使用或作为现有工具之外的定期检查而设计。
何时使用 SCG:
何时使用其他工具:
我们宁愿诚实地说明边界,也不愿过度推销。SCG 是三件事:
一份以代码形式呈现的应急响应行动手册。 当指定事件发生时(axios RAT、Shai-Hulud、新的 CVE),SCG 将"我是否受影响,如果是该怎么办?"转化为可执行的检查清单 —— 8 个验证门、一个严重性矩阵以及一个修复脚本,其中每一个破坏性操作都需要明确的 [y/N] 确认。这是它的主要价值:商业监控工具不适合提供的快速、结构化的第一响应。
现有 OSS 扫描器的编排器。 L1/L2 层封装了 npm audit / pip-audit / osv-scanner。大部分原始检测能力是借用的;SCG 的贡献在于将它们捆绑为一次扫描,添加注册表工具不会做的文件系统/IOC 检查,并让输出可读且可操作。
真实设计卫生经验教训的文档(SKILL.md §D.7)—— 我们实际遇到或调查过的事情:MCP 传输选择、GCP 默认 SA 加固、安装时执行向量,以及针对 AI 开发工具链的威胁(Shai-Hulud 读取 .claude/settings.json、SANDWORM_MODE 投毒 MCP 配置)。这一细分领域 —— AI 辅助开发的供应链卫生 —— 是 SCG 真正差异化所在。
SKILL.md D.2、L3 静态列表)是手工维护的 —— 它收录的是我们读到的相关事件,而不是商业实时源跟踪的数万个恶意包。手工策划的列表无法跟上真实的新威胁产生速度,我们也不假装它可以。由于手工策划的数据库无法在覆盖范围上获胜,我们有意投资于 SCG 难以被替代的领域,而不是它永远会输的领域:
静态威胁数据库(#2)将在重大事件发生时持续更新,但它明确不是我们试图竞争的领域。
SCG 遵循**领域驱动设计(DDD)**架构,包含三个层:``` +-----------------------------------------------------+ | Domain Layer | | Threat models, known threats DB, severity matrix, | | Devil Gate definitions | +-----------------------------------------------------+ | Application Layer | | Use cases, scan pipeline, response protocols, | | Devil execution loop | +-----------------------------------------------------+ | Infrastructure Layer | | Scanner scripts (npm audit, OSV, static list, | | IOC filesystem, network, lockfile integrity) | +-----------------------------------------------------+
### 扫描管道
相同的 5 层管道适用于两个生态系统,每一层都有针对特定生态系统的扫描器:```
L1 ──→ L2 ──→ L3 ──→ IOC ──→ LF ──→ assess(SeverityMatrix) ──→ VERDICT
两条流水线都会汇入同一个 SeverityMatrix 和 Devil Gate Framework。
将 SKILL.md 复制到你的 Claude Code 技能目录:```bash
cp SKILL.md ~/.claude/skills/supply-chain-guard.md
mkdir -p .claude/skills cp SKILL.md .claude/skills/supply-chain-guard.md
然后在 Claude Code 中调用:```
> /supply-chain-guard
> "Check this project for supply chain issues"
> "Is my machine affected by the axios compromise?"
./scripts/env-scan.sh
./scripts/project-scan.sh
./scripts/project-scan-py.sh
./scripts/ioc-scan.sh
./scripts/respond.sh --critical # Full RAT cleanup (npm + Python) ./scripts/respond.sh --high axios 1.14.0 # Pin npm package to safe version ./scripts/respond.sh --high urllib3 2.7.0 # Pin Python package (auto-detects pip/poetry/uv)
> **Python 修复方案在设计上偏向保守。** 对于 npm,`--high` 会自动应用
> override。对 Python 则是 *引导式*:它会检测你的包管理器
> (pip/poetry/uv),打印出精确的固定(pin)命令,并且只执行安全步骤 —
> 会显示修改锁文件和重建 venv 的命令供你运行。这样可避免
> 误报导致在碎片化的 Python 打包生态系统中触发连带性强制重装。
对于包含多语言(npm + Python)的仓库,请分别在相关子目录中依次运行两个项目扫描器。
> **安全设计:** 所有扫描脚本均为严格只读 — 它们绝不修改、删除或安装任何内容。修复脚本 (`respond.sh`) 是唯一执行破坏性操作的脚本,并且**每个操作都需要明确的 `[y/N]` 确认**,默认值为 NO。
---
## 扫描模式
### 环境扫描 (`env_scan`)
扫描整个开发机器以查找失陷指标。
| 检查 | 描述 |
|-------|-------------|
| **IOC:文件系统** | RAT 二进制文件、持久化机制、暂存文件 |
| **IOC:网络** | 活跃的 C2 连接(IP + 域名) |
| **IOC:进程** | 正在运行的恶意进程 |
| **跨项目** | 扫描所有 `package-lock.json` 文件以查找已受侵害的版本 |
| **恶意包** | 任何锁文件中的已知恶意包名 |
**触发词:** "this PC"、"environment check"、"machine-wide"
### 项目扫描 — npm/yarn (`project_scan`)
对单个 npm/yarn 项目进行深度扫描。在包含 `package.json` 的目录中运行。
| 层级 | 扫描器 | 描述 |
|-------|---------|-------------|
| **L1** | `npm audit` | 通过 npm registry 发现的已知漏洞 |
| **L2** | `osv-scanner` / OSV.dev API | Google 的开源漏洞数据库 |
| **L3** | 静态列表 | 硬编码的已知恶意包检查 |
| **IOC** | 文件系统 + 网络 | RAT 工件检测 |
| **LF** | 锁文件完整性 | `npm ci --dry-run` + 完整性哈希计数 |
**触发词:** "this project"、"npm audit"、或当前工作目录中存在 `package.json`
### 项目扫描 — Python (`project_scan_py`,v4 新增)
对单个 Python 项目进行深度扫描。在包含 `pyproject.toml`、`requirements*.txt`、`poetry.lock` 或 `uv.lock` 的目录中运行。
| 层级 | 扫描器 | 描述 |
|-------|---------|-------------|
| **L1** | `pip-audit` | 通过 PyPI 公告数据库发现的已知漏洞(可选 — 若未安装则跳过;建议执行 `pip install pip-audit`) |
| **L2** | `osv-scanner` | 针对 `uv.lock` / `poetry.lock` / `requirements*.txt` 使用 Google 的开源漏洞数据库(可选 — 若未安装则跳过) |
| **L3-MAL** | 静态恶意列表 (`_L3_LIST`) | 已知的被劫持 / 域名仿冒包名。匹配 PEP 621 列表、Poetry 内联声明以及 requirements 风格声明(参见 [PR #4](https://github.com/eris-ths/supply-chain-guard/pull/4))。命中即失败 |
| **L3-CVE** | 静态 CVE 标记版本列表 (`_L3_CVE_LIST`) | 已知合法包的易受攻击版本(例如 [BadHost CVE-2026-48710](https://cryptobriefing.com/starlette-badhost-vulnerability-ai-agents/) 对应的 `starlette<1.0.1`)。通过 Python 的 `packaging` 库进行严格的 semver 规范评估。确认匹配即失败。若包已声明但不存在锁文件则发出警告(无法评估版本) |
| **IOC** | 文件系统 + 进程 | Python 风格的工件检查(可疑脚本、可疑进程) |
| **LF** | 锁文件完整性 | 验证 `uv.lock` / `poetry.lock` / `requirements*.txt` 能否干净解析并包含固定版本 |
**触发词:** "this project" 且存在 Python 文件,或当前工作目录中有 `pyproject.toml` / `requirements*.txt` / `poetry.lock` / `uv.lock` 中的任意一个
> **依赖项说明:** 当相应的 CLI 不存在时,L1 (`pip-audit`) 和 L2 (`osv-scanner`) 会优雅地跳过并给出提示。L3 是始终启用的层级,不需要任何外部工具,但要准确评估 L3-CVE,需要执行 `pip install packaging`。
---
## 威胁情报
### 已知威胁数据库
| ID | 日期 | 包 | 威胁行为者 | 攻击向量 |
|----|------|---------|-------------|--------|
| **T001** | 2026-03-31 | `[email protected]`, `[email protected]` | UNC1069/DPRK-APT | 维护者账户失陷 → 幽灵依赖 → RAT |
| **T002** | 2018-11 | `[email protected]` | 未知 | 依赖注入 → 加密货币窃取 |
| **T003** | 持续中 | `crossenv`, `loadsh`, `crypto-js-esm` | 多个 | 域名仿冒 → 安装后数据外泄 |
### T001 攻击链 (axios RAT)```
Credential theft → npm publish (bypass CI) → Inject phantom dep (plain-crypto-js)
→ postinstall exec → RAT drop → C2 beacon (sfrclak.com:8000) → Persist
| 包 | 安全 | 已受影响 |
|---|---|---|
| axios(最新版) | 1.14.0(精确)或 >=1.14.2 | 1.14.1 |
| axios(旧版) | 0.30.3(精确) | 0.30.4 |
SCG 使用一个 8 门验证框架,分为 4 个类别,以串行链与收敛循环方式执行。
S1: Dependency (G1+G2) → S2: Runtime (G3+G4) → S3: Integrity (G5+G6) → S4: Environment (G7+G8) → Any fail? → Fix → Re-run entire chain → All pass? → "No concerns" → Done → 3 rounds without convergence? → Escalate to user
### 严重性矩阵
| 级别 | 条件 | 操作 |
|-------|-----------|--------|
| **CRITICAL** | 发现 RAT 工件或安装了恶意包 | 网络隔离 → 终止进程 → 移除持久化 → 重新安装 |
| **HIGH** | 正在使用被入侵的版本 | 固定安全版本 → 覆盖 → `npm ci` → 验证 |
| **MEDIUM** | 可疑的 postinstall 脚本 | 人工审查 → 加入白名单或移除 |
| **LOW** | 锁文件漂移 | `npm ci` 重新同步 |
| **CLEAR** | 所有检查通过 | 无需操作 |
> **安全性:** CRITICAL/HIGH 响应涉及破坏性操作。SCG 始终先呈现发现的结果,并在执行修复前要求用户明确确认。
---
## 独立脚本
### `scripts/env-scan.sh`
完整的环境扫描。检查 IOC 工件,扫描 `$HOME`(可配置)下的所有锁文件,并报告受损包。```bash
./scripts/env-scan.sh [scan_root_dir]
# Default: $HOME
scripts/project-scan.sh项目级扫描。从包含 package.json 的目录运行。```bash
cd my-project
/path/to/scripts/project-scan.sh
### `scripts/ioc-scan.sh`
仅IOC扫描。检查文件系统痕迹、运行进程和网络连接,与已知的C2指标进行比对。跨平台(macOS/Linux/Windows,通过PowerShell)。```bash
./scripts/ioc-scan.sh
scripts/respond.sh交互式修复。每个破坏性操作都需要 [y/N] 确认(默认:NO)。```bash
./scripts/respond.sh --critical
./scripts/respond.sh --high axios 1.14.0 # npm ./scripts/respond.sh --high event-stream 3.3.5 # npm ./scripts/respond.sh --high urllib3 2.7.0 # python (pip/poetry/uv auto-detected)
Steps in `--critical` mode:
1. Network isolate (block C2 domain via `/etc/hosts`)
2. Kill RAT processes
3. Remove persistence (LaunchAgents / crontab / scheduled tasks)
4. Delete `node_modules` and lockfile, clear npm cache
- **4b (Python):** purge pip cache (safe, auto); venv-rebuild shown as manual steps
5. Reinstall dependencies
6. Prompt for verification scan (`project-scan.sh` and/or `project-scan-py.sh`)
Each step checks whether action is actually needed (e.g., skips "kill" if no RAT process is running) and shows exactly what will be executed before asking for confirmation.
For **HIGH** mode, npm applies the override automatically; Python is guided (detect manager → print pin command → apply only the safe step). See the Python remediation note in [Quick Start](#quick-start).
---
## CI/CD Integration
### GitHub Actions```yaml
name: Supply Chain Guard
on:
pull_request:
paths:
- 'package.json'
- 'package-lock.json'
- 'yarn.lock'
jobs:
scg-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies (hardened)
run: npm ci --ignore-scripts
- name: Run SCG project scan
run: |
chmod +x ./scripts/project-scan.sh
./scripts/project-scan.sh
- name: Run IOC scan
run: |
chmod +x ./scripts/ioc-scan.sh
./scripts/ioc-scan.sh
npm ci --ignore-scripts # Block postinstall execution
yarn install --frozen-lockfile --ignore-scripts
> **按 SHA 固定 Actions,而不是标签。** 上面的示例为了可读性使用了 `actions/checkout@v4`,但标签可以被移动。在生产环境中,请固定到完整的提交 SHA,以防止 GitHub Actions 供应链攻击:
> ```yaml
> - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
> - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
> ```
---
## 响应手册
### 如果严重(检测到 RAT)
> **不要惊慌。** 按顺序执行以下步骤。每个步骤都需要你的明确确认。
1. **网络隔离** — 通过 `/etc/hosts` 阻止 C2 域名
2. **终止进程** — 终止 RAT 进程(`com.apple.act.mond`、`ld.py`、`wt.exe`)
3. **清除持久化** — 删除 LaunchAgents、crontabs、计划任务
4. **清理 npm** — 删除 `node_modules` 和 `package-lock.json`,清除 npm 缓存
5. **重新安装** — 全新 `npm install && npm ci`
6. **重新扫描** — 重新运行完整管道,预期结果为 CLEAR
### 如果高危(已安装被入侵的版本)
1. **固定安全版本** 使用 respond.sh: ```bash
./scripts/respond.sh --high axios 1.14.0
这会向 package.json 添加 overrides(npm)或 resolutions(yarn),重新安装,并提示进行验证。
package.json 中: ```json
{ "overrides": { "axios": "1.14.0" } }
Yarn: { "resolutions": { "axios": "1.14.0" } }
npm ci| 平台 |
|---|
| 类型 | 值 |
|---|---|
| C2 域名 | sfrclak.com |
| C2 IP | 142.11.206.73 |
| C2 端口 | 8000 |
| 平台 | 伪装为 |
|---|---|
| macOS | Apple 系统进程(com.apple.act.mond) |
| Windows | Windows Terminal(ProgramData 中的 wt.exe) |
SCG ────────────────────────────────── [L1:audit] CLEAR|!!sev [L2:osv] CLEAR|!!vuln-ids [L3:static] CLEAR|!!pkg [IOC:fs] CLEAR|!!C:artifact [IOC:net] CLEAR|!!C:c2 [LF:integ] CLEAR|!!drift ─── Devil Gate(8) ──────────────────── G1:direct_dep G2:transitive G3:rat_fs G4:postinstall G5:lockfile G6:provenance G7:network G8:cicd ─── Devil Chain(R.N) ───────────────── S1:dependency → S2:runtime → S3:integrity → S4:environment ─── Loop ───────────────────────────── R.N → converge|continue [VERDICT] CLEAR|HIGH|CRITICAL ───────────────────────────────────────
---
## References
| Source | Description |
|--------|-------------|
| [Zenn (JP)](https://zenn.dev/gunta/articles/0152eadf05d173) | 日文早期报告 |
| [Elastic Security Labs](https://elastic.co/security-labs/axios-one-rat-to-rule-them-all) | 技术分析(RAT 反汇编、C2 协议、时间线) |
| [SANS](https://sans.org/blog/axios-npm-supply-chain-compromise-malicious-packages-remote-access-trojan) | 企业事件响应流程 |
| [Huntress](https://huntress.com/blog/supply-chain-compromise-axios-npm-package) | YARA 签名 |
| [Elastic Detections](https://elastic.co/security-labs/axios-supply-chain-compromise-detections) | SIEM 检测规则(YARA/osquery/KQL) |
| [Semgrep](https://semgrep.dev/blog/2026/axios-supply-chain-incident-indicators-of-compromise-and-how-to-contain-the-threat/) | 静态分析规则、遏制指南 |
| [SOCRadar](https://socradar.io/blog/axios-npm-supply-chain-attack-2026-ciso-guide/) | CISO 指南及 IOC 时间线 |
| [Wiz](https://wiz.io/blog/axios-npm-compromised-in-supply-chain-attack) | 云影响分析、容器扫描 |
| [NVD CVE-2026-48710](https://nvd.nist.gov/vuln/detail/CVE-2026-48710) | **主要** — NVD 权威条目(发布于 2026-05-26,CVSS 3.1 基础分 6.5 中危,AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N) |
| [GHSA-86qp-5c8j-p5mr](https://github.com/Kludex/starlette/security/advisories/GHSA-86qp-5c8j-p5mr) | **主要** — 针对 `Kludex/starlette` 的 GitHub 安全公告(发布于 2026-05-21):"缺少 Host 头验证会污染 request.url.path,从而绕过基于路径的安全检查" |
| [Starlette v1.0.1 发布说明](https://github.com/Kludex/starlette/releases/tag/1.0.1) | **主要** — 修复版本(发布于 2026-05-21)。锁定 `starlette>=1.0.1`(以及 `fastapi>=0.119` 以进行传递依赖解析) |
| [Starlette BadHost 报道(KuCoin)](https://kucoin.com/news/flash/starlette-vulnerability-exposes-millions-of-ai-agents-to-hackers) | 次要 — Python 生态系统影响,AI 智能体视角 |
| [BadHost AI 智能体分析(CryptoBriefing)](https://cryptobriefing.com/starlette-badhost-vulnerability-ai-agents/) | 次要 — FastAPI / vLLM / LiteLLM 下游影响视角 |
---
## Guild-CLI Devil 集成
如果你使用 [guild-cli](https://github.com/eris-ths/guild-cli)(或任何暴露 Devil lense 工作流的项目),SCG 可以在审查过程中作为安全透镜之一被调用。
### 推荐的调用模式```bash
# Inside a guild-cli review session, in the project root:
~/path/to/supply-chain-guard/scripts/project-scan.sh # for npm/yarn projects
~/path/to/supply-chain-guard/scripts/project-scan-py.sh # for Python projects
# Capture the scan output as evidence for a judgment:
SCG_OUTPUT=$(~/path/to/supply-chain-guard/scripts/project-scan.sh 2>&1 || true)
# (a) Record it as a new judgment (fast-track — no prior review needed):
gate fast-track --from "$USER" \
--action "SCG supply-chain scan (Devil lense)" \
--reason "$SCG_OUTPUT"
# (b) Or attach it as the Devil lense on an existing review request <id>:
gate review <id> --lense devil --verdict concern --note "$SCG_OUTPUT"
Flag 说明(已对照 guild-cli 验证):
gate review需要一个 已有的<id>、--lense(guild-cli 的拼写就是 "lense")和--verdict(ok/concern/reject)。它没有--area标志。若要记录一条 没有先前审查对象的新发现,请如 (a) 中所示使用gate fast-track。
Devil's Advocate("壊しにいく")与 SCG 秉持相同的理念:假设最坏情况,系统化扫描,然后收敛。SCG 为 Devil 审查提供了供应链维度——项目的依赖可能在您背后做些什么——与其他视角(安全 / 正确性 / 架构 / 用户 / 运维)并列。
respond.sh(需用户明确确认)tail -50 截取project-scan.sh 和 project-scan-py.sh,并合并结果SCG 是一款检测工具,而非安全保证。坦率地说明它能做什么、不能做什么,本就是设计的一部分。
本软件按"原样"提供,不附带任何形式的担保。 使用 Supply Chain Guard 即表示您承认并同意以下内容:
CLEAR 结论表示在工具的已知威胁模式中未发现匹配项。这并不代表您的系统或项目未被攻陷。 新型、未知或经过变异的攻击可能无法被检测到。respond.sh)针对的是特定威胁的已知指标。它们可能无法完全清除复杂入侵的所有痕迹。如果您怀疑正在遭受入侵,请聘请专业的应急响应团队。了解 SCG 不能做什么,与了解它能做什么同样重要。
| SCG 检查的内容 | SCG 不检查的内容 |
|---|---|
已知威胁数据库(SKILL.md 中的 D.2)采用手动维护。它不连接任何实时威胁情报源。从新的供应链事件被发现到该数据库更新,存在固有的延迟。
_L3_CVE_LIST 条目匹配、并通过严格 semver 规范评估的软件包,并且需要安装 packaging 才能进行准确的版本匹配请始终与实时来源交叉验证,例如 npm 安全通告、OSV.dev 以及 参考资料 一节中列出的厂商安全博客。
以下 IOC 路径在极少数情况下可能与合法软件产生冲突:
| IOC 路径 | 潜在的误报 |
|---|---|
/tmp/.npm-cache/ | 非标准配置下合法的 npm 缓存 |
/tmp/ld.py | 同名且无关的 Python 脚本 |
进程名 wt.exe | 位于 ProgramData 中的合法 Windows Terminal |
在运行修复之前,务必先核实 IOC 发现。 ioc-scan.sh 脚本仅报告发现供人工审查——它不会采取任何操作。respond.sh 脚本要求对每个破坏性操作进行明确确认(默认:否),正是出于这种风险考虑。
lsof 的网络检查只能检测当前活跃的连接。间歇性连接的 C2 信标在扫描时可能并不活跃。请验证您的 SCG 副本未被篡改。请将这些 SHA-256 校验和与您的本地文件进行比对:
```67ac6216cbe18fdf7050fd267bce4157c016e5c60cd4f84f63b8cf71e80ae3b9 scripts/env-scan.sh da01f8362563b55b1553f923a748f07d24f24522366e0545e6ba0c09801f8e54 scripts/project-scan.sh 77e7ebba6d44ea020e511a49bc2cbc974d01495de40d35e8dfb7fcc93008954b scripts/project-scan-py.sh 82aaa4ed898ce354addc064ccf84cca9a498ef4e90fe58613e1110146577609f scripts/ioc-scan.sh 72ed333838b5584c3b1faf889edc81b0e3195c27396c3b36c62aaebf5f952117 scripts/ioc-scan.ps1 0e6b30e57c959180e22e0ba16f860e9fdc7304045947995084703fb14381d12e scripts/respond.sh a44be79d909058c9d216e7cbc5cca736cf8816a492c8d35a6b90c74c042abf5b SKILL.md
<!-- CHECKSUMS-END -->
要验证:```bash
shasum -a 256 scripts/*.sh scripts/*.ps1 SKILL.md
注意: 这些校验和对应于最新版本。如果你在本地修改过任何文件,校验和将会不同。当 SCG 更新时,此部分会随代码更改一同更新。
由 Eris 构建 — 因为你的依赖项不应成为他人的攻击面。
| 工具 | 功能 | SCG 的关系 |
|---|
npm audit | 检查注册表中已知漏洞 | SCG 将 npm audit 作为其 L1 层,然后在此基础上添加 IOC 文件系统/网络扫描、恶意包检测和结构化响应工作流 |
osv-scanner | 针对 Google OSV 数据库扫描锁文件 | SCG 将 OSV 作为其 L2 层。osv-scanner 不会检查文件系统上的 RAT 工件或活跃的 C2 连接 |
| Snyk / Socket.dev | 商业 SaaS,提供实时监控、PR 检查、许可证扫描 | SCG 免费、本地优先、无需账户、不向第三方发送数据。专为即时应急响应而非持续监控而设计 |
| 手动 IR | 使用自定义脚本进行临时调查 | SCG 提供可重复的框架(8 个验证门、收敛循环、严重性矩阵),而不是每次事件各不相同的临时检查清单 |
| 层级 | npm/yarn (project-scan.sh) | Python (project-scan-py.sh) |
|---|
| L1 | npm audit | pip-audit |
| L2 | osv-scanner / OSV.dev API | osv-scanner |
| L3 | 静态列表(恶意 + 仿冒) | 静态列表(恶意 / 仿冒 + CVE 标记的版本) |
| IOC | 文件系统 + 网络痕迹 | 文件系统 + 进程痕迹(Python 风格) |
| LF | npm ci --dry-run + 完整性计数 | 锁文件完整性(uv.lock / poetry.lock / requirements*.txt) |
| # | 门 | 类别 | 问题 |
|---|
| G1 | 直接依赖 | 依赖投毒 | 是否有任何直接依赖处于受影响版本? |
| G2 | 传递依赖 | 依赖投毒 | 是否有任何传递(间接)依赖受到危害? |
| G3 | RAT 痕迹 | 运行时危害 | 文件系统上是否存在 RAT 痕迹? |
| G4 | 安装后脚本 | 运行时危害 | 是否存在可疑的 postinstall 脚本? |
| G5 | 锁文件完整性 | 完整性 | 锁文件是否被篡改? |
| G6 | 来源验证 | 完整性 | 该包是否来自合法来源/维护者? |
| G7 | 网络 | 环境 | 是否存在可疑的出站连接? |
| G8 | CI/CD 加固 | 环境 | CI/CD 是否绕过 postinstall / 强制冻结锁文件? |
| 平台 | 路径 | 类型 |
|---|
| macOS | /Library/Caches/com.apple.act.mond | RAT 二进制文件 |
| macOS | ~/Library/LaunchAgents/com.apple.act.mond.plist | 持久化 |
| Windows | %PROGRAMDATA%\wt.exe | RAT 二进制文件(伪装成 Windows Terminal) |
| Windows | %TEMP%\6202033.vbs | 投放器 |
| Windows | %TEMP%\6202033.ps1 | 投放器 |
| Linux | /tmp/ld.py | RAT 脚本 |
| Linux | /tmp/.npm-cache/ | 暂存目录 |
| 机制 |
|---|
| 标识符 |
|---|
| macOS | LaunchAgent | com.apple.act.mond |
| Windows | 计划任务 | WindowsTerminalUpdate |
| Linux | Crontab 条目 | 引用 ld.py 或 .npm-cache |
| 已知的受损软件包版本(硬编码数据库) |
| 没有公开通告的零日供应链攻击 |
| 已知的恶意软件包名称 | 尚未列入静态列表的拼写仿冒(typosquat)包 |
| 已知威胁的特定 IOC 文件路径 | 被投放至非标准路径的任意恶意软件 |
| 特定的 C2 IP 地址和域名 | 已轮换或变更的 C2 基础设施 |
直接依赖中的 postinstall 脚本 | 隐藏在看似合法脚本中的混淆恶意代码 |