
threat-finder v0.3.0
Laufzeit-Schwachstellenscanner: findet CVEs in den Diensten, die tatsächlich auf einem Host ausgeführt werden, und stuft sie nach Netzwerkexposition ein.
OffSeq Threat Finder
threat-finder findet die verwundbare Software, die tatsächlich auf einem Host läuft – nicht das, was ein Manifest behauptet – und zeigt Ihnen, welche Ergebnisse netzwerkerreichbar sind. Es löst jeden laufenden Dienst (und mit --scope all auch jedes installierte Betriebssystem-Paket) in eine exakte Package-URL auf und gleicht sie mit dem OffSeq-Radar-Katalog ab, wobei ökosystemnative Versionsregeln verwendet werden, sodass zurückportierte/behobene Builds nicht fälschlich markiert werden.
Vulnerability summary (highest risk first):
openssh-server@1:8.9p1-3ubuntu0.6 — 1 finding(s) [PUBLIC tcp 0.0.0.0:22]
[ACT-NOW 92] HIGH CVE-2024-6387 [KEV] regreSSHion: remote code execution in OpenSSH
→ fix: 1:8.9p1-3ubuntu0.10 https://radar.offseq.com/threat/…
[email protected] — 1 finding(s)
[SCHEDULE 41] MED CVE-2023-44487 HTTP/2 Rapid Reset
2 confirmed finding(s) across 2 asset(s); 1 exposed, 1 known-exploited.
Installation
brew install offseq/tap/threat-finder # Homebrew (macOS/Linux), prebuilt
cargo binstall threat-finder # prebuilt binary, no toolchain
cargo install threat-finder # from source
Vorgefertigte Archive für Linux/macOS (x86_64 + arm64) und Windows (x86_64) finden Sie auf der Releases-Seite. Für den Build aus dem Quellcode ist Rust ≥ 1.87 erforderlich. Linux, macOS, die BSDs und Windows werden alle unterstützt.
Schnellstart
export OFFSEQ_API_KEY=... # from https://radar.offseq.com/console
threat-finder
Scannt die laufenden Dienste, gibt eine nach Risiko sortierte Zusammenfassung aus und schreibt den vollständigen JSON-Bericht nach /tmp/threats.json. Fügen Sie --scope all hinzu, um auch jedes installierte Betriebssystem-Paket zu scannen.
Verwendung
threat-finder [OPTIONS]
| Flag | Beschreibung |
|---|---|
-o, --output <PATH> | Schreibt den JSON-Bericht nach PATH (Standard: Eingabeaufforderung oder /tmp/threats.json) |
--json | Gibt den JSON-Bericht anstelle einer Datei auf stdout aus |
--scope <SCOPE> | running (Standard) oder all (+ jedes installierte Betriebssystem-Paket) |
--severity <LEVEL> | Nur Ergebnisse ab critical|high|medium|low melden |
--strict | Koordinaten-unbestätigte Ergebnisse verwerfen (nur bestätigte melden) |
--fail-on <WHAT> | Mit Exit-Code 5 beenden, wenn passende Ergebnisse vorliegen: any|critical|high|medium|low|kev|exposed |
--sarif <PATH> | Zusätzlich einen SARIF-2.1.0-Bericht schreiben (für Code-Scanning-UIs) |
--include <GLOB> / --exclude <GLOB> | Assets nach Namens-Glob filtern (wiederholbar) |
-q, --quiet | Banner, Fortschritt und Zusammenfassung unterdrücken |
--no-color | ANSI-Farben deaktivieren |
-y, --yes | Standardwerte annehmen, nie nachfragen (CI/Cron) |
--reset | API-Schlüssel erneut eingeben, den gespeicherten ignorieren |
--register | Den gescannten Host bei Radar zur kontinuierlichen Überwachung registrieren (ohne Nachfrage) |
--no-register | Bei diesem Lauf nicht registrieren und nicht zur Überwachung auffordern |
--host-name <NAME> | Anzeigenamen des Hosts, der mit einer Registrierung gesendet wird |
--unregister | Die Inventarliste dieses Hosts aus Radar entfernen und beenden |
--windows-missing-updates | (Windows) Zusätzlich ausstehende Sicherheitsupdates vom Windows Update Agent auflisten (Online-Scan; mit erhöhten Rechten ausführen) |
-h, --help / -V, --version | Hilfe / Version |
# CI: only high+ findings, JSON to stdout, no prompts
OFFSEQ_API_KEY=… threat-finder --yes --json --severity high > report.json
# Fail the build only when a network-exposed service has a known-exploited CVE
OFFSEQ_API_KEY=… threat-finder --yes --quiet --fail-on exposed
Exit-Codes: 0 ok · 1 Lookup-/E/A-Fehler · 2 kein API-Schlüssel · 3 nicht unterstütztes Betriebssystem · 4 Ratengrenze/Kontingent oder API-Zugriff erforderlich (Upgrade nötig) · 5 --fail-on-Schwelle erreicht.
API-Schlüssel (erhalten Sie einen über die Radar-Konsole), wird in dieser Reihenfolge aufgelöst:
- Die Umgebungsvariable
OFFSEQ_API_KEY(am besten für CI/Cron). - Der gespeicherte Schlüssel in
$XDG_CONFIG_HOME/offseq-rust/config.toml(0600), sofern nicht--resetangegeben ist. - Eine interaktive, verdeckte Eingabeaufforderung auf einem TTY – wird dann für das nächste Mal gespeichert.
Nicht-interaktiv (--yes / kein TTY) ohne verfügbaren Schlüssel endet mit Exit-Code 2.
Setzen Sie OFFSEQ_CONFIG_DIR, um den Speicherort der Konfiguration zu überschreiben (Standard: das betriebssystemspezifische Benutzerkonfigurationsverzeichnis) – praktisch für Container/CI, die einen deterministischen Pfad benötigen.
So funktioniert es
Exakter Koordinaten-Abgleich. Jedes Asset wird zu einem purl mit seiner vollen Version (Epoche + Distro-Revision) und einem ?distro=-Qualifier, z. B. pkg:deb/ubuntu/openssh-server@1:8.9p1-3ubuntu0.6?distro=jammy. Das Inventar wird in gebündelten POST /match/batch-Aufrufen (eine Anfrage pro Block entsprechend der Tarifstufe) serverseitig mit ökosystemnativen Versionsregeln (dpkg/rpm/apk/semver) abgeglichen – so wird ein zurückportierter und behobener Build wie 1.18.0-6+deb11u3 korrekt nicht markiert, und es gibt kein clientseitiges Versionsraten. Ergebnisse werden anhand des confirmed-Flags der API aufgeteilt: Bestätigte Treffer werden gemeldet; Koordinatentreffer, deren Version nicht bestätigt werden kann, werden separat als unbestätigt / Triage angezeigt (vom Zähler, byCve und --fail-on ausgeschlossen; verwerfen Sie sie mit --strict).
Netzwerkexpositions-Korrelation. Manifest-Scanner (Trivy, Grype, osv-scanner) lesen Paketlisten; externe Scanner (Nessus, OpenVAS) benötigen einen zweiten Host. Dieses Tool ordnet den Prozess jedes laufenden Dienstes den Sockets zu, auf denen er lauscht (/proc/net unter Linux, lsof unter den anderen Unix-Systemen, Get-NetTCPConnection / netstat unter Windows) und klassifiziert die Erreichbarkeit – loopback / private / public. Ein verwundbarer Dienst auf 0.0.0.0 ist ein ganz anderes Risiko als einer auf 127.0.0.1: Ergebnisse werden zuerst nach Exposition eingestuft, und --fail-on exposed macht genau das zur CI-Bedingung. Es werden keine Pakete gesendet. Ergebnisse enthalten außerdem CISA KEV und EPSS.
Expositionsbewusste Priorisierung. Jedes Ergebnis erhält einen riskScore (0–100) und ein SSVC-artiges decision-Band – act-now · soon · schedule · track – kombiniert aus Schweregrad, EPSS, KEV und der Netzwerkexposition des zugehörigen Assets. Die Zusammenfassung beginnt jede Zeile mit einem Badge im Stil [ACT-NOW 92] und sortiert danach, sodass die wenigen öffentlich erreichbaren, bekanntermaßen ausgenutzten Probleme auf einem lauten Host nach oben schwimmen. Der Score verwendet lokal und serverseitig dieselbe Formel (die Radar-Überwachungsansicht fügt einen kleinen Bonus hinzu, wenn ein KEV-Ergebnis sein Fälligkeitsdatum überschritten hat – ein Datum, das die CLI nicht kennt) und erscheint in --json und SARIF (properties).