Benchmarks
Scan accuracy and speed compared to Trivy and Grype. ScanRook combines 6 vulnerability data sources for the deepest coverage available in a CLI scanner.
Scanner Metrics
Key numbers for the current release.
Container Scan Comparison
ScanRook v1.14.2 vs Trivy 0.69.1 vs Grype 0.109.0 — warm cache, macOS.
| Image | Size | ScanRook | Trivy | Grype | |||
|---|---|---|---|---|---|---|---|
| Time | Findings | Time | Findings | Time | Findings | ||
| alpine:3.20 | 7.7 MB | 0.4s | 301 | 0.1s | 16 | 1.0s | 20 |
| debian:12 | 116 MB | 5.4s | 1110 | 0.1s | 123 | 1.1s | 117 |
| ubuntu:24.04 | 77 MB | 3.4s | 1365 | 0.1s | 10 | 1.0s | 47 |
| rockylinux:9 | 173 MB | 5.0s | 779 | 0.2s | 187 | 2.3s | 640 |
| nginx:1.27 | 188 MB | 8.5s | 2952 | 0.2s | 314 | 1.6s | 315 |
| postgres:17 | 439 MB | 8.5s | 2983 | 0.3s | 224 | 2.5s | 222 |
| redis:7-alpine | 40 MB | 0.7s | 299 | 0.1s | 105 | 1.3s | 114 |
| golang:1.23 | 822 MB | 24.9s | 18152 | 0.9s | 3038 | 4.8s | 1466 |
| node:22 | 1.1 GB | 48.0s | 30726 | 1.1s | 2384 | 7.5s | 1533 |
| python:3.12 | 1.1 GB | 51.1s | 31590 | 0.7s | 1673 | 5.9s | 1269 |
All runs on macOS with warm caches. Images pulled via docker save. Finding counts reflect unique CVEs after deduplication.
Native Archive Scanning (ScanRook Only)
ScanRook v1.14.2 — formats not supported by Trivy or Grype.
| File | Size | Format | Components | Findings | Scan Time |
|---|---|---|---|---|---|
| Firefox.dmg | 142 MB | DMG (HFS+) | 9 | 270 | 304s |
DMG scan uses hdiutil extraction on macOS or dmgwiz+hfsutils on Linux. Findings are HeuristicUnverified from binary keyword matching in Firefox app bundles. Trivy and Grype do not support DMG scanning. Scan time includes full binary analysis of all extracted Mach-O and dylib files.
Findings Comparison
ScanRook finds more vulnerabilities than both Trivy and Grype on every image.
Scan Speed (warm cache)
Warm-cache scan times on macOS. Lower is better.
Why is Alpine so fast? Alpine 3.20 has only 14 packages. With warm caches, ScanRook completes the entire scan in under 0.5s — just file I/O and hash lookups. Larger images like Ubuntu (92 packages) and Debian (88 packages) take longer due to more OSV queries and distro tracker enrichment passes.
v1.14.2 improvement: ScanRook now resolves all packages against the local vulnerability database (scanrook db fetch) in a single unbatched pass before making any API calls. This eliminates artificial batching overhead for locally-cached data.
Trivy is faster on absolute time because it uses a pre-downloaded local vulnerability database (~400MB). ScanRook queries live APIs on first scan, then caches aggressively. With scanrook db fetch, ScanRook also uses a pre-downloaded SQLite database for offline scanning.
Why ScanRook Finds More
Correct ecosystem mapping + multi-source enrichment = higher accuracy.
ScanRook combines multiple advisory sources and verifies against the installed package database to produce high-confidence findings:
- Installed-state verification — ScanRook reads package databases (dpkg, RPM, APK) directly instead of relying on file path heuristics. Only packages confirmed as installed are reported with ConfirmedInstalled confidence.
- Triple-source RHEL coverage — For Rocky Linux, AlmaLinux, and other RHEL-based images, ScanRook combines three sources: OSV batch queries, RHEL OVAL patch evaluation, and the Red Hat Security Data API for unfixed CVEs (will-not-fix, fix-deferred, affected). This produces 2.5x more findings than Trivy on Rocky Linux 9.
- Fixed advisory filtering — Vulnerabilities that have already been patched in the installed version are excluded. Other scanners may report advisories for the package name regardless of installed version.
- Unfixed CVE visibility — ScanRook surfaces CVEs that Red Hat has marked as "Will not fix", "Fix deferred", or "Affected" — with strict RHEL-version-specific validation to avoid false positives from historical advisories.
For example, ubuntu:24.04 shows 1,365 ScanRook findings vs 10 Trivy / 47 Grype. ScanRook finds 136x more CVEs than Trivy by combining OSV batch queries, NVD CPE enrichment, Ubuntu CVE Tracker, and EPSS scoring. On debian:12, ScanRook finds 1,110 vulnerabilities vs 123 Trivy / 117 Grype — 9x more coverage through multi-source enrichment and Debian Security Tracker integration.
Enrichment Depth
What ScanRook adds that others don't.
| Feature | ScanRook | Trivy | Grype |
|---|---|---|---|
| OSV advisory lookup | |||
| NVD CVSS enrichment | |||
| EPSS exploit probability | — | — | |
| CISA KEV flagging | — | — | |
| Confidence tiers | — | — | |
| Red Hat CSAF/OVAL | — | — | |
| Fixed-version tracking | |||
| Installed-state verification | — | — | |
| Application package detection | |||
| SBOM import (CycloneDX/SPDX) | |||
| ZIP archive scanning | — | — | |
| DMG disk image scanning | — | — |
Methodology
How these benchmarks were produced.
- All tools run on the same machine with warm caches (second run after initial cache population).
- Container images saved via
docker saveto local tar files. - ScanRook uses default settings (light mode, all enrichment sources active).
- Trivy uses
trivy image --inputwith default settings. - Grype uses
grype [file] -o jsonwith default settings. - Finding counts are unique CVE IDs after deduplication.
- Raw benchmark data (JSON reports + CSV) is available in the scanner repository.
To reproduce these benchmarks yourself:
scanrook benchmark --file ./image.tar --profile warmTransparency
No fudged numbers. Here's exactly how we test.
- Same environment — All three scanners (ScanRook, Trivy, Grype) run on the same machine, same OS, same images saved to the same directory. No scanner-specific hardware or network advantages.
- No image-specific hardcoding — ScanRook does not contain any image-specific logic or benchmark-specific cache warming. The same scanning pipeline runs for all images.
- Standard caching only — ScanRook uses its standard SHA256-keyed file cache at
~/.scanrook/cache/. No benchmark-specific pre-loading or cache seeding. - Database differences — Trivy downloads a pre-compiled BoltDB vulnerability database (~400MB) rebuilt every 6 hours. Grype uses a pre-compiled SQLite database (~65MB) rebuilt daily. ScanRook can download a pre-compiled SQLite database via
scanrook db fetchfor offline scanning, or query live APIs (OSV, NVD, Red Hat) on cold scans and cache responses locally for warm scans. - Cold vs warm scans — Published "warm cache" times represent the second scan of the same image, where API responses are served from local cache. Cold-scan times are significantly longer for ScanRook because every vulnerability query hits a live API. We are transparent about this tradeoff.
- Open source benchmark code — The
run_benchmark()function insrc/main.rsis open source and can be audited. Raw JSON outputs from all three tools are available for independent verification.
More Comparisons
Detailed head-to-head pages.