اسکن و نظارت¶
اسکن هستهٔ حلقهٔ کاری پنل 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 موفق هر منبع را ثبت میکند.
گامبهگام (اسکن کامل)¶
- کاربر اسکن کامل را میزند؛ کلاینت
stackو پرچمtranslateمیفرستد. - سرور آرایهٔ پشته را اعتبارسنجی و تایمرها را شروع میکند.
- JSON KEV، صفحات GitHub (کش) و RSS موازی بارگذاری میشوند.
- برای هر ابزار NVD/OSV/GitHub با پنجرهٔ
SCAN_DAYSاجرا میشود. mergeVulnerabilitiesبرچسبsourcesرا ادغام میکند.enrichWithKevCVEهای بهرهبرداریشده را علامت میزند.- در
translate: trueممکن است فیلدهای فارسی روی اسکن پر شوند؛ سایر localeها بعداً با/api/translate. - خلاصه و آرایهٔ 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
گامبهگام (نظارت)¶
useWatchروی بازهٔ تنظیمات (۲/۵/۱۵ دقیقه) اجرا میشود.- کلاینت شناسههای CVE فعلی را بهعنوان
knownIdsمیفرستد. - سرور فقط OSV/GitHub/RSS را میگیرد.
- شناسههای جدید
newVulnsرا پر میکنند؛ در صورت فعال بودن هشدار، toast/بنر. - کلاینت لیست محلی و
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.
- نوار پیشرفت در هدر تخمین پیشرفت سمت کلاینت در اسکن طولانی است.
بعدی: چندزبانگی