ry-allan/tanstack-compromise-checker

GitHub: ry-allan/tanstack-compromise-checker

针对 TanStack 供应链投毒事件(CVE-2026-45321)及 Mini Shai-Hulud 蠕虫的本地快速检测脚本,覆盖依赖包、lockfile、多种持久化后门、C2 域名和 AI 工具配置等维度的 IOC 扫描。

Stars: 0 | Forks: 0

# tanstack-compromise-checker 检测本地项目检出中的 TanStack 供应链攻击([CVE-2026-45321](https://github.com/advisories/GHSA-g7cv-rxg3-hmpx))以及相关的 Mini Shai-Hulud 蠕虫痕迹。 该脚本旨在用于源码检出、CI 作业和 Docker 构建中的快速分类。干净的结果意味着未发现以下任何已知指标。这不属于完整的取证调查,也不保证机器从未被暴露过。 ## 检查内容 | 类别 | 详情 | |---|---| | **受感染包** | 所有 42 个 `@tanstack/*` 包 + 20 个由蠕虫传播的次要受害者(`@mistralai`、`@opensearch-project`、`@draftlab`、`safe-action` 等) | | **Lockfile 扫描** | `pnpm-lock.yaml`、`yarn.lock`、`bun.lock`、`bun.lockb`、`package-lock.json`,包括多行 npm v3 `packages` 条目和 Yarn v1 选择器/版本节 | | **Payload 文件** | `node_modules` 中的 `router_init.js`、`tanstack_runner.js` 并进行 SHA-256 验证;哈希值完全匹配和不匹配均会导致扫描失败 | | **感染媒介** | 任何已安装包中作为 `optionalDependency` 的 `@tanstack/setup` | | **持久化** | 项目和主目录设置中的 Claude Code `SessionStart` 钩子,VS Code `folderOpen` 任务,`gh-token-monitor`(LaunchAgent + systemd),恶意的 GitHub workflows | | **磁盘痕迹** | `.claude/router_runtime.js`、`.claude/setup.mjs`、`.vscode/setup.mjs`、`gh-token-monitor.sh`、`com.user.gh-token-monitor.plist` | | **源码 IOC** | 攻击者 commit 哈希、C2 域名(`api.masscan.cloud`、`git-tanstack.com`)、Session Protocol 端点、PBKDF2 salt、活动字符串 | | **Git 历史** | 由 `claude@users.noreply.github.com` 创作的 commits | | **分支模式** | `dependabot/github_actions/format/*` 和 `dependabout/*/setup-formatter` | | **AI 工具配置** | 被篡改的 `.claude/mcp.json` 和 `.kiro/settings/mcp.json` | | **运行中的进程** | 守护进程化的 payload 和 `gh-token-monitor` 进程 | | **npm tokens** | 带有勒索标记的 tokens(`IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner`) | ## 未涵盖的内容 - 它会检查公开公告中已知的包名、版本、文件名、哈希值、域名、分支名和持久化路径。新的攻击者基础设施或重命名的 payload 可能需要新的指标。 - 它会按照包管理器的优先级顺序(`pnpm`、`yarn`、`bun`,然后是 `npm`)选择一个项目的 lockfile。如果代码仓库有意包含多个 lockfile,请分别扫描每个相关的包管理器状态。 - 它可以识别可疑的文件和配置,但它不会移除恶意软件、轮换密钥、撤销 tokens 或对主机进行磁盘镜像。 - npm token 检查仅在 `npm` 可用且有足够权限执行 `npm token list` 时运行。 - 主目录持久化检查会检查运行脚本的进程的当前 `HOME` 目录。在 CI 或容器中,这可能与开发者工作站的主目录不同。 ## 快速开始 ``` # 扫描当前目录 bash check-tanstack-compromise.sh . # 扫描特定项目 bash check-tanstack-compromise.sh /path/to/project # One-liner (curl) curl -sL https://raw.githubusercontent.com/ry-allan/tanstack-compromise-checker/main/check-tanstack-compromise.sh | bash ``` 退出码 `0` = 未发现所涵盖的指标。 退出码 `1` = 发现了所涵盖的妥协或可疑 payload 指标。 ### 示例输出(干净的项目) ``` ═══════════════════════════════════════════════════════════════ TanStack Supply Chain Compromise Check (CVE-2026-45321) ═══════════════════════════════════════════════════════════════ Advisory: GHSA-g7cv-rxg3-hmpx Reference: https://snyk.io/blog/tanstack-npm-packages-compromised/ Deep dive: https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-… [*] Scanning: /Users/xxxxx/repos/xxxxx [*] Package manager: pnpm (pnpm-lock.yaml) [*] Checking installed TanStack packages against 42 known-compromised versions… [*] Checking worm-propagated secondary victims (Mini Shai-Hulud)… [*] Packages: @mistralai, @opensearch-project, @draftlab, @draftauth, [*] @dirigible-ai, safe-action, cmux-agent-mcp, nextmove-mcp, [*] git-git-git, git-branch-selector, agentwork-cli, ml-toolkit-ts, [*] wot-api, cross-stitch, ts-dna [*] Scanning lockfile for known-compromised versions (pnpm-lock.yaml)… [✓] No compromised versions in lockfile [*] Checking for persistence artifacts (payload files, hooks, services, C2)… [✓] No malicious author commits in git history ─────────────────────────────────────────────────────────────── [✓] No compromise detected. ─────────────────────────────────────────────────────────────── Prevent future supply-chain attacks Run with --install-alias to add a pm() shell function that wraps every npm/pnpm/yarn/bun install through Aikido's safe-chain scanner. safe-chain blocks packages younger than 48 hours and flags known-bad versions before they touch node_modules. ./check-tanstack-compromise.sh --install-alias ``` ## safe-chain 别名 通过使用 [Aikido 的 safe-chain](https://github.com/AikidoSec/safe-chain) 封装您的包管理器来防止未来的供应链攻击: ``` bash check-tanstack-compromise.sh --install-alias ``` 这会添加一个 `pm()` shell 函数,通过 `safe-chain` 路由 `npm`/`pnpm`/`yarn`/`bun`,拦截创建不到 48 小时的包并标记已知的不良版本。 ## 测试覆盖率 集成的 Dockerfile 仅创建合成的测试夹具。它不会下载真实的受感染包。 主要的测试夹具断言在包清单、lockfiles、持久化痕迹、workflows、git 历史、源码 IOC、payload 文件名、AI 工具配置和修复输出中触发了所有 33 条检测消息: ``` docker build -f integration.Dockerfile -t tanstack-check-test . ``` Docker 构建还包括针对以下情况的定向回归覆盖: - 包名和受感染版本出现在不同行的 `package-lock.json` v3 条目。 - 包选择器和受感染的 `version` 出现在不同行的 Yarn v1 lockfile 条目。 - 哈希值不匹配的 `router_init.js` payload 文件名返回退出码 `1`。 - 即使存在干净的项目级别 `.claude/settings.json`,也会检测到主目录级别的 Claude Code `SessionStart` 钩子。 构建完成后,可以直接运行镜像命令: ``` docker run --rm tanstack-check-test ``` ## 参考 - [GHSA-g7cv-rxg3-hmpx](https://github.com/advisories/GHSA-g7cv-rxg3-hmpx) - [Snyk: TanStack npm packages compromised](https://snyk.io/blog/tanstack-npm-packages-compromised/) - [StepSecurity: Mini Shai-Hulud deep dive](https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem)
标签:AI工具安全, bun, C2域名, CI/CD安全, Claude Code, Cutter, CVE-2026-45321, DNS 解析, Docker, GitHub Actions, GNU通用公共许可证, IOC检测, LaunchAgent, Llama, macOS安全, Node.js, npm, pnpm, Syscall 审计, systemd, TanStack, VS Code, yarn, 供应链攻击, 安全助手, 安全防御评估, 库, 应急响应, 应用安全, 快速分类, 暗色界面, 本体建模, 源码扫描, 网络安全, 自动笔记, 蠕虫病毒, 请求拦截, 隐私保护