العودة إلى التحديثات
New releaseJul 24, 2026

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 (برنامج CVE cvelistV5) — بالإضافة إلى واجهة 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_threshold7.0الحد الأدنى لدرجة CVSS الأساسية ليتم الإبلاغ عن ثغرة ذات نتيجة VULNERABLE. الثغرات المدرجة في KEV تتجاوز هذا الحد.
ssvc_mission_prevalencehighمدخل أصحاب المصلحة في SSVC Mission Prevalence (low / medium / high).
ssvc_public_wellbeinghighمدخل أصحاب المصلحة في SSVC Public Well-being (low / medium / high).

التخزين المؤقت وتحديد المعدل

المفتاحالإفتراضيالغرض
nvd_cache_ttl_days7الأيام التي تبقى فيها نتيجة NVD (لكل اسم برمجية) مخبأة قبل إعادة الاستعلام.
nvd_cache_flush_every500نقطة تفتيش ذاكرة التخزين المؤقت لـ NVD على القرص كل N من العناصر المكتملة، بحيث يحتفظ المسح المتوقف بعمليات الجلب الخاصة به. 0 يعطل (الحفظ في نهاية المسح لا يزال يعمل).
nvd_min_spacing_ms700 مع مفتاح API، 6500 بدونهالحد الأدنى للميلي ثوان بين استدعاءات NVD. القيود الملزمة للمعدل — اضبط هذا أولاً.
nvd_rate_limit48 مع مفتاح API، 4 بدونهالحد الأعلى للإطار المنزلق لاستدعاءات NVD لكل 30 ثانية (شبكة أمان). الحد الأدنى 1.
parallel_throttle20عدد مساحات التشغيل ForEach-Object -Parallel. استدعاءات NVD مسلسلة بغض النظر؛ هذا فقط يحد من التوازي في ضربات الذاكرة المؤقتة. الحد الأدنى 1.
kev_cache_ttl_hours24مدة بقاء كتالوج CISA KEV المخبأ.
epss_cache_ttl_hours24مدة بقاء ملف نتيجة FIRST.org EPSS المخبأ.
eol_cache_ttl_days7مدة بقاء استعلامات endoflife.date المخبأة.
msrc_cache_ttl_days30مدة بقاء بيانات MSRC CVRF المخبأة.
cvelist_cache_ttl_days7مدة بقاء بيانات SSVC / برنامج CVE (cvelistV5) / CISA-ADP المخبأة.
cvelist_fetch_budget300الحد الأقصى لعدد جلب سجلات CVE لكل تشغيل لإثراء SSVC/vulnrichment؛ الباقي يؤجل للتشغيل التالي.

nvd_min_spacing_ms و nvd_rate_limit و parallel_throttle تُقرأ بواسطة الماسح لكنها غير موجودة في config.example.json — أضفها فقط إذا احتجت للضبط. انظر docs/rate-limiting.md.

الإثراء و SLA

المفتاحالإفتراضيالغرض
epss_spike_threshold0.10الحد الأدنى للارتفاع في نتيجة EPSS للبحث بين المسوحات لإصدار حدث تغيير EPSS_SPIKE.
sla_days_critical14نافذة SLA (أيام من first_seen) للنتائج CRITICAL.
sla_days_high30نافذة SLA لبقية الخطورة المسجلة.
denied_software_csv""مسار إلى ملف CSV اختياري للبرمجيات الممنوعة للتحقق المتقاطع. فارغ يعطل الفحص.

output

المفتاحالإفتراضيالغرض
output.report_dir(مطلوب)دليل لجميع المخرجات — CSV، قاعدة بيانات السجل، لوحة التحكم، والتخزين المؤقت.
output.wiki_security_page""مسار اختياري لصفحة تعرض Markdown. تُكتب فقط عند تعيينها.
output.dashboard_share""مسار/مشاركة اختيارية تستقبل نسخة من لوحة التحكم كل تشغيل. فارغ = محلي فقط.

المخرجات

كل ما يلي يقع في 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.
  • 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 (كلها في .gitignore).
  • صفحة تعرض Markdown — في output.wiki_security_page، فقط عند تعيينها.

مخطط CSV (28 عمودًا)

مجموعة الأعمدة ثابتة ومطبقة بواسطة البوابة. بالترتيب:

#العمودالمعنى
1device_idمعرف الجهاز في RMM (أو معرف اصطناعي حتمي في وضع -InputCsv).
2hostnameاسم مضيف الجهاز.
3osسلسلة نظام التشغيل (قد تكون فارغة).
4softwareاسم المنتج كما هو في الجرد.
5installed_versionسلسلة الإصدار كما هو في الجرد.
6cve_idمعرّف CVE.
7cvss_scoreدرجة CVSS الأساسية (0 إذا لا يوجد).
8severityتسمية خطورة CVSS.
9cvss_versionأي معيار CVSS أنتج النتيجة (4.0/3.1/3.0/2.0/فارغ).
10epss_scoreاحتمال EPSS من FIRST.org (فارغ إذا كانت CVE غائبة عن الكتالوج).
11epss_percentileالنسبة المئوية لـ EPSS (فارغ إذا غائب).
12ssvc_exploitationخيار استغلال SSVC الخام من CISA (none/poc/active؛ فارغ بدون بيانات ADP).
13ssvc_decisionقرار SSVC Act/Attend/Track (فارغ بدون بيانات ADP).
14statusVULNERABLE / PATCHED / UNKNOWN.
15published_dateتاريخ نشر CVE.
16unknown_reasonلماذا الصف UNKNOWN (SUSPECT_VERSION / NO_VERSION_BOUND / VERSION_PARSE_ERROR؛ فارغ غير ذلك).
17is_kevTrue عندما تكون CVE في كتالوج CISA KEV.
18kev_due_dateتاريخ استحقاق تصحيح CISA KEV.
19kev_ransomware_useعلامة استخدام حملات الفدية في KEV.
20fix_versionإصدار حد الإصلاح المحسوب.
21fix_boundary_inclusiveما إذا كان حد الإصلاح شاملاً.
22advisory_urlعنوان URL للاستشارة البائعة أو تفاصيل NVD.
23patch_evidenceدليل عندما تم تحويل UNKNOWN من Microsoft إلى PATCHED.
24triage_statusحالة التصنيف من triage.json (فارغ إذا لا يوجد).
25triage_noteملاحظة التصنيف.
26first_seenتاريخ أول مشاهدة للنتيجة (من قاعدة بيانات السجل).
27sla_dueتاريخ استحقاق SLA.
28sla_breachما إذا كان SLA منتهكًا.

الجدولة

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 (لينكس/ماك):

0 22 * * 0  pwsh -File /path/to/Run-WeeklyScan.ps1

استضافة لوحة التحكم

cve-dashboard.html ذاتية الاحتواء بالكامل — افتحها مباشرة، ضعها على أي مضيف ثابت أو مشاركة ملفات، أو انسخها تلقائيًا كل تشغيل عبر output.dashboard_share. للاستضافة المقيدة بالوصول، يوفر دليل dashboard-auth/ مضيف ASP.NET صغير مع مصادقة Microsoft Entra (Azure AD)؛ انظر README و RUNBOOK.

قيود صادقة (اقرأ قبل الثقة بها)

  • مطابقة CPE غير دقيقة بطبيعتها. 40–60% من الجرد النموذجي لا يحتوي على أي إدخال في NVD ويتم تخطيه (مسجل، وليس صامتًا أبدًا). اختيار CPE القائم على الاسم قد يختار المنتج الخطأ؛ يوجد سير عمل للقمع لأنه لابد منه. هذا هو سقف نهج NVD المجاني — الماسح المدفوع مع كتالوج اكتشاف منظم سيكون أكثر دقة. قيمة هذه الأداة هي كونها مجانية وشفافة وقابلة للتدقيق.
  • UNKNOWN هو حكم من الدرجة الأولى. عندما لا يستطيع الماسح إثبات ضعف أو تصحيح، يقول ذلك بدلاً من التخمين.
  • تم التحقق فقط ضد NinjaOne. محرك المسح مستقل عن RMM (الإدخال مجرد جهاز + برمجية + إصدار)؛ وضع -InputCsv يسمح لأي تصدير RMM/SCCM/Intune بتغذيته، لكن فقط محول NinjaOne تم تشغيله في الإنتاج.

القائمة الكاملة غير المترددة — معدل تخطي CPE، إخفاء مفتاح التكرار، totalResults في الصفحة الأولى، فجوات تجاوز MSRC، والمزيد — موجودة في docs/known-limitations.md.

ملاحظات التصميم

بعض الخيارات الهيكلية التي تبدو غير تقليدية هي مقصودة:

  • ملف واحد، وليس وحدة نمطية. مسار المسح الساخن يعمل داخل ForEach-Object -Parallel، وهذه المساحات لا يمكنها رؤية دوال النطاق الخارجي — ولهذا يتم تكرار عدد قليل من المساعدين عمدًا داخل الكتلة المتوازية. تخطيط وحدة بدالة لكل ملف لن يزيل ذلك التكرار (الجسم المتوازي سيظل بحاجة إلى المصدر المحقون لكل مساحة تشغيل)؛ سيضيف فقط خطوة بناء ويكسر نموذج نشر نسخ ملف واحد. إذا تجاوز المشروع يومًا ما الملف الواحد، فالتغليف هو التغيير الذي يناسب v2، وليس تصحيحًا.
  • سجلات [PSCustomObject]، وليس فئات. يتم إنتاج سجلات النتائج داخل مساحات تشغيل متوازية وإعادتها إلى مساحة التشغيل الرئيسية. مثيلات فئة PowerShell لا تبقى موثوقة عبر تلك الحدود؛ [PSCustomObject] يبقى، وعقد عمود CSV يُفرض بواسطة بوابة الإصدار بدلاً من نظام الأنواع.
  • اختبارات PS7 عادية، وليس Pester. المجموعات في tests/ هي نصوص بدون تبعيات مع افتراضات كود الخروج، قابلة للتشغيل في أي مكان يوجد فيه pwsh — بما في ذلك خادم المسح — دون تثبيت أي شيء. CI يشغلها جميعًا على ويندوز وأوبونتو.

التوثيق

  • docs/how-it-works.md — خط أنابيب المسح مرحلة بمرحلة، منطق الحكم، انضباط التخزين المؤقت، وعقد الفشل الناعم.
  • docs/known-limitations.md — كل طريقة معروفة يمكن أن يكون الماسح مخطئًا فيها، ولماذا.
  • docs/rate-limiting.md — دروس تحديد معدل NVD كدليل مشغل وجدول ضبط.
  • docs/rmm-adapters.md — عقد الإدخال، مسارا الجرد المدمجان، وكيفية إضافة محول أصلي.
  • docs/HISTORY.md — تاريخ الإصدار المكثف والمنقح والدروس الهندسية وراء كل إصدار.

المساهمة

الطلبات مرحب بها — محولات RMM قبل كل شيء. انظر CONTRIBUTING.md للقواعد الأساسية ومتطلبات الاتجاه الآمن (منطق الحالة يجب أن يخطئ فقط نحو المزيد من الرؤية، أبدًا بصمت نحو PATCHED).

مصادر البيانات والإسناد

هذه الأداة مفيدة فقط بقدر التغذية المجانية والموثوقة التي تربطها. كل من التالي يتم الاستعلام عنه وقت المسح؛ يُرجى احترام شروطهم إذا بنيت على هذا.

  • قاعدة بيانات الثغرات الوطنية NIST (NVD) — سجلات CVE ونطاقات الإصدارات المتأثرة، عبر واجهة NVD API. يستخدم هذا المنتج واجهة NVD API لكن ليس معتمدًا أو مصدقًا من NVD. https://nvd.nist.gov/
  • كتالوج الثغرات المستغلة المعروفة من CISA (KEV) — القائمة الرسمية للثغرات المعروف استغلالها في البرية. https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  • برنامج CVE — cvelistV5 — سجلات CVE بالإضافة إلى بيانات SSVC / vulnrichment المقدمة من CISA ADP. CVE® علامة تجارية مسجلة لمؤسسة MITRE. https://github.com/CVEProject/cvelistV5
  • SSVC (تصنيف الثغرات حسب أصحاب المصلحة) — منطق التصرف / الحضور / التتبع في هذه الأداة مشتق من CERT/CC SSVC (معهد هندسة البرمجيات بجامعة كارنيجي ميلون) وشجرة قرار منسق CISA SSVC، الإصدار 2.0.3. الإسناد إلى CERT/CC و CISA مطلوب. https://www.cisa.gov/ssvc · https://github.com/CERTCC/SSVC
  • نظام تسجيل استغلال التنبؤ من FIRST (EPSS) — احتمالية الاستغلال خلال الـ 30 يومًا القادمة. بيانات EPSS مقدمة من FIRST. انظر Jay Jacobs, Sasha Romanosky, Benjamin Edwards, Michael Roytman, Idris Adjerid (2021), Exploit Prediction Scoring System, Digital Threats: Research and Practice, 2(3). https://www.first.org/epss/
  • مركز استجابة الأمان من Microsoft (MSRC) — واجهة CVRF API، المستخدمة لتأكيد متى يغطي تحديث أمان من Microsoft بالفعل اكتشافًا. © Microsoft Corporation. https://api.msrc.microsoft.com/ · https://msrc.microsoft.com/
  • endoflife.date — تواريخ نهاية العمر والدعم للبرمجيات التي لن يتم تصحيحها أبدًا. البيانات مقدمة من مشروع endoflife.date. https://endoflife.date/

الترخيص

Apache-2.0 — انظر LICENSE.

الفئات