digi4care/shai-scan
GitHub: digi4care/shai-scan
零依赖的 CLI 供应链安全扫描工具,通过匹配内置威胁数据库来检测 npm/PyPI lockfile 中的已知被篡改包版本及系统级失陷指标。
Stars: 0 | Forks: 0
# shai-scan
[](https://www.npmjs.com/package/shai-scan)
[](LICENSE)
[](https://nodejs.org/)
## 为什么需要它?
2026年5月11日,一种名为 **Mini Shai-Hulud**(CVE-2026-45321, GHSA-g7cv-rxg3-hmpx)的自传播供应链蠕虫病毒入侵了 npm 生态系统。该恶意软件被归因于 **TeamPCP**(又名 DeadCatx3、PCPcat、ShellForce、CipherForce),它劫持了 GitHub Actions OIDC 令牌,以发布具有有效 SLSA Build Level 3 来源的恶意包。它从 CI/CD 流水线、云提供商和加密货币钱包中窃取凭证,并在 Claude Code 和 VS Code 中安装了持久化钩子。其内置的“死亡开关”威胁称,如果 npm 令牌被撤销,就会清空用户的主目录。
受影响的软件包包括 TanStack router 和 start 包、Mistral AI SDK、OpenSearch 客户端、UiPath 工具以及数十个其他包。由于供应链攻击传播迅速,组织需要一个轻量级、值得信赖的扫描器,以便在任何地方运行而不会给其自身的攻击面增加新的依赖。
## 功能
- **Lockfile 扫描** — 检测 `package-lock.json`、`pnpm-lock.yaml`、`yarn.lock`、`bun.lock`、`bun.lockb`、`poetry.lock`、`Pipfile.lock` 和 `requirements.txt` 中受损的 npm 和 PyPI 包
- **系统 IOC 检查** — 扫描正在运行的进程、文件系统工件、网络连接和已知的持久化路径,以查找失陷指标 (IOC)
- **零运行时依赖** — 仅使用 Node.js/Bun 内置模块(`fs`、`path`、`child_process`、`os`)。该扫描器不会增加您的供应链风险
- **多种输出格式** — 人类可读的文本、机器可读的 JSON,以及用于 GitHub Code Scanning 的 SARIF
- **原生支持 CI/CD** — 为自动化设计的退出代码(`0` = 干净,`1` = 有发现,`2` = 错误)
- **路径无关** — 接受任何目录;默认为当前工作目录
- **基于活动的数据库** — 新的攻击浪潮作为独立的活动被添加到 `src/db.ts` 中;更新文件并重新运行即可
## 安装
无需安装。直接使用您选择的包运行器运行:
```
# npx
npx shai-scan
# bunx
bunx shai-scan
# pnpm dlx
pnpm dlx shai-scan
```
全局安装(可选):
```
npm install -g shai-scan
# 或
pnpm add -g shai-scan
```
从源码安装:
```
git clone https://github.com/digi4care/shai-scan.git
cd shai-scan
pnpm install
node --experimental-strip-types src/cli.ts --help
```
## 使用
### 扫描当前项目
```
npx shai-scan
```
### 扫描特定路径
```
npx shai-scan ~/projects/my-app
```
### 用于自动化的 JSON 输出
```
npx shai-scan --json .
```
### 用于 GitHub Code Scanning 的 SARIF 输出
```
npx shai-scan --sarif --sarif-file results.sarif .
```
### CI/CD 退出代码
```
#!/bin/bash
npx shai-scan --severity high . || {
code=$?
if [ "$code" -eq 1 ]; then
echo "Supply chain findings detected"
exit 1
elif [ "$code" -eq 2 ]; then
echo "Scanner error"
exit 2
fi
}
```
## CI/CD 集成
### GitHub Actions(文本输出)
```
name: Supply Chain Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx shai-scan --severity high .
```
### GitHub Actions(SARIF 上传)
```
name: Supply Chain Scan SARIF
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1'
jobs:
scan:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx shai-scan --sarif --sarif-file results.sarif .
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
```
## 输出格式
| 格式 | 标志 | 描述 |
|--------|------|-------------|
| Text | (默认) | 人类可读的发现结果表格,包含严重程度、包名称、版本和活动详情 |
| JSON | `--json` | 结构化的 JSON 发现结果数组,适合摄入到 SIEM 或自定义仪表盘中 |
| SARIF | `--sarif` | OASIS SARIF 2.1.0 格式,用于上传到 GitHub Code Scanning、GitLab Secure 或其他 SARIF 消费者 |
JSON 输出示例:
```
[
{
"package": "@tanstack/react-router",
"version": "1.169.5",
"ecosystem": "npm",
"severity": "critical",
"campaign": "mini-shai-hulud-wave4",
"cve": "CVE-2026-45321",
"reference": "https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx"
}
]
```
## 退出代码
| 代码 | 含义 |
|------|---------|
| 0 | 未检测到受损的包或 IOC |
| 1 | 检测到一个或多个发现 |
| 2 | 运行时错误(路径无效、lockfile 不可读等) |
## 添加新活动
当发现新的供应链攻击时,请更新 `src/db.ts`:
1. 添加一个新的 `CompromisedVersion[]` 数组,包含受影响的包和版本
2. 将一个新的 `Campaign` 对象附加到 `CAMPAIGNS` 数组中,包括 CVE/GHSA 标识符、严重程度、描述、参考 URL 和 IOC 指标
3. `buildLookup()` 函数会在下次运行时自动重建查找映射
无需重构步骤。因为该项目直接使用 `node --experimental-strip-types` 运行 TypeScript,对 `src/db.ts` 的更改会立即生效。
## 安全注意事项
- **零运行时依赖**:扫描器仅使用 Node.js/Bun 内置模块。它不会在运行时下载或执行第三方代码,从而消除了扫描器本身成为入侵媒介的风险。
- **pnpm 作为包管理器**:pnpm 使用严格的 lockfile,默认不执行生命周期脚本,并支持内容寻址存储。与其他包管理器相比,这些属性减小了攻击面。
- **推荐的 `.npmrc` 设置**:为了在安装包时提供最大程度的保护,请将以下内容添加到您的项目或全局 `.npmrc` 中:
ignore-scripts=true
engine-strict=true
- **无网络调用**:`shai-scan` 不会回传数据、下载签名或需要 API 密钥。所有活动数据随包一起提供。
## 受影响的包(当前活动)
以下包和版本被确认在 **CVE-2026-45321**(Mini Shai-Hulud 第 4 波)中受到入侵。这是一个具有代表性的子集;完整列表维护在 `src/db.ts` 中。
| 包 | 生态系统 | 受影响的版本 |
|---------|-----------|---------------------|
| `@tanstack/react-router` | npm | 1.169.5, 1.169.8 |
| `@tanstack/vue-router` | npm | 1.169.5, 1.169.8 |
| `@tanstack/solid-router` | npm | 1.169.5, 1.169.8 |
| `@tanstack/router-core` | npm | 1.169.5, 1.169.8 |
| `@tanstack/react-start` | npm | 1.167.68, 1.167.71 |
| `@mistralai/mistralai` | npm | 2.2.2, 2.2.3, 2.2.4 |
| `@mistralai/mistralai-azure` | npm | 1.7.2, 1.7.3 |
| `mistralai` | pypi | 2.4.6 |
| `@opensearch-project/opensearch` | npm | 3.5.3, 3.6.2, 3.7.0, 3.8.0 |
| `@uipath/robot` | npm | 1.3.4 |
| `@squawk/airways` | npm | 0.4.2, 0.4.3, 0.4.5 |
| `@draftauth/core` | npm | 0.13.1, 0.13.2 |
| `@tallyui/core` | npm | 0.2.1, 0.2.2, 0.2.3 |
| `safe-action` | npm | 0.8.3, 0.8.4 |
| `cmux-agent-mcp` | npm | 0.1.3 - 0.1.8 |
| `nextmove-mcp` | npm | 0.1.3, 0.1.4, 0.1.5, 0.1.7 |
| `ts-dna` | npm | 3.0.1, 3.0.2, 3.0.4 |
| `cross-stitch` | npm | 1.1.3, 1.1.4, 1.1.6 |
| `git-git-git` | npm | 1.0.8 - 1.0.12 |
| `git-branch-selector` | npm | 1.3.3 - 1.3.7 |
| `agentwork-cli` | npm | 0.1.4, 0.1.5 |
| `wot-api` | npm | 0.8.1, 0.8.2, 0.8.4 |
| `ml-toolkit-ts` | npm | 1.0.4, 1.0.5 |
| `@beproduct/nestjs-auth` | npm | 0.1.2 - 0.1.19 |
| `@dirigible-ai/sdk` | npm | 0.6.2, 0.6.3 |
| `@taskflow-corp/cli` | npm | 0.1.24 - 0.1.29 |
| `@tolka/cli` | npm | 1.0.2, 1.0.3, 1.0.4, 1.0.6 |
| `@supersurkhet/cli` | npm | 0.0.2 - 0.0.7 |
| `guardrails-ai` | pypi | 0.10.1 |
## 许可证
MIT。详情请参见 [LICENSE](LICENSE)。
## 免责声明
`shai-scan` 是一种检测辅助工具,不能替代全面的安全审计、依赖审查或威胁情报平台。它根据内置的数据库识别已知的受损版本;在添加相关活动之前,可能无法检测到新型或零日供应链攻击。请始终践行纵深防御:审计依赖项,锁定版本,验证来源,并监控 CI/CD 流水线。
标签:AMSI绕过, Bun, CI/CD安全, CISA项目, CVE-2026-45321, DAST, DevSecOps, DNS 解析, GitHub Actions, GNU通用公共许可证, IOC扫描, IP 地址批量处理, Linux安全, Llama, Lockfile扫描, Mini Shai-Hulud, MITM代理, Node.js, npm安全, OpenCanary, PyPI安全, SARIF, SLSA证明, StruQ, 上游代理, 加密, 威胁检测, 恶意软件分析, 持久化检测, 文件系统监控, 文档安全, 漏洞扫描器, 结构化查询, 网络信息收集, 网络安全, 自动化安全, 自动化攻击, 自动笔记, 进程扫描, 隐私保护, 零依赖