devinshawntripp/rust-scanner
GitHub: devinshawntripp/rust-scanner
基于 Rust 的高性能容器镜像漏洞扫描器,通过源包名称正确映射和实时 API 查询实现比 Trivy、Grype 更高的检测准确率。
Stars: 0 | Forks: 0
# ScanRook CLI
[](https://github.com/devinshawntripp/rust-scanner/releases)
[](https://github.com/devinshawntripp/rust-scanner/actions/workflows/ci.yml)
[](LICENSE-SCANROOK-SOURCE-AVAILABLE.md)
本地优先的容器镜像扫描器,支持可选的云增强。
优先进行本地扫描。仅在需要更深入的上下文和组织工作流时添加云增强。
## 快速开始(60 秒内)
```
curl -fsSL https://scanrook.sh/install | bash
scanrook scan --file ./image.tar --format text
scanrook scan --file ./image.tar --format json --out report.json
```
可选的云认证:
```
scanrook auth login --base https://scanrook.io
scanrook limits
```
## 为什么选择 ScanRook
- 默认本地优先:扫描运行无需强制云认证。
- 已安装状态优先方法:优先考虑包清单证据。
- 云增强是附加性的:提供更好的上下文而不阻塞本地扫描。
- 友好的免费增值模式:即使达到增强速率限制,本地扫描依然可用。
## 终端演示
```
scanrook scan --file ./image.tar --mode deep --format json --out report.json
```
演示 GIF 将在 Beta 版内容推出期间添加到 `docs/assets/scanrook-demo.gif`。
## 对比(宏观)
| 功能 | ScanRook | Trivy | Grype | Syft | Snyk Container | Docker Scout |
|---|---|---|---|---|---|---|
| 本地优先 CLI 工作流 | 是 | 是 | 是 | 是(侧重 SBOM) | 部分 | 部分 |
| 可选云增强 | 是 | 部分 | 部分 | 否 | 是 | 是 |
| 已安装状态优先定位 | 是 | 部分 | 部分 | 否 | 部分 | 部分 |
| 组织工作流(历史、团队、策略) | 是(平台) | 部分 | 否 | 否 | 是 | 是 |
注意:
- 此表属于定位级别,严格的功能对等声明应由基准测试支持。
- 基准测试报告计划在发布内容轨道中推出。
## 基准测试结果
环境:macOS (darwin/arm64), `scanrook 1.6.2`, `trivy 0.69.1`, `grype 0.109.0`
### 完整矩阵(warm-cache)
| Image | Size | ScanRook | Trivy | Grype |
|---|---:|---:|---:|---:|
| **alpine:3.20** | 8.7 MB | **0.04s / 7** | 0.1s / 0 | 1.3s / 4 |
| **debian:12** | 137 MB | **1.4s / 196** | 0.2s / 92 | 1.2s / 86 |
| **ubuntu:24.04** | 98 MB | **1.3s / 174** | 0.1s / 13 | 1.0s / 26 |
| **rockylinux:9** | 189 MB | **1.9s / 481** | 0.2s / 176 | 1.8s / 539 |
| **nginx:1.27** | 192 MB | **2.0s / 506** | 29.8s / 253 | 1.9s / 248 |
| **postgres:17** | 453 MB | **1.6s / 259** | 1.2s / 167 | 2.6s / 164 |
| **redis:7-alpine** | 41 MB | **1.3s / 5** | 0.4s / 80 | 1.4s / 88 |
| **golang:1.23** | 1.1 GB | **2.3s / 2194** | 0.6s / 1028 | 5.1s / 1163 |
| **node:20** | 1.1 GB | **4.9s / 3868** | 1.0s / 2220 | 7.3s / 1463 |
| **python:3.12** | 1.0 GB | **3.2s / 3911** | 1.1s / 2246 | 5.3s / 1501 |
ScanRook 在 10 个镜像中的 9 个上发现了**比 Trivy 和 Grype 更多的漏洞**,并在 10 个镜像中的 7 个上**在速度上击败了 Grype**。
### 为什么 ScanRook 发现更多
- **源包映射**:OSV 按源名称索引(例如 `glibc` 而非 `libc6`)。ScanRook 解析 dpkg `Source:` 和 APK `o:` 字段以正确查询。Trivy 和 Grype 在其本地数据库中有类似的映射,但 ScanRook 使用正确名称进行的实时 OSV 查询通常会显示更多结果。
- **Alpine**:正确的生态系统名称(`Alpine`,而非 `Alpine Linux`)+ 源包名称。ScanRook 发现 7 个 CVE;Trivy 发现 0 个。
- **Debian/Ubuntu**:通过 dpkg 状态解析源包。Debian 发现 196 个 vs Grype 的 86 个。Ubuntu 174 个 vs Grype 的 26 个。
- **RHEL/Rocky**:三源增强(OSV + OVAL + Red Hat 安全数据)。显示出 Trivy 完全遗漏的未修复 CVE。
- **大型镜像**:Node/Python/Golang 拥有数千个 Debian 软件包。源名称映射使 ScanRook 的发现数量比 Grype 多 2-3 倍。
### 性能 (v1.6.2)
- Alpine warm-cache 扫描:**0.04s**(比 Trivy 快 3 倍,比 Grype 快 33 倍)
- Node.js warm-cache:**4.9s**(比 Grype 的 7.3s 快 1.5 倍)
- 发行版数据源缓存已修复:Alpine SecDB/Debian tracker 得到正确缓存(**8.1s → 14ms**)
- OVAL 二进制缓存:跳过 50MB XML 重新解析(**953ms → 74ms**)
- Rocky 9 总计:自 v1.5.3 起 **15.2s → 1.9s**(快 8 倍)
### 复现
```
scanrook benchmark \
--file ./image.tar \
--out-dir ./benchmark-out \
--profile warm
```
完整报告:[`docs/benchmarks/reports/`](docs/benchmarks/reports/)
### 透明度
所有基准测试均在同一台机器上使用相同的镜像运行——没有特定于扫描器的硬件或缓存优势。ScanRook 仅使用其标准的 SHA256 键控文件缓存;没有特定于基准测试的预加载或硬编码。冷扫描时间较长,因为 ScanRook 查询实时 API,而 Trivy 和 Grype 使用预编译的本地数据库。完整的方法论和透明度详情请访问 [scanrook.io/docs/benchmarks](https://scanrook.io/docs/benchmarks)。
## 命令
```
scanrook scan --file ./image.tar --format json --out report.json
scanrook scan --file ./image.tar --mode deep --progress --log-format text --log-level info
scanrook scan --file ./image.tar --mode deep --progress --log-format json --log-level debug
scanrook benchmark --file ./image.tar --out-dir ./benchmark-out --profile warm
scanrook diff --ours ./scanrook.json --against ./trivy.json --out ./diff.json
scanrook db sources
scanrook db status
scanrook db check
scanrook db update --source all
scanrook db update --source nvd --cve CVE-2021-25219
scanrook db update --source redhat --cve CVE-2021-25219 --errata RHSA-2022:8162
scanrook db clear
scanrook db download --file ./image.tar --mode deep
scanrook db warm --file ./image.tar --mode deep
scanrook auth login --api-key
scanrook auth logout
scanrook whoami
scanrook limits
scanrook config set telemetry.opt_in true
```
兼容性说明:`scanner` 仍作为临时别名保留,并会打印弃用警告。
## 数据源
活跃的漏洞和增强来源:
- OSV API (`osv`) — 包括 npm, PyPI, Go, Maven, crates.io 在内的 10 多个生态系统
- NVD CVE API (`nvd`) — CVSS 评分和 CPE 匹配
- Red Hat Security Data API (`redhat`) — RHEL 特定的修复信息
- Red Hat OVAL XML (`redhat_oval`) — 用户提供的可选 OVAL 数据
- EPSS (`epss`) — 来自 FIRST.org 的漏洞利用预测评分
- CISA KEV (`kev`) — 已知被利用漏洞目录
- Alpine SecDB — Alpine Linux 安全公告
- Ubuntu CVE Tracker, Debian Security Tracker
支持的容器生态系统:Ubuntu, Debian, Alpine, RHEL, CentOS, Fedora, Rocky Linux, AlmaLinux, Amazon Linux, Oracle Linux, Chainguard, Wolfi
## 日志
进度事件是阶段驱动且机器可读的(`stage`, `detail`, `ts`),适用于 worker/UI 摄取。
- `--progress` 启用 stderr 日志输出。
- `--log-format text|json` 控制 stderr 样式。
- `--log-level error|warn|info|debug` 控制 stderr 详细程度。
- `--progress-file` 始终写入 NDJSON 事件行以供工作流使用。
## 发布构件
每个版本应包含:
- `scanrook--linux-amd64.tar.gz`
- `scanrook--linux-arm64.tar.gz`
- `scanrook--darwin-amd64.tar.gz`
- `scanrook--darwin-arm64.tar.gz`
- `scanrook--checksums.txt`
安装脚本期望 GitHub 发布资产采用这种确切格式。
## CI/CD 示例 (GitHub Actions)
Marketplace 风格的 action(此仓库):
```
- name: Scan artifact
uses: devinshawntripp/rust-scanner@v1
with:
artifact_path: app-image.tar
mode: deep
format: json
out_file: scanrook-report.json
api_key: ${{ secrets.SCANROOK_API_KEY }}
```
完整指南:`docs/guides/github-actions.md`
```
name: scanrook
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install ScanRook
run: curl -fsSL https://scanrook.sh/install | bash
- name: Scan image tar
run: scanrook scan --file ./artifact.tar --mode deep --format json --out report.json
```
## 基准测试和发布文档
- 基准测试方法论 + 可复现性:`docs/benchmarks/README.md`
- 包管理器发布运行手册:`docs/distribution/package-managers.md`
- 本地对比辅助脚本:`scripts/benchmark-compare.sh`
- 公开发布文章:[https://scanrook.io/blog/why-we-built-scanrook](https://scanrook.io/blog/why-we-built-scanrook)
## 云增强限制
- 本地扫描逻辑在无认证情况下继续运行。
- 云增强通过 `/api/cli/enrich` 检查。
- 遇到 `429` 时,CLI 继续本地扫描并返回升级上下文。
## 分发状态
- GitHub Releases:活跃。
- 安装脚本 (`scanrook.sh/install`):活跃。
- Homebrew tap:计划中。
- crates.io 包:计划中。
## 平台
- 网站:[scanrook.sh](https://scanrook.sh)
- Dashboard/API:[scanrook.io](https://scanrook.io)
## 许可证
当前策略使用临时的源码可用模型。
参见 `LICENSE-SCANROOK-SOURCE-AVAILABLE.md`。
标签:AI应用开发, DevSecOps, Homebrew安装, Rust, SBOM, Trivy替代, URL发现, Web截图, 上游代理, 云安全监控, 占用监测, 可视化界面, 安全合规, 安全检测, 容器安全, 文档安全, 文档结构分析, 本地优先, 活动识别, 硬件无关, 网络代理, 网络流量审计, 资产管理, 通知系统, 通知系统, 镜像扫描, 静态分析, 高风险漏洞