digi4care/shai-scan

GitHub: digi4care/shai-scan

零依赖的 CLI 供应链安全扫描工具,通过匹配内置威胁数据库来检测 npm/PyPI lockfile 中的已知被篡改包版本及系统级失陷指标。

Stars: 0 | Forks: 0

# shai-scan [![npm version](https://img.shields.io/npm/v/shai-scan)](https://www.npmjs.com/package/shai-scan) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Node.js](https://img.shields.io/badge/node-%3E%3D22-brightgreen)](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, 上游代理, 加密, 威胁检测, 恶意软件分析, 持久化检测, 文件系统监控, 文档安全, 漏洞扫描器, 结构化查询, 网络信息收集, 网络安全, 自动化安全, 自动化攻击, 自动笔记, 进程扫描, 隐私保护, 零依赖