
fleet-cve-scanner v1.1.0
RMM-प्रबंधित फ्लीट के लिए एक ओपन-सोर्स, एकल-स्क्रिप्ट CVE स्कैनर। शुद्ध PowerShell 7 — आपकी RMM सॉफ़्टवेयर इन्वेंट्री को NVD, CISA KEV, EPSS और SSVC के विरुद्ध जोड़ता है ताकि उत्तर दे सके: क्या यह संस्करण असुरक्षित है, और यह कितना तत्काल है?
fleet-cve-scanner
RMM-प्रबंधित फ़्लीट के लिए एक ओपन-सोर्स, एकल-स्क्रिप्ट CVE स्कैनर। शुद्ध PowerShell 7, कोई एजेंट नहीं, कोई उपकरण नहीं, कोई लाइसेंस शुल्क नहीं।
यह आपके द्वारा प्रबंधित प्रत्येक एंडपॉइंट पर प्रत्येक सॉफ़्टवेयर के लिए एक प्रश्न का उत्तर देता है: क्या स्थापित संस्करण असुरक्षित माना जाता है, और यह कितना तत्काल है? — आपके RMM के सॉफ़्टवेयर इन्वेंट्री को मुफ़्त, आधिकारिक सुरक्षा फ़ीड के साथ जोड़कर:
- NIST NVD — ज्ञात CVE + प्रभावित संस्करण श्रेणियाँ
- CISA KEV — जंगली में सक्रिय रूप से शोषित (स्कोर सीमा को दरकिनार करता है)
- EPSS — अगले 30 दिनों में शोषण की संभावना
- CISA SSVC — कार्य करें / ध्यान दें / ट्रैक करें प्राथमिकता निर्णय
- MSRC — प्रमाण कि Microsoft पैच पहले से ही खोज को कवर करता है
- endoflife.date — वह सॉफ़्टवेयर जो फिर कभी पैच नहीं किया जाएगा
आउटपुट: एक प्रति-डिवाइस CSV रिपोर्ट, SLA क्लॉक और सप्ताह-दर-सप्ताह परिवर्तन घटनाओं के साथ SQLite इतिहास, एक स्व-निहित HTML डैशबोर्ड, और एक वैकल्पिक मार्कडाउन एक्सपोज़र रिपोर्ट।
स्थिति
v1.0.0. इंजन को क्लीन-रूम पोर्ट किया गया था जो एक उत्पादन विंडोज फ़्लीट के खिलाफ साप्ताहिक चलने वाले स्कैनर से लिया गया था (देखें docs/HISTORY.md)। इस रिलीज़ से पहले दोनों को एक ही लाइव फ़्लीट के खिलाफ चलाया गया और पंक्ति-दर-पंक्ति तुलना की गई: हज़ारों खोजों में जहाँ दोनों ने एक समान (device, software, version) देखा, प्रत्येक गणना किया गया फ़ील्ड — status, CVSS, severity, KEV flag, SSVC decision, fix version — बिल्कुल मेल खाता था।
वह तुलना verdict तर्क को कवर करती है। इसने history/SLA परत का अभ्यास नहीं किया, और यह आपके अपने वातावरण में टूल को मान्य करने का विकल्प नहीं है। इसे विश्वास करने से पहले docs/known-limitations.md पढ़ें — यह चापलूसी करने के बजाय ईमानदार होने के लिए लिखा गया है।
त्वरित आरंभ
आपको PowerShell 7 (pwsh) की आवश्यकता है। चलाने के दो तरीके:
A. लाइव NinjaOne स्कैन
cp config.example.json config.json
# edit config.json: fill ninjaone.client_id / client_secret / base_url,
# set output.report_dir, and (recommended) nvd.api_key
pwsh -File fleet-cve-scan.ps1
B. ऑफ़लाइन — कोई भी RMM, SCCM, या Intune (कोई API एक्सेस नहीं)
अपनी इन्वेंट्री को hostname, software, version कॉलम (वैकल्पिक device_id, os) के साथ एक CSV में निर्यात करें, फिर:
cp config.example.json config.json # only output.report_dir is needed here
pwsh -File fleet-cve-scan.ps1 -InputCsv inventory.csv
-InputCsv शून्य NinjaOne कॉल करता है — कोई OAuth नहीं, कोई API नहीं। यह अभी भी NVD और अन्य सार्वजनिक फ़ीड को क्वेरी करता है, इसलिए आपको अभी भी config.json में nvd.api_key और एक मान्य output.report_dir चाहिए। इनपुट अनुबंध और प्रति-RMM निर्यात व्यंजनों के लिए docs/rmm-adapters.md देखें।
पूर्वापेक्षाएँ स्थापित करना
- PowerShell 7 — macOS:
brew install powershell; Windows:winget install Microsoft.PowerShell; Debian/Ubuntu: Microsoft पैकेज रेपो (packages.microsoft.com) से स्थापित करें। - sqlite3 (वैकल्पिक, इतिहास/ट्रेंडिंग को शक्ति प्रदान करता है) — macOS: पूर्व-स्थापित या
brew install sqlite; Debian/Ubuntu:apt-get install sqlite3; Windows: sqlite.org से SQLite "tools" बंडल डाउनलोड करें औरsqlite3.exeकोPATHपर या स्क्रिप्ट के बगल में रखें। इसके बिना स्कैन अभी भी चलता है;first_seenरन तिथि पर वापस आ जाता है।
आवश्यकताएँ
- PowerShell 7 (7.4+ अनुशंसित)। समानांतर स्कैन के लिए 7.0+ आवश्यक है।
- sqlite3 — वैकल्पिक; इतिहास DB, ट्रेंडिंग, और SLA
first_seenट्रैकिंग को सक्षम करता है। अनुपस्थित = वे सुविधाएँ छोड़ दी जाती हैं, स्कैन अभी भी पूरा होता है। - नेटवर्क आउटगोइंग NVD, CISA (KEV),
epss.empiricalsecurity.com(EPSS बल्क-स्कोर होस्ट — FIRST ने EPSS डेटा होस्टिंग वहाँ स्थानांतरित कर दी), MSRC, endoflife.date, और GitHub raw (CVE ProgramcvelistV5) — साथ ही लाइव मोड में NinjaOne API। - क्रेडेंशियल्स — लाइव मोड में NinjaOne OAuth2 क्लाइंट आईडी/सीक्रेट चाहिए; ऑफ़लाइन मोड में केवल इन्वेंट्री CSV चाहिए। NVD API कुंजी तकनीकी रूप से वैकल्पिक है लेकिन फ़्लीट पैमाने पर प्रभावी रूप से आवश्यक: NVD एक कुंजी के साथ 50 अनुरोध/30 सेकंड और बिना कुंजी के केवल 5/30 सेकंड अनुमति देता है। स्कैनर पता लगाता है कि आपके पास कौन सा है और उसके अनुसार थ्रॉटल करता है, इसलिए कुंजी रहित रन सही है लेकिन लगभग 10 गुना धीमा — मुट्ठी भर उत्पादों के लिए ठीक, वास्तविक फ़्लीट के लिए अव्यावहारिक। कुंजियाँ मुफ़्त हैं।
कॉन्फ़िगरेशन संदर्भ
कॉन्फ़िग JSON फ़ाइल है (डिफ़ॉल्ट config.json स्क्रिप्ट के बगल में; -ConfigPath के साथ ओवरराइड करें)। config.example.json से शुरू करें। स्कैनर जो प्रत्येक कुंजी पढ़ता है, उसका डिफ़ॉल्ट जब छोड़ा जाता है, और वह क्या करता है:
ninjaone (लाइव मोड)
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|---|---|
ninjaone.client_id | "" | NinjaOne API OAuth2 क्लाइंट आईडी। लाइव स्कैन के लिए आवश्यक; -InputCsv के लिए खाली छोड़ें। |
ninjaone.client_secret | "" | NinjaOne API OAuth2 क्लाइंट सीक्रेट। |
ninjaone.base_url | — (उदाहरण https://app.ninjarmm.com भेजता है) | NinjaOne API बेस URL; लाइव स्कैन के लिए आवश्यक, कोई निर्मित-इन फ़ॉलबैक नहीं। अपने क्षेत्र के होस्ट का उपयोग करें (जैसे eu.ninjarmm.com, oc.ninjarmm.com)। |
nvd
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|---|---|
nvd.api_key | "" | NVD API कुंजी, apiKey हेडर के रूप में भेजी जाती है। खाली प्रमाणीकरण रहित चलता है, जो nvd_rate_limit और nvd_min_spacing_ms के लिए डिफ़ॉल्ट को NVD के अनाम छत (4/30s, 6500ms) तक गिरा देता है बजाय प्रमाणित एक (48/30s, 700ms) के। मुफ़्त, और ~10x तेज़। |
स्कैन और स्कोरिंग
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|---|---|
cvss_threshold | 7.0 | एक स्कोर किए गए CVE के लिए VULNERABLE रिपोर्ट होने के लिए न्यूनतम CVSS बेस स्कोर। KEV-सूचीबद्ध CVE इस मंजिल को दरकिनार करते हैं। |
ssvc_mission_prevalence | high | SSVC मिशन प्रचलन हितधारक इनपुट (low / medium / high)। |
ssvc_public_wellbeing | high | SSVC सार्वजनिक भलाई हितधारक इनपुट (low / medium / high)। |
कैशिंग और दर सीमित करना
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|---|---|
nvd_cache_ttl_days | 7 | एक NVD परिणाम (प्रति सॉफ़्टवेयर नाम) पुनः-क्वेरी से पहले कैश में रहता है। |
nvd_cache_flush_every | 500 | प्रति 500 पूर्ण आइटमों पर NVD कैश को डिस्क पर चेकपॉइंट करें, ताकि मारा गया स्कैन अपने फ़ेच को बनाए रखे। 0 अक्षम करता है (स्कैन-अंत बचत अभी भी चलती है)। |
nvd_min_spacing_ms | API कुंजी के साथ 700, बिना 6500 | NVD कॉल के बीच न्यूनतम मिलीसेकंड। बाध्यकारी दर बाधा — पहले इसे ट्यून करें। |
nvd_rate_limit | API कुंजी के साथ 48, बिना 4 | प्रति 30s NVD कॉल पर स्लाइडिंग-विंडो कैप (एक बैकस्टॉप)। 1 की मंजिल। |
parallel_throttle | 20 | ForEach-Object -Parallel रनस्पेस गणना। NVD कॉल वैसे भी क्रमबद्ध हैं; यह केवल कैश-हिट समवर्तीता को सीमित करता है। 1 की मंजिल। |
kev_cache_ttl_hours | 24 | कैश किए गए CISA KEV कैटलॉग के लिए TTL। |
epss_cache_ttl_hours | 24 | कैश किए गए FIRST.org EPSS स्कोर फ़ाइल के लिए TTL। |
eol_cache_ttl_days | 7 | कैश किए गए endoflife.date लुकअप के लिए TTL। |
msrc_cache_ttl_days | 30 | कैश किए गए MSRC CVRF डेटा के लिए TTL। |
cvelist_cache_ttl_days | 7 | कैश किए गए CVE Program (cvelistV5) / CISA-ADP SSVC डेटा के लिए TTL। |
cvelist_fetch_budget | 300 | SSVC/vulnrichment संवर्धन के लिए प्रति रन अधिकतम CVE-रिकॉर्ड फ़ेच; बाकी अगले रन पर स्थगित हो जाते हैं। |
nvd_min_spacing_ms, nvd_rate_limit, और parallel_throttle स्कैनर द्वारा पढ़े जाते हैं लेकिन config.example.json में मौजूद नहीं हैं — केवल तभी जोड़ें जब आपको ट्यून करने की आवश्यकता हो। docs/rate-limiting.md देखें।