Skip to content

اسکن و نظارت

اسکن هستهٔ حلقهٔ کاری پنل CVE Intelligence است. این فصل اسکن کامل و نظارت را مقایسه می‌کند، رفتار سرور را مستند می‌کند و نمودارهایی برای اپراتور دارد.

دو حالت به‌خاطر محدودیت نرخ NVD جدا شده‌اند: polling مکرر NVD عملاً متوقف یا شکست‌خورده می‌شود؛ بنابراین نظارت آن را حذف می‌کند و اسکن کامل برای موجودی کامل نگه داشته می‌شود.

چرا دو حالت داریم

NVD پوشش گسترده دارد اما سقف نرخ اعمال می‌کند. نظارت هر دو دقیقه NVD را صدا نزند. اپراتورها معمولاً روزانه یک اسکن کامل و بین آن‌ها نظارت فعال دارند.

مقایسهٔ حالت‌ها

جنبه اسکن کامل نظارت
Endpoint POST /api/scan POST /api/watch
NVD بله خیر
پیش‌بار KEV بله بله (برای پرچم)
knownIds کلاینت لازم نیست موارد «جدید» را جدا می‌کند
meta.mode full watch

جریان اسکن کامل

flowchart LR
  classDef ui fill:#e9edf5,stroke:#00baba,color:#253343
  classDef api fill:#f3fcfc,stroke:#008c8c,color:#253343
  classDef ext fill:#fff7ed,stroke:#eda232,color:#253343

  UI[مرورگر]:::ui --> S[POST /api/scan]:::api
  S --> KEV[بارگذاری KEV]:::api
  S --> GH[کش GitHub]:::api
  S --> RSS[فیدهای RSS]:::api
  S --> Loop[هر ابزار پشته]:::api
  Loop --> NVD[NVD]:::ext
  Loop --> OSV[OSV]:::ext
  Loop --> GHA[GitHub]:::ext
  S --> M[ادغام + KEV]:::api
  M --> T[ترجمهٔ اختیاری]:::api
  T --> R[پاسخ JSON]:::api

شرح نمودار

سرور یک‌بار کاتالوگ‌های مشترک را می‌گیرد، سپس برای هر ابزار NVD (در حالت کامل)، OSV و GitHub را موازی می‌زند و تطبیق کلیدواژهٔ RSS را می‌چسباند. نتایج بر اساس شناسهٔ CVE ادغام می‌شوند؛ عضویت KEV فیلد exploited_in_wild را تنظیم می‌کند. meta.sources_updated_at زمان fetch موفق هر منبع را ثبت می‌کند.

گام‌به‌گام (اسکن کامل)

  1. کاربر اسکن کامل را می‌زند؛ کلاینت stack و پرچم translate می‌فرستد.
  2. سرور آرایهٔ پشته را اعتبارسنجی و تایمرها را شروع می‌کند.
  3. JSON KEV، صفحات GitHub (کش) و RSS موازی بارگذاری می‌شوند.
  4. برای هر ابزار NVD/OSV/GitHub با پنجرهٔ SCAN_DAYS اجرا می‌شود.
  5. mergeVulnerabilities برچسب sources را ادغام می‌کند.
  6. enrichWithKev CVEهای بهره‌برداری‌شده را علامت می‌زند.
  7. در translate: true ممکن است فیلدهای فارسی روی اسکن پر شوند؛ سایر localeها بعداً با /api/translate.
  8. خلاصه و آرایهٔ vuln برمی‌گردد؛ کلاینت از طریق src/lib/scanCache.ts ذخیره می‌کند (stackKey باید با پشتهٔ فعلی منطبق باشد).

کش اسکن کلاینت

مرورگر آخرین اسکن موفق را در cve-radar:last-scan با کلید پشته (نام ابزارهای نرمال‌شده و مرتب‌شده) نگه می‌دارد. در بارگذاری مجدد، loadLastScan vulnها و خلاصه را وقتی کلید منطبق باشد بازمی‌گرداند؛ در غیر این صورت کش نادیده گرفته می‌شود. persistLastScan پس از اسکن کامل و وقتی watch موارد جدید برمی‌گرداند اجرا می‌شود.

این کار اسکن کامل اجباری در هر نشست مرورگر را حذف می‌کند و در عین حال نتایج را به پشتهٔ فعال محدود نگه می‌دارد.

دنبالهٔ نظارت

sequenceDiagram
  participant B as مرورگر
  participant A as Express API
  participant O as OSV
  participant G as GitHub
  participant R as RSS

  B->>A: POST /api/watch {stack, knownIds}
  A->>O: پرس‌وجو برای هر ابزار
  A->>G: کش مشاوره
  A->>R: پارس فید
  A->>A: ادغام + تفاضل با knownIds
  A-->>B: newVulns, hasNew, meta

گام‌به‌گام (نظارت)

  1. useWatch روی بازهٔ تنظیمات (۲/۵/۱۵ دقیقه) اجرا می‌شود.
  2. کلاینت شناسه‌های CVE فعلی را به‌عنوان knownIds می‌فرستد.
  3. سرور فقط OSV/GitHub/RSS را می‌گیرد.
  4. شناسه‌های جدید newVulns را پر می‌کنند؛ در صورت فعال بودن هشدار، toast/بنر.
  5. کلاینت لیست محلی و sources_updated_at را به‌روز می‌کند.

GitLab و فیدهای توزیع لینوکس

علاوه بر NVD/OSV/GitHub/RSS، اسکن کامل می‌تواند پایگاه مشاوره GitLab (GraphQL) و چند فید امنیتی توزیع لینوکس را وقتی در تنظیمات منبع یا env فعال باشند بپرسد.

منبع نقش
GitLab مشاورهٔ پکیج (npm، PyPI، Maven، Go، …) — در AIRGAPPED=true بدون GITLAB_ADVISORY_MIRROR_URL رد می‌شود
Alpine JSON secdb برای هر release (ALPINE_RELEASES)
Ubuntu USN نقشهٔ CVE→پکیج از JSON امنیتی Ubuntu
Red Hat غنی‌سازی (متادیتای CVE، نه ردیف مستقل)
Debian Security Tracker (DEBIAN_ENABLED یا DEBIAN_TRACKER_CACHE_PATH برای air-gap)
Amazon Linux XML updateinfo ALAS
MITRE CVE غنی‌سازی JSON 5.x اختیاری با MITRE_CVE_ENABLED=true

تطبیق سطح پکیج از shared/distroPackages.ts (ابزار پشته → نام پکیج توزیع). یافته‌های توزیع با NVD/OSV روی شناسهٔ CVE ادغام می‌شوند؛ sources_failed خطای جزئی فید را مثل سایر منابع داخلی ثبت می‌کند.

نکات و استثناها

  • محدودیت نرخ سرور (429): POST /scan و POST /watch سطل‌های در حافظهٔ جداگانه بر IP دارند (RATE_LIMIT_SCAN_PER_MIN پیش‌فرض ۱۲، RATE_LIMIT_WATCH_PER_MIN پیش‌فرض ۱۲۰). پاسخ: code: "RATE_LIMITED"، retryAfterSec. POST /scan/validate محدود نمی‌شود. چند تب یا React StrictMode در dev می‌تواند محدودیت watch را تحریک کند — تب‌های اضافه را ببندید یا env را تنظیم کنید.
  • بدون NVD_API_KEY، پشتهٔ بزرگ ممکن است 403/429 از NVD upstream بگیرد — کلید اضافه یا بعداً تکرار کنید (متفاوت از محدودیت نرخ اپ).
  • اسکن کامل خودکار ۳۰ دقیقه‌ای در تنظیمات اختیاری است؛ مستقل از بازهٔ watch.
  • نوار پیشرفت در هدر تخمین پیشرفت سمت کلاینت در اسکن طولانی است.

بعدی: چندزبانگی