thresher-sh/thresher
GitHub: thresher-sh/thresher
在隔离临时虚拟机中结合 22 款确定性扫描器与 8 个 AI 分析角色,对开源项目进行供应链安全深度审计并生成放行/拒绝报告。
Stars: 3 | Forks: 0
```
___/|
___________/ |
__________/ |
___/ _____ |
___/ \___/ \ |
___/ \ ______/
___/ _ \______/
/ __/ \__ ___----~
| ,__-~ \--~
| / _, T H R E S H E R
\___/ __/
| / Separate the safe
|_/ from the dangerous.
~
```
供应链安全扫描器。在加固的临时虚拟机(VM)中运行 22 个确定性扫描器及 8 个 AI 分析师角色。生成放行/拒绝报告。
## 安装
```
pip install -e .
# 导入预构建 VM 镜像(快速 — 约30秒)
thresher import latest
# 或者自行构建(约10分钟)
thresher build
```
```
thresher scan https://github.com/owner/repo
```
## 功能说明
```
Host (macOS)
└── Lima VM (ephemeral, firewalled, zero-sudo)
├── Hardened git clone (safe_clone.sh)
├── AI pre-dep discovery (hidden dependency sources)
├── Docker container (dependency resolution)
├── 22 deterministic scanners (parallel)
├── 8 AI analyst agents + adversarial verification
└── Report synthesis
```
| 步骤 | 具体操作 |
|------|-------------|
| **隔离** | 临时 VM。3 层网络加固。无挂载,无开放端口。 |
| **克隆** | 4 阶段加固克隆。中和所有已知的 git 执行攻击向量。 |
| **发现** | AI 查找隐藏依赖(Makefile 中的 git clone,Dockerfile 中的 curl,子模块)。 |
| **解析** | 单个 Docker 容器。仅下载源码。不运行安装脚本。 |
| **扫描** | 22 个扫描器:SCA、SAST、行为、熵值、安装钩子、恶意软件、许可证。 |
| **分析** | 8 个 AI 角色并行调查。对抗性验证减少误报。 |
| **报告** | EPSS/KEV 数据充实。提供放行 / 警告 / 请勿使用 建议。 |
| **清理** | VM 被销毁。无数据残留。 |
在生成最终报告副本之前,所有扫描数据均保留在 VM 内部。
## 8 个分析师角色
每个角色都作为 Claude Code 无头代理在 VM 内运行,并配备专用工具。
| # | 角色 | 核心问题 |
|---|---------|--------------|
| 1 | **偏执狂** | 这段代码是恶意的吗? |
| 2 | **行为主义者** | 是否存在未报告的漏洞? |
| 3 | **调查员** | 这段代码可信吗? |
| 4 | **渗透测试员:漏洞** | 我们将继承哪些漏洞? |
| 5 | **渗透测试员:应用面** | 用户会怎样入侵? |
| 6 | **渗透测试员:内存** | 这会在运行时被破坏吗? |
| 7 | **基础设施审计员** | 部署它安全吗? |
| 8 | **捕影者** | 这段代码隐藏了什么? |
## 22 个扫描器
| 工具 | 检测目标 |
|------|-----------------|
| Syft | SBOM 生成(为 Grype 提供数据) |
| Grype | 依赖项中已知的 CVE |
| OSV-Scanner | CVE + 恶意软件包公告 (MAL-*) |
| Trivy | 容器/文件系统 CVE |
| govulncheck | Go 漏洞(含调用链可达性分析) |
| cargo-audit | 来自 RustSec 的 Rust 漏洞 |
| Semgrep | 代码漏洞和危险模式 |
| Semgrep (supply-chain) | 针对依赖源的自定义规则:数据外泄、下载并执行、编码载荷 |
| Bandit | Python 安全反模式 |
| GuardDog | 清单文件中的可疑行为 |
| GuardDog (deps) | 针对实际依赖源码的行为启发式分析 |
| Install Hooks | 包含网络/Shell 活动的 preinstall/postinstall 脚本 |
| Entropy | 高熵字符串,base64,十六进制转义,JS 混淆器模式,对解码内容的 eval 调用 |
| deps.dev | OpenSSF 记分卡,误植域名,版本历史异常 |
| Registry Metadata | 维护者变更,tarball 大小突增,安装脚本的引入 |
| Gitleaks | 硬编码的 API 密钥、令牌、凭证 |
| Checkov | Dockerfile/Terraform/K8s 配置缺陷 |
| Hadolint | Dockerfile 最佳实践 |
| YARA | 已知恶意软件特征 |
| ClamAV | 病毒和恶意软件特征 |
| capa | 编译二进制文件中的能力 |
| ScanCode | 基于文件内容的许可证合规性 |
## 用法
```
# 使用 AI 分析进行全面扫描
thresher scan https://github.com/owner/repo
# 仅使用 Deterministic scanners(无需 API key)
thresher scan https://github.com/owner/repo --skip-ai
# 自定义 VM 资源
thresher scan https://github.com/owner/repo --cpus 8 --memory 16 --disk 100
# 下载高风险隐藏依赖(binaries, tarballs)
thresher scan https://github.com/owner/repo --high-risk-dep
# 使用 tmux split-pane UI(左侧扫描,右侧日志)
thresher scan https://github.com/owner/repo --tmux
```
使用 [uv](https://docs.astral.sh/uv/):
```
uv run thresher scan https://github.com/owner/repo --skip-ai
```
### 命令
| 命令 | 功能 |
|---------|-------------|
| `thresher scan ` | 扫描代码仓库 |
| `thresher build` | 构建/重建缓存的基础 VM 镜像 |
| `thresher stop` | 停止所有 VM 和 tmux 会话 |
| `thresher list` | 列出 Releases 中可用的预构建 VM 镜像 |
| `thresher import ` | 导入预构建的 VM 镜像(跳过构建步骤) |
| `thresher export` | 导出你的基础 VM 镜像以进行分发 |
### 标志
| 标志 | 默认值 | 说明 |
|------|---------|-------------|
| `--depth N` | 2 | 传递依赖深度 |
| `--skip-ai` | off | 仅运行确定性扫描器 |
| `--high-risk-dep` | off | 下载高风险的隐藏依赖 |
| `--verbose` | off | 详细的工具输出 |
| `--output DIR` | `./thresher-reports` | 报告输出目录 |
| `--cpus N` | 4 | VM CPU 数量 |
| `--memory N` | 8 | VM 内存 |
| `--disk N` | 50 | VM 磁盘空间 |
| `--tmux` | off | Tmux 分屏界面 |
### 配置
将 `thresher.toml.example` 复制为 `thresher.toml`。命令行标志会覆盖配置文件中的值。
```
model = "sonnet"
depth = 2
output_dir = "./thresher-reports"
tmux = false
[vm]
cpus = 4
memory = 8
disk = 50
[limits]
max_json_size_mb = 10
max_file_size_mb = 50
max_copy_size_mb = 500
max_stdout_mb = 50
```
## 输出
```
~~~~~~~~~~~_/|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FINDINGS
P0 CRIT HIGH MED LOW
0 2 5 12 23
Report: ./thresher-reports/example-repo-20260401/
~~~~~~~~~~~_/|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
输出目录中的报告:
| 文件 | 内容 |
|------|----------|
| `executive-summary.md` | 放行 / 警告 / 请勿使用 建议 |
| `detailed-report.md` | 按优先级排列的所有发现及修复建议 |
| `findings.json` | 机器可读格式(CVSS、EPSS、KEV、AI 评分) |
| `sbom.json` | CycloneDX SBOM |
| `scan-results/` | 原始扫描器输出 |
### 优先级
| 优先级 | 标准 |
|----------|----------|
| **P0** | CISA KEV(正在被积极利用),或 AI 确认的数据外泄/后门 |
| **严重** | CVSS >= 9.0,EPSS > 90th 百分位,或 AI 风险 9-10 |
| **高危** | CVSS 7.0-8.9,EPSS > 75th 百分位,或 AI 风险 7-8 |
| **中危** | CVSS 4.0-6.9,EPSS > 50th 百分位,或 AI 风险 4-6 |
| **低危** | 其他所有情况 |
P0 或 严重 = **请勿使用**。仅 高危 = **警告**。中危 及以下 = **放行**。
## 安全模型
| 层级 | 功能 |
|-------|-------------|
| **VM 隔离** | Lima `vz` 后端,`--plain`,无挂载,无端口转发 |
| **零 sudo** | 扫描用户只能运行一个硬编码的 Docker 包装器 |
| **3 层网络** | iptables 白名单 + hostResolver DNS + 网关固定 |
| **加固克隆** | 4 阶段 safe_clone.sh(中和所有 git 执行攻击向量) |
| **依赖沙箱** | `--network=none`,`--read-only`,`--cap-drop=ALL` |
| **仅源码** | `pip download --no-binary`,`npm pack`,`cargo vendor` |
| **宿主机边界** | 暂存目录,移除软链接,路径穿越拒绝,大小限制 |
| **API 密钥** | tmpfs 读取即删,绝不存入 Shell 环境变量 |
| **临时性** | 每次扫描后 VM 均被销毁 |
## 环境要求
- 搭载 Apple Silicon 的 macOS
- [Lima](https://lima-vm.io) (`brew install lima`)
- Python 3.11+
- `ANTHROPIC_API_KEY` 或 `claude login`(除非使用 `--skip-ai`)
- [tmux](https://github.com/tmux/tmux) (`brew install tmux`) -- 可选
VM 大约需要 30 GB 磁盘空间。可通过 `--disk` 或 `thresher.toml` 进行配置。
## 许可证
MIT
标签:AI安全分析, AMSI绕过, Docker容器安全, EPSS, GitHub安全, Go/No-Go报告, KEV, SAST, Thresher, 临时虚拟机, 威胁检测, 安全合规, 安全沙箱, 开源软件安全, 恶意软件扫描, 盲注攻击, 网络代理, 网络信息收集, 网络隔离, 自定义DNS解析器, 误报率降低, 请求拦截, 逆向工具