
RMM-प्रबंधित फ्लीट के लिए एक ओपन-सोर्स, एकल-स्क्रिप्ट CVE स्कैनर। शुद्ध PowerShell 7 — आपकी RMM सॉफ़्टवेयर इन्वेंट्री को NVD, CISA KEV, EPSS और SSVC के विरुद्ध जोड़ता है ताकि उत्तर दे सके: क्या यह संस्करण असुरक्षित है, और यह कितना तत्काल है?
RMM-प्रबंधित फ़्लीट के लिए एक ओपन-सोर्स, एकल-स्क्रिप्ट CVE स्कैनर। शुद्ध PowerShell 7, कोई एजेंट नहीं, कोई उपकरण नहीं, कोई लाइसेंस शुल्क नहीं।
यह आपके द्वारा प्रबंधित प्रत्येक एंडपॉइंट पर प्रत्येक सॉफ़्टवेयर के लिए एक प्रश्न का उत्तर देता है: क्या स्थापित संस्करण असुरक्षित माना जाता है, और यह कितना तत्काल है? — आपके RMM के सॉफ़्टवेयर इन्वेंट्री को मुफ़्त, आधिकारिक सुरक्षा फ़ीड के साथ जोड़कर:
आउटपुट: एक प्रति-डिवाइस 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) की आवश्यकता है। चलाने के दो तरीके:
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
अपनी इन्वेंट्री को 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 देखें।
brew install powershell; Windows:
winget install Microsoft.PowerShell; Debian/Ubuntu: Microsoft पैकेज रेपो (packages.microsoft.com) से स्थापित करें।brew install sqlite; Debian/Ubuntu: apt-get install sqlite3; Windows: sqlite.org से SQLite "tools" बंडल डाउनलोड करें और sqlite3.exe को PATH पर या स्क्रिप्ट के बगल में रखें। इसके बिना स्कैन अभी भी चलता है; first_seen रन तिथि पर वापस आ जाता है।first_seen ट्रैकिंग को सक्षम करता है। अनुपस्थित = वे सुविधाएँ छोड़ दी जाती हैं, स्कैन अभी भी पूरा होता है।epss.empiricalsecurity.com (EPSS बल्क-स्कोर होस्ट — FIRST ने EPSS डेटा होस्टिंग वहाँ स्थानांतरित कर दी), MSRC, endoflife.date, और GitHub raw (CVE Program cvelistV5) — साथ ही लाइव मोड में NinjaOne API।कॉन्फ़िग JSON फ़ाइल है (डिफ़ॉल्ट config.json स्क्रिप्ट के बगल में; -ConfigPath के साथ ओवरराइड करें)। config.example.json से शुरू करें। स्कैनर जो प्रत्येक कुंजी पढ़ता है, उसका डिफ़ॉल्ट जब छोड़ा जाता है, और वह क्या करता है:
ninjaone (लाइव मोड)nvd| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|---|---|
nvd.api_key | "" | NVD API कुंजी, apiKey हेडर के रूप में भेजी जाती है। खाली प्रमाणीकरण रहित चलता है, जो nvd_rate_limit और nvd_min_spacing_ms के लिए डिफ़ॉल्ट को NVD के अनाम छत (4/30s, 6500ms) तक गिरा देता है बजाय प्रमाणित एक (48/30s, 700ms) के। मुफ़्त, और ~10x तेज़। |
nvd_min_spacing_ms, nvd_rate_limit, और parallel_throttle स्कैनर द्वारा पढ़े जाते हैं लेकिन config.example.json में मौजूद नहीं हैं — केवल तभी जोड़ें जब आपको ट्यून करने की आवश्यकता हो। docs/rate-limiting.md देखें।
outputनीचे सब कुछ output.report_dir में आता है।
vuln-report-YYYY-MM-DD.csv — प्रति-खोज रिपोर्ट। 28 कॉलम (नीचे स्कीमा)।vuln-history.db — SQLite इतिहास (sqlite3 आवश्यक): runs (प्रति-रन समुच्चय), findings (प्रति (device, software, cve) खुली-खोज इतिहास first_seen / last_seen / resolved_date / epss_score के साथ), और changes (टाइप किए गए सप्ताह-दर-सप्ताह घटनाएँ)।cve-dashboard.html — स्व-निहित HTML डैशबोर्ड (चार्टिंग लाइब्रेरी इनलाइन, कोई बाहरी अनुरोध नहीं)। वैकल्पिक रूप से output.dashboard_share में कॉपी किया गया।कॉलम सेट निश्चित और गेट-प्रवर्तित है। क्रम में:
Run-WeeklyScan.ps1 निर्धारित रन के लिए एक रैपर है: यह स्कैनर को अपनी निर्देशिका से चलाता है, सभी आउटपुट स्ट्रीम को <script dir>/logs/ (वैकल्पिक -LogDir के साथ ओवरराइड करें) के तहत डेटेड लॉग में कैप्चर करता है, और स्कैनर के एग्जिट कोड को प्रसारित करता है ताकि शेड्यूलर विफलताएँ देख सके।
विंडोज टास्क शेड्यूलर:
schtasks /Create /TN "CVE-Scan-Weekly" ^
/TR "pwsh -NoProfile -File C:\path\to\Run-WeeklyScan.ps1" ^
/SC WEEKLY /D SUN /ST 22:00 /RU SYSTEM
cron (Linux/macOS):
0 22 * * 0 pwsh -File /path/to/Run-WeeklyScan.ps1
cve-dashboard.html पूरी तरह से स्व-निहित है — इसे सीधे खोलें, किसी भी स्थिर होस्ट या फ़ाइल शेयर पर ड्रॉप करें, या हर रन पर स्वचालित रूप से output.dashboard_share के माध्यम से कॉपी करें। एक्सेस-नियंत्रित होस्टिंग के लिए, dashboard-auth/ निर्देशिका Microsoft Entra (Azure AD) प्रमाणीकरण के साथ एक न्यूनतम ASP.NET होस्ट शिप करती है; इसका README और RUNBOOK देखें।
-InputCsv मोड किसी भी RMM/SCCM/Intune निर्यात को फ़ीड करने देता है, लेकिन केवल NinjaOne एडॉप्टर उत्पादन में चलाया गया है।पूरी, बेबाक सूची — CPE स्किप दर, ड्यूप-की मास्किंग, पेज-1 totalResults, MSRC सुपरसेडेंस अंतराल, और अधिक — docs/known-limitations.md में है।
कुछ संरचनात्मक विकल्प जो अपरंपरागत दिखते हैं, जानबूझकर हैं:
ForEach-Object -Parallel के अंदर चलता है, और वे रनस्पेस बाहरी-स्कोप फ़ंक्शन नहीं देख सकते — यही कारण है कि मुट्ठी भर सहायकों को जानबूझकर समानांतर ब्लॉक के अंदर डुप्लिकेट किया जाता है। एक-फ़ंक्शन-प्रति-फ़ाइल मॉड्यूल लेआउट उस डुप्लिकेशन को नहीं हटाएगा (समानांतर बॉडी को अभी भी प्रति रनस्पेस स्रोत इंजेक्ट करने की आवश्यकता होगी); यह सिर्फ एक बिल्ड स्टेप जोड़ेगा और एक-फ़ाइल-कॉपी तैनाती मॉडल को तोड़ देगा। यदि प्रोजेक्ट कभी एकल-फ़ाइल से आगे बढ़ता है, तो पैकेजिंग v2-आकार का परिवर्तन है, पैच नहीं।[PSCustomObject] रिकॉर्ड, क्लास नहीं। खोज रिकॉर्ड समानांतर रनस्पेस के अंदर उत्पन्न होते हैं और मुख्य रनस्पेस में वापस मार्शल किए जाते हैं। PowerShell क्लास इंस्टेंसेस उस सीमा को विश्वसनीय रूप से पार नहीं करते; [PSCustomObject] करता है, और CSV कॉलम अनुबंध रिलीज़ गेट द्वारा लागू किया जाता है, टाइप सिस्टम द्वारा नहीं।tests/ में सूट निर्भरता-मुक्त स्क्रिप्ट हैं जिनमें एग्जिट-कोड अभिकथन हैं, जहाँ pwsh मौजूद है वहाँ चलाने योग्य — स्कैन सर्वर सहित — कुछ भी स्थापित करने की आवश्यकता नहीं है। CI उन सभी को Windows और Ubuntu पर चलाता है।PR का स्वागत है — विशेष रूप से RMM एडॉप्टर। ग्राउंड नियमों और सुरक्षित-दिशा आवश्यकता के लिए CONTRIBUTING.md देखें (स्थिति तर्क केवल अधिक दृश्यता की ओर झुक सकता है, कभी चुपचाप PATCHED की ओर नहीं)।
यह टूल केवल उतना ही उपयोगी है जितने कि मुफ़्त, आधिकारिक फ़ीड जिनसे यह जुड़ता है। प्रत्येक निम्नलिखित स्कैन समय पर क्वेरी किया जाता है; कृपया उनकी शर्तों का सम्मान करें यदि आप इस पर निर्माण करते हैं।
cvelistV5 — CVE रिकॉर्ड और CISA ADP द्वारा योगदान किए गए SSVC / vulnrichment डेटा। CVE® The MITRE Corporation का एक पंजीकृत ट्रेडमार्क है। https://github.com/CVEProject/cvelistV5Apache-2.0 — LICENSE देखें।
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|
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)। |
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|
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-रिकॉर्ड फ़ेच; बाकी अगले रन पर स्थगित हो जाते हैं। |
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|
epss_spike_threshold | 0.10 | स्कैन के बीच किसी खोज के EPSS स्कोर में EPSS_SPIKE परिवर्तन घटना उत्सर्जित करने के लिए न्यूनतम वृद्धि। |
sla_days_critical | 14 | CRITICAL खोजों के लिए SLA विंडो (first_seen से दिन)। |
sla_days_high | 30 | अन्य स्कोर की गई गंभीरताओं के लिए SLA विंडो। |
denied_software_csv | "" | वैकल्पिक अस्वीकृत-सॉफ़्टवेयर CSV क्रॉस-चेक का पथ। खाली जाँच अक्षम करता है। |
| कुंजी | डिफ़ॉल्ट | उद्देश्य |
|---|
output.report_dir | (आवश्यक) | सभी आउटपुट के लिए निर्देशिका — CSV, इतिहास DB, डैशबोर्ड, और कैश। |
output.wiki_security_page | "" | एक मार्कडाउन एक्सपोज़र पेज का वैकल्पिक पथ। केवल सेट होने पर लिखा जाता है। |
output.dashboard_share | "" | वैकल्पिक पथ/शेयर जो प्रत्येक रन पर डैशबोर्ड की एक प्रतिलिपि प्राप्त करता है। खाली = केवल स्थानीय। |
eol-report-YYYY-MM-DD.csv — जब अंत-की-जीवन परिवारों का पता लगाया जाता है तब लिखा जाता है।denied-report-YYYY-MM-DD.csv — जब denied_software_csv कॉन्फ़िगर किया जाता है और मेल खाता है तब लिखा जाता है।nvd-cache.json, kev-cache.json, epss-cache.json, eol-cache.json, msrc-cache.json, cvelist-cache.json (सभी gitignored)।output.wiki_security_page पर, केवल सेट होने पर।| # | कॉलम | अर्थ |
|---|
| 1 | device_id | RMM उपकरण आईडी (या -InputCsv मोड में एक नियतात्मक सिंथेटिक आईडी)। |
| 2 | hostname | उपकरण होस्टनाम। |
| 3 | os | ऑपरेटिंग सिस्टम स्ट्रिंग (रिक्त हो सकता है)। |
| 4 | software | इन्वेंट्री के अनुसार उत्पाद का नाम। |
| 5 | installed_version | इन्वेंट्री के अनुसार संस्करण स्ट्रिंग। |
| 6 | cve_id | CVE पहचानकर्ता। |
| 7 | cvss_score | CVSS बेस स्कोर (कोई नहीं होने पर 0)। |
| 8 | severity | CVSS गंभीरता लेबल। |
| 9 | cvss_version | किस CVSS मानक ने स्कोर उत्पन्न किया (4.0/3.1/3.0/2.0/रिक्त)। |
| 10 | epss_score | FIRST.org EPSS संभावना (यदि CVE कैटलॉग में अनुपस्थित है तो रिक्त)। |
| 11 | epss_percentile | EPSS प्रतिशतक (यदि अनुपस्थित है तो रिक्त)। |
| 12 | ssvc_exploitation | कच्चा CISA SSVC शोषण विकल्प (none/poc/active; ADP डेटा के बिना रिक्त)। |
| 13 | ssvc_decision | SSVC निर्णय Act/Attend/Track (ADP डेटा के बिना रिक्त)। |
| 14 | status | VULNERABLE / PATCHED / UNKNOWN। |
| 15 | published_date | CVE प्रकाशित तिथि। |
| 16 | unknown_reason | पंक्ति UNKNOWN क्यों है (SUSPECT_VERSION / NO_VERSION_BOUND / VERSION_PARSE_ERROR; अन्यथा रिक्त)। |
| 17 | is_kev | True जब CVE CISA KEV कैटलॉग पर है। |
| 18 | kev_due_date | CISA KEV उपचार देय तिथि। |
| 19 | kev_ransomware_use | KEV रैनसमवेयर-अभियान उपयोग ध्वज। |
| 20 | fix_version | गणना किया गया फिक्स-सीमा संस्करण। |
| 21 | fix_boundary_inclusive | क्या फिक्स सीमा समावेशी है। |
| 22 | advisory_url | विक्रेता परामर्श या NVD विवरण URL। |
| 23 | patch_evidence | जब कोई Microsoft UNKNOWN PATCHED में बदल दिया गया तो साक्ष्य। |
| 24 | triage_status | triage.json से ट्राइएज निपटान (कोई नहीं होने पर रिक्त)। |
| 25 | triage_note | ट्राइएज नोट। |
| 26 | first_seen | खोज पहली बार देखी गई तिथि (इतिहास DB से)। |
| 27 | sla_due | SLA देय तिथि। |
| 28 | sla_breach | क्या SLA का उल्लंघन हुआ है। |