
fleet-cve-scanner v1.1.0
ماسح ضوئي لـ CVE مفتوح المصدر بملف نصي واحد للأساطيل المُدارة عبر RMM. يعمل بنظام PowerShell 7 الخالص — يربط مخزون برامج RMM الخاص بك بقواعد NVD و CISA KEV و EPSS و SSVC للإجابة: هل هذا الإصدار معرض للخطر، وكم هو مستوى الإلحاح؟
fleet-cve-scanner
ماسح ثغرات (CVE) مفتوح المصدر بملف نصي واحد للأساطيل المُدارة بواسطة RMM. يعمل بـ PowerShell 7 النقي، لا وكلاء، لا أجهزة، لا رسوم ترخيص.
يجيب على سؤال واحد لكل قطعة برمجية على كل نقطة نهاية تديرها: هل الإصدار المثبت معروف بكونه ضعيفًا، وكم هي درجة الاستعجال؟ — من خلال ربط جرد البرمجيات الخاص بـ RMM الخاص بك مع مصادر التغذية الأمنية الموثوقة والمجانية:
- NIST NVD — الثغرات المعروفة (CVEs) + نطاقات الإصدارات المتأثرة
- CISA KEV — التي يتم استغلالها بنشاط في البرية (تتجاوز حد النتيجة)
- EPSS — احتمالية الاستغلال خلال الـ 30 يومًا القادمة
- CISA SSVC — قرارات الأولوية: تصرف / احضر / تتبع
- MSRC — دليل على أن تصحيح Microsoft يغطي بالفعل الاكتشاف
- endoflife.date — البرمجيات التي لن يتم تصحيحها أبدًا
المخرجات: تقرير CSV لكل جهاز، سجل SQLite مع ساعات SLA وأحداث التغيير أسبوعيًا، لوحة تحكم HTML ذاتية الاحتواء، وتقرير تعرض اختياري بتنسيق Markdown.
الحالة
الإصدار v1.0.0. تم نقل المحرك بطريقة نظيفة من ماسح كان يُشغل أسبوعيًا في الإنتاج ضد أسطول ويندوز (انظر docs/HISTORY.md). قبل هذا الإصدار، تم تشغيل الاثنين ضد نفس الأسطول المباشر ومقارنتهما صفًا بصف: عبر عشرات الآلاف من النتائج حيث رأى كلاهما نفس (الجهاز، البرمجيات، الإصدار)، كل حقل محسوب — الحالة، CVSS، الخطورة، علامة KEV، قرار SSVC، إصدار الإصلاح — تطابق تمامًا.
تغطي تلك المقارنة منطق الحكم. لم تختبر طبقة السجل/SLA، وليست بديلاً عن التحقق من صحة الأداة في بيئتك الخاصة. اقرأ docs/known-limitations.md قبل الثقة بها — فهي مكتوبة لتكون صادقة لا ممجدة.
بدء سريع
تحتاج PowerShell 7 (pwsh). طريقتان للتشغيل:
أ. مسح مباشر من NinjaOne
cp config.example.json config.json
# قم بتعديل config.json: املأ ninjaone.client_id / client_secret / base_url،
# واضبط output.report_dir، و (موصى به) nvd.api_key
pwsh -File fleet-cve-scan.ps1
ب. دون اتصال — أي RMM أو SCCM أو Intune (بدون وصول API)
صدر جردك إلى CSV بأعمدة hostname, software, version (اختياري device_id, os)، ثم:
cp config.example.json config.json # مطلوب فقط output.report_dir هنا
pwsh -File fleet-cve-scan.ps1 -InputCsv inventory.csv
-InputCsv لا يجري أي استدعاءات NinjaOne — لا OAuth ولا API. لا يزال يستعلم عن NVD والتغذية العامة الأخرى، لذا ما زلت بحاجة إلى nvd.api_key في config.json و output.report_dir صالح. انظر docs/rmm-adapters.md لعقد الإدخال ووصفات التصدير لكل RMM.
تثبيت المتطلبات الأساسية
- PowerShell 7 — macOS:
brew install powershell; ويندوز:winget install Microsoft.PowerShell; دبيان/أوبونتو: قم بالتثبيت من مستودع حزم Microsoft (packages.microsoft.com). - sqlite3 (اختياري، يشغّل السجل/الاتجاهات) — macOS: مثبت مسبقًا أو
brew install sqlite; دبيان/أوبونتو:apt-get install sqlite3; ويندوز: قم بتنزيل حزمة "أدوات" SQLite من sqlite.org وضعsqlite3.exeفيPATHأو بجانب السكربت. بدونه لا يزال المسح يعمل؛first_seenيتراجع إلى تاريخ التشغيل.
المتطلبات
- PowerShell 7 (7.4+ موصى به). المسح المتوازي يتطلب 7.0+.
- sqlite3 — اختياري؛ يتيح قاعدة بيانات السجل، الاتجاهات، وتتبع
first_seenفي SLA. في حالة الغياب = يتم تخطي تلك الميزات، يكتمل المسح. - اتصال شبكة صادر إلى NVD، CISA (KEV)،
epss.empiricalsecurity.com(مضيف نتيجة EPSS المجمعة — نقل FIRST استضافة بيانات EPSS هناك)، MSRC، endoflife.date، و GitHub raw (برنامج CVEcvelistV5) — بالإضافة إلى واجهة NinjaOne API في الوضع المباشر. - بيانات الاعتماد — الوضع المباشر يحتاج إلى معرف/سر عميل OAuth2 من NinjaOne؛ الوضع دون اتصال يحتاج فقط إلى CSV الجرد. مفتاح NVD API اختياري تقنيًا لكنه مطلوب فعليًا على نطاق الأسطول: يسمح NVD بـ 50 طلبًا/30 ثانية بمفتاح و 5/30 ثانية فقط بدونه. يكتشف الماسح أيهما لديك ويخنق ليتوافق، لذا فإن التشغيل بدون مفتاح صحيح لكنه أبطأ بحوالي 10 مرات — جيد لعدد قليل من المنتجات، غير عملي لأسطول حقيقي. المفاتيح مجانية.
مرجع الإعدادات
الإعدادات هي ملف JSON (افتراضيًا config.json بجانب السكربت؛ تجاوز بـ -ConfigPath). ابدأ من config.example.json. كل مفتاح يقرؤه الماسح، قيمته الافتراضية عند حذفه، وما يفعله:
ninjaone (الوضع المباشر)
| المفتاح | الإفتراضي | الغرض |
|---|---|---|
ninjaone.client_id | "" | معرف العميل OAuth2 لواجهة NinjaOne API. مطلوب للمسح المباشر؛ اتركه فارغًا لـ -InputCsv. |
ninjaone.client_secret | "" | سر العميل OAuth2 لواجهة NinjaOne API. |
ninjaone.base_url | — (المثال يرسل https://app.ninjarmm.com) | عنوان URL الأساسي لواجهة NinjaOne API؛ مطلوب للمسح المباشر، لا يوجد افتراضي مدمج. استخدم مضيف منطقتك (مثل 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). مجاني، وأسرع بحوالي 10 مرات. |
المسح والنتائج
| المفتاح | الإفتراضي | الغرض |
|---|---|---|
cvss_threshold | 7.0 | الحد الأدنى لدرجة CVSS الأساسية ليتم الإبلاغ عن ثغرة ذات نتيجة VULNERABLE. الثغرات المدرجة في KEV تتجاوز هذا الحد. |
ssvc_mission_prevalence | high | مدخل أصحاب المصلحة في SSVC Mission Prevalence (low / medium / high). |
ssvc_public_wellbeing | high | مدخل أصحاب المصلحة في SSVC Public Well-being (low / medium / high). |
التخزين المؤقت وتحديد المعدل
| المفتاح | الإفتراضي | الغرض |
|---|---|---|
nvd_cache_ttl_days | 7 | الأيام التي تبقى فيها نتيجة NVD (لكل اسم برمجية) مخبأة قبل إعادة الاستعلام. |
nvd_cache_flush_every | 500 | نقطة تفتيش ذاكرة التخزين المؤقت لـ NVD على القرص كل N من العناصر المكتملة، بحيث يحتفظ المسح المتوقف بعمليات الجلب الخاصة به. 0 يعطل (الحفظ في نهاية المسح لا يزال يعمل). |
nvd_min_spacing_ms | 700 مع مفتاح API، 6500 بدونه | الحد الأدنى للميلي ثوان بين استدعاءات NVD. القيود الملزمة للمعدل — اضبط هذا أولاً. |
nvd_rate_limit | 48 مع مفتاح API، 4 بدونه | الحد الأعلى للإطار المنزلق لاستدعاءات NVD لكل 30 ثانية (شبكة أمان). الحد الأدنى 1. |
parallel_throttle | 20 | عدد مساحات التشغيل ForEach-Object -Parallel. استدعاءات NVD مسلسلة بغض النظر؛ هذا فقط يحد من التوازي في ضربات الذاكرة المؤقتة. الحد الأدنى 1. |
kev_cache_ttl_hours | 24 | مدة بقاء كتالوج CISA KEV المخبأ. |
epss_cache_ttl_hours | 24 | مدة بقاء ملف نتيجة FIRST.org EPSS المخبأ. |
eol_cache_ttl_days | 7 | مدة بقاء استعلامات endoflife.date المخبأة. |
msrc_cache_ttl_days | 30 | مدة بقاء بيانات MSRC CVRF المخبأة. |
cvelist_cache_ttl_days | 7 | مدة بقاء بيانات SSVC / برنامج CVE (cvelistV5) / CISA-ADP المخبأة. |
cvelist_fetch_budget | 300 | الحد الأقصى لعدد جلب سجلات CVE لكل تشغيل لإثراء SSVC/vulnrichment؛ الباقي يؤجل للتشغيل التالي. |
nvd_min_spacing_ms و nvd_rate_limit و parallel_throttle تُقرأ بواسطة الماسح لكنها غير موجودة في config.example.json — أضفها فقط إذا احتجت للضبط. انظر docs/rate-limiting.md.
الإثراء و SLA
| المفتاح | الإفتراضي | الغرض |
|---|---|---|
epss_spike_threshold | 0.10 | الحد الأدنى للارتفاع في نتيجة EPSS للبحث بين المسوحات لإصدار حدث تغيير EPSS_SPIKE. |
sla_days_critical | 14 | نافذة SLA (أيام من first_seen) للنتائج CRITICAL. |
sla_days_high | 30 | نافذة SLA لبقية الخطورة المسجلة. |
denied_software_csv | "" | مسار إلى ملف CSV اختياري للبرمجيات الممنوعة للتحقق المتقاطع. فارغ يعطل الفحص. |