braasdas/taintwatch
GitHub: braasdas/taintwatch
taintwatch 是一款本地化的开源供应链投毒扫描工具,通过聚合多个恶意包情报源并深入检查 lockfile 和已安装依赖,帮助开发者和安全团队快速发现代码库中被污染的包版本。
Stars: 1 | Forks: 0
taintwatch
你的依赖被污染了。其他所有人的图标也一样。
`taintwatch` 扫描你的本地代码库以查找**已知被破坏的包版本**——这些版本来自 Shai-Hulud、chalk/debug、Nx s1ngularity、Ultralytics,以及明天早上你睡觉时落地的下一个。它从 OSV.dev(`MAL-*` 记录)、OpenSSF malicious-packages 仓库和 Aikido Intel 拉取实时数据源;匹配你配置的根目录下的每个 lockfile 和每个已安装的 `node_modules` / `site-packages` 目录;当你的某个仓库在磁盘上存在恶意软件时,它会通过桌面通知或 Discord 向你发出警告。 在你明确要求之前,它**不会**在后台运行任何内容。安装时不会自动安装任何东西。与 `pre-commit install` 具有相同的同意模型。 ## 安装 **macOS / Linux** ``` curl -sSL https://raw.githubusercontent.com/braasdas/taintwatch/master/install.sh | sh ``` **Windows (PowerShell)** ``` irm https://raw.githubusercontent.com/braasdas/taintwatch/master/install.ps1 | iex ``` **任何安装有 Python 3.10+ 的平台** ``` pipx install taintwatch # recommended # 或者:pip install --user taintwatch ``` 然后在首次运行时: ``` taintwatch config init # write a starter config taintwatch # launches the interactive TUI ``` 单独的 `taintwatch` 命令会打开一个全屏交互式 UI,包含用于扫描、数据源状态、命中分类和报告浏览的菜单。使用方向键导航,具有单字母快捷键(`s` 扫描,`u` 数据源,`h` 命中,`f` 数据源状态,`r` 报告,`c` 配置,`q` 退出)。在命中项上按 `enter` 可查看完整的公告及可复制粘贴的修复命令。 如果你更倾向于一次性 CLI 使用(如 cron、脚本): ``` taintwatch scan # one-shot scan, prints results, exits taintwatch feeds update # refresh advisory feeds taintwatch watch # foreground daemon loop taintwatch ui # explicit alias for the TUI ``` ## 三种提示音级别 当 taintwatch 发现问题时,桌面通知会根据你应当警惕的程度播放不同的声音: | 严重性 | 触发条件 | Windows | macOS | Linux | |------------|----------------------------------------------------------------|-------------------|----------|---------------------------------| | `CRITICAL` | 被破坏的代码**已安装在磁盘上**,位于 `node_modules/` 或 `site-packages/` 中 —— 它可以在你下次构建、启动开发服务器或导入时执行。 | 循环警报 | Sosumi | `dialog-warning.oga` + urgency=critical | | `HIGH` | 被破坏的版本被固定在 lockfile 中。下次执行 `npm ci` / `pip install -r` 时将拉取它。 | 默认提示音 | Glass | `message-new-instant.oga` + urgency=normal | | `INFO` | 信息级别(例如,之前被标记的仓库现已清理干净)。 | 短促提醒音 | Tink | `complete.oga` + urgency=low | Discord webhook 也会随之升级:仅在 `CRITICAL` 时通过 `@here` 提醒;其他情况为静默发送。 ## 功能说明 - 从三个免费、无需认证、可重新分发数据源拉取数据:OSV.dev 批量镜像、OpenSSF `malicious-packages` 和 Aikido Intel。 - 解析 **npm, yarn, pnpm, pip (requirements + Pipfile), poetry, Cargo, Go modules** 的 lockfile。 - 遍历 `node_modules/` 和 `site-packages/` 以查找*已安装*但已不在 lockfile 中的恶意软件(例如 Shai-Hulud 事件中,你回滚了 lockfile 但没有执行 `rm -rf node_modules`)。 - 将所有内容存储在一个本地 SQLite 文件中。无云端、无遥测、无账号。 - 对扫描结果进行差异比对,因此仅对*新增*命中项发出警报。 - 可选的自愿加入式自动启动,通过 Windows 任务计划程序、macOS launchd 或 Linux systemd-user 实现 —— 一个明确的安装命令(`taintwatch install-autostart`),以及一个明确的卸载命令。 ## CLI ``` taintwatch scan [--root PATH] [--deep/--no-deep] [--skip-update] taintwatch watch # foreground daemon loop taintwatch feeds update | status taintwatch report show [--last N] taintwatch config init | path taintwatch install-autostart [--interval 60] [--dry-run] taintwatch uninstall-autostart taintwatch autostart-status ``` ## 存在原因 在 2025 年,ReversingLabs 记录的恶意开源包数量同比激增了 73%。Sonatype 拦截了 454,600 个新增恶意包。Shai-Hulud 蠕虫在 72 小时内自我复制到了大约 500 个 npm 包中(发生了两次——分别在 9 月和 11 月)。chalk/debug 污染事件在每周下载量约 20 亿的软件包中存活了两个半小时。Nx 攻击将你的 AI CLI 武器化并用来对付你。xz 后门经历了大约 2.5 年的社会工程学攻击,最终只是因为有人注意到 sshd 变慢了 500ms 才意外发现。 你不可能靠刷 Twitter 来跟上这些变化。 ## 许可证 代码采用 MIT 许可证。数据源数据具有其各自独立的每来源许可 —— OSV 记录为 CC-BY 4.0 / Apache-2.0(按记录),OpenSSF 数据为 Apache-2.0,Aikido Intel 的数据许可未公开,因此我们仅将其用于本地查询。如果你的组织需要仅限可重新分发的来源,请在配置中设置 `[feeds] aikido = false`。 ## 发布(维护者须知) PyPI 发布使用 [Trusted Publishing](https://docs.pypi.org/trusted-publishers/) —— 无需 API tokens。打标签并推送即可: ``` git tag v0.1.1 git push origin v0.1.1 ``` `.github/workflows/release.yml` 工作流会使用 `hatch build` 构建 sdist + wheel,并通过 OIDC 进行发布。标签:devsecops, Discord通知, GNU通用公共许可证, IP 地址批量处理, lockfile分析, Node.js, npm, OpenSSF, OSV, pip, Python, TUI, Vercel, 云安全监控, 代码安全, 依赖安全, 依赖风险, 包管理器安全, 安全合规, 安全告警, 安全防护, 开发安全, 恶意包, 投毒检测, 无后门, 本地扫描, 桌面通知, 漏洞枚举, 终端用户界面, 网络代理, 逆向工具, 静态分析