
threat-finder v0.3.0
रनटाइम भेद्यता स्कैनर: होस्ट पर वास्तव में चल रही सेवाओं में CVE ढूंढता है और उन्हें नेटवर्क एक्सपोज़र के आधार पर रैंक करता है।
OffSeq Threat Finder
threat-finder उस कमजोर सॉफ़्टवेयर को ढूँढता है जो होस्ट पर वास्तव में चल रहा है — न कि वह जो मैनिफ़ेस्ट दावा करता है — और बताता है कि कौन-से निष्कर्ष नेटवर्क-पहुंच योग्य हैं।
यह हर चालू सेवा को (और --scope all के साथ, हर इंस्टॉल किया गया OS पैकेज) एक सटीक Package-URL में हल करता है और OffSeq Radar कैटलॉग से इकोसिस्टम-नेटिव वर्शन नियमों का उपयोग करके मिलान करता है, ताकि बैकपोर्टेड/फिक्स्ड बिल्ड गलत तरीके से फ़्लैग न हों।
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.
इंस्टॉलेशन
brew install offseq/tap/threat-finder # Homebrew (macOS/Linux), prebuilt
cargo binstall threat-finder # prebuilt binary, no toolchain
cargo install threat-finder # from source
Linux/macOS (x86_64 + arm64) और Windows (x86_64) के लिए प्रीबिल्ट आर्काइव releases page पर हैं। सोर्स से बनाने के लिए Rust ≥ 1.87 आवश्यक है। Linux, macOS, BSD और Windows सभी समर्थित हैं।
त्वरित आरंभ
export OFFSEQ_API_KEY=... # from https://radar.offseq.com/console
threat-finder
चालू सेवाओं को स्कैन करता है, जोखिम-क्रमबद्ध सारांश प्रिंट करता है, और पूरी JSON रिपोर्ट /tmp/threats.json पर लिखता है। हर इंस्टॉल किए गए OS पैकेज को स्कैन करने के लिए --scope all जोड़ें।
उपयोग
threat-finder [OPTIONS]
| Flag | Description |
|---|---|
-o, --output <PATH> | JSON रिपोर्ट PATH पर लिखें (डिफ़ॉल्ट: प्रॉम्प्ट, या /tmp/threats.json) |
--json | JSON रिपोर्ट फ़ाइल के बजाय stdout पर प्रिंट करें |
--scope <SCOPE> | running (डिफ़ॉल्ट) या all (+ हर इंस्टॉल किया गया OS पैकेज) |
--severity <LEVEL> | केवल critical|high|medium|low या उससे ऊपर के निष्कर्ष रिपोर्ट करें |
--strict | समन्वय-अपुष्ट निष्कर्ष हटाएँ (केवल पुष्टि किए गए रिपोर्ट करें) |
--fail-on <WHAT> | यदि मेल खाते निष्कर्ष मौजूद हों तो 5 से बाहर निकलें: any|critical|high|medium|low|kev|exposed |
--sarif <PATH> | SARIF 2.1.0 रिपोर्ट भी लिखें (कोड-स्कैनिंग UI के लिए) |
--include <GLOB> / --exclude <GLOB> | एसेट को नाम ग्लॉब द्वारा फ़िल्टर करें (दोहराने योग्य) |
-q, --quiet | बैनर, प्रगति और सारांश छिपाएँ |
--no-color | ANSI रंग अक्षम करें |
-y, --yes | डिफ़ॉल्ट मान लें, कभी प्रॉम्प्ट न करें (CI/cron) |
--reset | API key फिर से दर्ज करें, सेव किए गए को अनदेखा करें |
--register | स्कैन किए गए होस्ट को निरंतर निगरानी के लिए Radar में पंजीकृत करें (बिना प्रॉम्प्ट) |
--no-register | इस रन में निगरानी के लिए पंजीकरण या प्रॉम्प्ट न करें |
--host-name <NAME> | पंजीकरण के साथ भेजने हेतु मित्रवत होस्टनाम |
--unregister | इस होस्ट की इन्वेंट्री Radar से हटाएँ और बाहर निकलें |
--windows-missing-updates | (Windows) Windows Update Agent से लंबित सुरक्षा अपडेट भी सूचीबद्ध करें (ऑनलाइन स्कैन; एलिवेटेड चलाएँ) |
-h, --help / -V, --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
एग्ज़िट कोड: 0 ठीक · 1 लुकअप/IO त्रुटि · 2 API key नहीं · 3 असमर्थित OS · 4 रेट लिमिट/कोटा, या API एक्सेस आवश्यक (अपग्रेड चाहिए) · 5 --fail-on सीमा पूरी हुई।
API key (एक Radar Console से प्राप्त करें), इस क्रम में हल किया जाता है:
OFFSEQ_API_KEYएनवायरनमेंट वेरिएबल (CI/cron के लिए सर्वोत्तम)।$XDG_CONFIG_HOME/offseq-rust/config.tomlमें सेव की गई key (0600), जब तक--resetन दिया गया हो।- TTY पर एक इंटरैक्टिव, छिपा हुआ प्रॉम्प्ट — फिर अगली बार के लिए सेव कर लिया जाता है।
बिना key उपलब्ध और गैर-इंटरैक्टिव (--yes / कोई TTY नहीं) होने पर 2 से बाहर निकलता है।
OFFSEQ_CONFIG_DIR सेट करें ताकि कॉन्फ़िग का स्थान ओवरराइड हो (डिफ़ॉल्ट: OS का प्रति-उपयोगकर्ता कॉन्फ़िग डीआईआर) — कंटेनर/CI के लिए उपयोगी, जिन्हें निश्चित पथ चाहिए।
यह कैसे काम करता है
सटीक-समन्वय मिलान। हर एसेट एक purl बन जाता है जिसमें उसका पूरा संस्करण (epoch + distro revision) और एक ?distro= क्वालिफ़ायर होता है, जैसे pkg:deb/ubuntu/openssh-server@1:8.9p1-3ubuntu0.6?distro=jammy. इन्वेंट्री का मिलान बैच किए गए POST /match/batch कॉल्स में होता है (प्रति टियर-आकार चंक एक अनुरोध) सर्वर-साइड, इकोसिस्टम-नेटिव वर्शन नियमों (dpkg/rpm/apk/semver) के साथ — इसलिए 1.18.0-6+deb11u3 जैसा बैकपोर्टेड-और-फिक्स्ड बिल्ड सही रूप से फ़्लैग नहीं होता, और क्लाइंट-साइड वर्शन अनुमान नहीं लगाया जाता। निष्कर्ष API के confirmed फ़्लैग से विभाजित होते हैं: पुष्टि किए गए मिलान रिपोर्ट होते हैं; जिन समन्वय मिलानों का वर्शन पुष्ट नहीं किया जा सकता, उन्हें अलग से unconfirmed / triage के रूप में दिखाया जाता है (गिनती, byCve और --fail-on से बाहर रखा गया; --strict से हटाएँ)।
नेटवर्क-एक्सपोज़र सहसंबंध। मैनिफ़ेस्ट स्कैनर (Trivy, Grype, osv-scanner) पैकेज सूचियाँ पढ़ते हैं; बाहरी स्कैनर (Nessus, OpenVAS) को दूसरे होस्ट की ज़रूरत होती है। यह टूल हर चालू सेवा की प्रोसेस को उन सॉकेट्स से मैप करता है जिन पर वह listening है (/proc/net Linux पर, अन्य Unix पर lsof, Windows पर Get-NetTCPConnection / netstat) और रीचबिलिटी को वर्गीकृत करता है — loopback / private / public। 0.0.0.0 पर एक कमजोर सेवा 127.0.0.1 पर मौजूद सेवा से बहुत अलग जोखिम है: निष्कर्ष पहले-exposed को रैंक करते हैं और --fail-on exposed CI को ठीक इसी पर गेट करता है। कोई पैकेट नहीं भेजा जाता। निष्कर्ष CISA KEV और EPSS भी रखते हैं।
एक्सपोज़र-जागरूक प्राथमिकता। हर निष्कर्ष को एक riskScore (0–100) और SSVC-शैली decision बैंड मिलता है — act-now · soon · schedule · track — जो severity, EPSS, KEV और मालिक एसेट के नेटवर्क एक्सपोज़र से मिलकर बनता है। सारांश हर पंक्ति की शुरुआत [ACT-NOW 92]-शैली के बैज से करता है और उसी के अनुसार सॉर्ट करता है, ताकि कुछ public-facing, known-exploited समस्याएँ शोर भरे होस्ट के ऊपर तैरती दिखें। यह स्कोर स्थानीय और सर्वर-साइड दोनों जगह एक ही फ़ॉर्मूले का उपयोग करता है (Radar monitoring दृश्य थोड़ा बोनस जोड़ता है जब KEV निष्कर्ष अपनी नियत तिथि पार कर चुका हो — एक तारीख जो CLI के पास नहीं होती), और --json तथा SARIF (properties) में दिखता है।
निरंतर निगरानी
एक बार का स्कैन एक समय-बिंदु है। किसी होस्ट को एक बार पंजीकृत करें और Radar देखता रहता है: जब कोई नया-प्रकाशित CVE उसके किसी समन्वय को प्रभावित करता है, तो आपको एक अलर्ट मिलता है (email + Console), जिसे एक्सपोज़र के आधार पर प्राथमिकता दी जाती है — दोबारा स्कैन की ज़रूरत नहीं।
इंटरैक्टिव स्कैन के बाद, टूल पूछता है:
Add these 42 services to Radar for continuous monitoring & alerts? [Y/n/never]
Y इस होस्ट को पंजीकृत करता है; n इस रन को छोड़ देता है; never आपकी पसंद याद रखता है (यह कॉन्फ़िग में सेव हो जाती है और आपसे दोबारा नहीं पूछा जाएगा)। दोबारा स्कैन पर यह drift (+added / -removed / ~changed) और आपके पिछले स्कैन के बाद से नए निष्कर्ष भी रिपोर्ट करता है। Radar Console में Inventory के अंतर्गत अपने होस्ट प्रबंधित करें — निगरानी टॉगल करें, निष्कर्ष देखें, deregister करें।
ऑटोमेशन के लिए, प्रॉम्प्ट छोड़ें: --register गैर-इंटरैक्टिव रूप से पंजीकृत करता है (CI में डिफ़ॉल्ट रूप से बंद), --no-register ऑप्ट आउट करता है, --host-name <NAME> होस्ट को लेबल करता है, और --unregister उसे हटा देता है। एक स्थिर प्रति-होस्ट id और आपकी प्रॉम्प्ट पसंद $XDG_CONFIG_HOME/offseq-rust/config.toml में रहती है। पंजीकरण कभी भी एग्ज़िट कोड नहीं बदलता — निगरानी की रुकावट आपके स्कैन को फेल नहीं करेगी। Basic/Pro/Enterprise प्लान (या Pro Console) की आवश्यकता है।
दायरा और कवरेज
--scope running (डिफ़ॉल्ट) लाइव सेवाओं को स्कैन करता है — छोटा, उच्च-संकेत वाला सेट जिसका एक्सपोज़र सहसंबंधित किया जा सकता है। --scope all इसके अतिरिक्त हर इंस्टॉल किया गया OS पैकेज (dpkg/rpm/pacman/apk/brew/pkg/pkg_info) की सूची बनाता है, जिससे मिलान की सतह 10–50× बढ़ जाती है। जो पैकेज किसी चालू, एक्सपोज़्ड प्रोसेस को भी समर्थन देता है, वह उस एक्सपोज़र को बरकरार रखता है (एसेट समन्वय द्वारा डीडुप्लीकेट और मर्ज किए जाते हैं)। कर्नेल उसके पैकेज (linux-image…) के रूप में --scope all के अंतर्गत कवर होता है।
--scope allसे सैकड़ों–हज़ारों पैकेज मिल सकते हैं। फ्री टियर (15 लुकअप/घंटा) पर यह रेट-लिमिट करेगा; जब इन्वेंट्री बजट से अधिक होती है तो टूल चेतावनी देता है। (लुकअप पहले से बैच किए जाते हैं; एक स्थानीय रिज़ल्ट कैश रोडमैप पर है।)
प्रति-OS समर्थन
| OS | Discovery | Coordinate source |
|---|---|---|
| Linux (systemd) | ListUnits → /proc/<pid>/exe | dpkg / rpm / pacman / apk |
| Linux (SysV/OpenRC) | service --status-all / rc-status | पैकेज DB |
| macOS | launchctl list → ps (केवल थर्ड-पार्टी) | Homebrew |
| FreeBSD / DragonFly | service -e | pkg |
| OpenBSD | rcctl ls started | pkg_info |
| NetBSD | /etc/rc.d स्थिति | pkg_info |
| Solaris / illumos | svcs → svcprop | probe (--version) |
| Windows | Win32_Service → Get-NetTCPConnection / netstat | registry / winget / Appx / Chocolatey / Scoop → CPE; npm / pip / dotnet → purl; OS बिल्ड → CPE |
जहाँ कोई पैकेज किसी बाइनरी का मालिक नहीं होता, वर्शन एक कठोर --version probe (केवल निरपेक्ष पथ, सैनिटाइज़्ड env) पर फॉलबैक करता है। macOS पर, Apple सिस्टम सेवाएँ (com.apple.*, SIP-संरक्षित पथ) छोड़ दी जाती हैं — वे OS वर्शन द्वारा कवर होती हैं, और सैकड़ों की जाँच करना व्यर्थ है।
Windows पर, सब कुछ बिल्ट-इन powershell.exe के माध्यम से एकत्र किया जाता है (कोई अतिरिक्त रनटाइम नहीं, कोर इन्वेंट्री के लिए admin की आवश्यकता नहीं)। इंस्टॉल किए गए ऐप्स एक क्यूरेटेड नाम तालिका के माध्यम से NVD CPE में मैप होते हैं (अनमैप किए ऐप्स गलत अनुमान के बजाय नाम खोज पर फॉलबैक करते हैं); OS एडिशन/बिल्ड एक feature-qualified OS CPE बनता है (जैसे windows_11_23h2); और --windows-missing-updates लंबित सुरक्षा पैच की एक ऑप्ट-इन Windows Update Agent सलाह जोड़ता है।
आउटपुट
JSON, नियत (sorted) कुंजियों और बिना टाइमस्टैम्प के, ताकि रिपोर्ट सफाई से diff हों:
services—pkg@version→ पुष्टि किए गए निष्कर्ष (cveId,severity,cvssScore,epss,kev,riskScore,decision,confirmed,matchedRange,matchBasis,fixedVersions,remediation,cwes,references,radarUrl), highest-risk पहले।unconfirmed— समन्वय मिलान जिनका वर्शन पुष्ट नहीं किया जा सका (triage)।assets—pkg@version→{ exe, versionSource, exposed, reachability, listeners }(versionSource=package-db|probe;reachabilityTCP और UDP को कवर करता है)।byCve— हर CVE को सभी प्रभावित एसेट्स पर समेटा गया ("एक बार पैच करें, कई ठीक करें")।errors— प्रति-एसेट लुकअप विफलताएँ, ताकि विफलता कभी "साफ़" न लगे।registration— उपस्थित जब रन ने होस्ट पंजीकृत किया:host_id,monitoring,drift,summary,newSinceLastCount।meta—{ tool, version, schemaVersion }(schemaVersion2)।
कोड-स्कैनिंग UI के लिए एक SARIF 2.1.0 रिपोर्ट (--sarif) भी उपलब्ध है।
OffSeq पारिस्थितिकी तंत्र
| OffSeq | EU सुरक्षा ऑडिट, खतरा निगरानी, CISO-as-a-Service, NIS2 अनुपालन |
| Radar | रियल-टाइम खतरा इंटेलिजेंस — वह कैटलॉग जिससे threat-finder मिलान करता है |
| Radar Console | सब्सक्रिप्शन, कस्टम फ़ीड और आपका OFFSEQ_API_KEY |
| Radar API | यहाँ उपयोग किए गए /match एंडपॉइंट के REST दस्तावेज़ |
| Radar Threats | खोजने योग्य CVE / मैलवेयर / threat-actor डेटाबेस |
| Radar Feeds | CISA, CIRCL, ThreatFox, … एकत्र करने वाले कस्टम फ़ीड |
| Radar Pricing | फ्री टियर से Enterprise तक |
| Breach | डार्क-वेब डेटा-लीक और एक्सपोज़्ड-क्रेडेंशियल निगरानी |
| Veil | क्लाइंट-साइड PNG स्टेग्नोग्राफ़ी (AES-256-GCM) |
| Guard | AI वेबसाइट सुरक्षा और अनुपालन विश्लेषक |
| Training | PECB-मान्यता प्राप्त सुरक्षा और गोपनीयता पाठ्यक्रम |
विकास
cargo build --release
cargo test # unit tests
cargo test -- --ignored # + macOS live-discovery smoke test
cargo clippy --all-targets
इंजन एक लाइब्रेरी क्रेट (find_threats) है जिसमें एक Collector एब्स्ट्रैक्शन है (आज running-services और os-packages; आगे lockfiles / containers / SBOM), इसलिए बाइनरी उसके ऊपर एक पतला CLI है।
लाइसेंस
दोहरे लाइसेंस के अंतर्गत MIT या Apache-2.0, आपकी पसंद।