Scan et veille¶
Le scan est la boucle centrale de CVE Intelligence Panel. Ce chapitre contraste scan complet et veille, documente le comportement serveur et fournit des diagrammes pour les opérateurs.
Pourquoi deux modes¶
NVD offre une large couverture mais impose des limites de débit. Poller NVD toutes les deux minutes provoquerait blocages ou échecs. La veille ignore donc NVD et interroge des sources plus rapides. Le scan complet sert à un inventaire exhaustif quand la latence est acceptable.
Les opérateurs lancent typiquement un scan complet quotidien (ou à la demande) et gardent la veille active entre les scans.
Comparaison des modes¶
| Aspect | Scan complet | Veille |
|---|---|---|
| Endpoint | POST /api/scan |
POST /api/watch |
| NVD | Oui | Non |
| Prefetch KEV | Oui | Oui (pour les flags) |
knownIds client |
Non requis | Déduplique les découvertes « nouvelles » |
meta.mode |
full |
watch |
Flux du scan complet¶
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[Navigateur]:::ui --> S[POST /api/scan]:::api
S --> KEV[Charger ensemble KEV]:::api
S --> GH[Cache GitHub]:::api
S --> RSS[Flux RSS]:::api
S --> Loop[Par outil de la pile]:::api
Loop --> NVD[Requête NVD]:::ext
Loop --> OSV[Requête OSV]:::ext
Loop --> GHA[GitHub advisories]:::ext
S --> M[fusion + enrichissement KEV]:::api
M --> T[Traduction optionnelle]:::api
T --> R[Réponse JSON]:::api
Parcours du diagramme¶
Le serveur charge les catalogues partagés une fois, puis pour chaque outil interroge NVD (mode complet), OSV et GitHub en parallèle et attache les correspondances mots-clés RSS. Les résultats fusionnent par id CVE ; l'appartenance KEV définit exploited_in_wild. La traduction optionnelle remplit translations / title_fa. meta.sources_updated_at enregistre les fetch réussis par source.
Étapes (scan complet)¶
- L'utilisateur clique Scan complet ; le client envoie
stacket le flagtranslate. - Le serveur valide le tableau stack et démarre les timers.
- JSON CISA KEV, pages GitHub advisory (cache) et flux RSS se chargent en parallèle.
- Pour chaque outil, NVD/OSV/GitHub s'exécutent avec look-back
SCAN_DAYS. mergeVulnerabilitiesdéduplique et fusionne les tagssources.enrichWithKevmarque les CVE exploités.- Si
translate: true, des champs persans peuvent être remplis au scan ; d'autres locales via/api/translateensuite. - Compteurs résumé et tableau vuln retournés ; le client persiste via
src/lib/scanCache.ts(stackKeydoit correspondre à la pile actuelle).
Cache de scan côté client¶
Le navigateur stocke le dernier scan réussi dans cve-radar:last-scan avec une clé pile (noms d’outils normalisés et triés). Au rechargement, loadLastScan restaure vuln et summary si la clé correspond ; sinon le cache est ignoré. persistLastScan s’exécute après un scan complet et quand la veille renvoie de nouveaux éléments.
Cela évite un scan complet obligatoire à chaque session navigateur tout en limitant les résultats à la pile active.
Séquence veille¶
sequenceDiagram
participant B as Navigateur
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: Requête par outil
A->>G: Cache advisory
A->>R: Parse flux
A->>A: Fusion + diff vs knownIds
A-->>B: newVulns, hasNew, meta
Étapes (veille)¶
- Le hook
useWatchs'exécute à l'intervalle (2/5/15 min depuis les paramètres). - Le client envoie les id CVE actuels comme
knownIds. - Le serveur ne fetch que OSV/GitHub/RSS.
- Les nouveaux id absents de
knownIdsremplissentnewVulns; bannière/toast si alertes activées. - Le client fusionne dans la liste vuln locale et met à jour
sources_updated_at.
GitLab et flux des distributions Linux¶
Outre NVD/OSV/GitHub/RSS, le scan complet peut interroger la GitLab Advisory Database (GraphQL) et plusieurs flux de sécurité de distributions Linux lorsqu'ils sont activés dans les réglages de sources ou via les variables env.
| Source | Rôle |
|---|---|
| GitLab | Advisories packages (npm, PyPI, Maven, Go, …) — ignoré si AIRGAPPED=true sans GITLAB_ADVISORY_MIRROR_URL |
| Alpine | JSON secdb par release (ALPINE_RELEASES) |
| Ubuntu USN | Carte CVE→package préchargée depuis le JSON Ubuntu Security |
| Red Hat | Enrichissement (métadonnées CVE, pas de lignes autonomes) |
| Debian | Security Tracker (DEBIAN_ENABLED ou DEBIAN_TRACKER_CACHE_PATH en air-gap) |
| Amazon Linux | XML updateinfo ALAS |
| MITRE CVE | Enrichissement JSON 5.x optionnel si MITRE_CVE_ENABLED=true |
Le rapprochement package utilise shared/distroPackages.ts (outil du stack → nom de package distro). Les résultats distro fusionnent avec NVD/OSV sur l'id CVE ; sources_failed enregistre les erreurs partielles comme pour les autres sources intégrées.
Notes et exceptions¶
- Limite de débit serveur (429) :
POST /scanetPOST /watchpartagent des buckets in-memory séparés par IP (RATE_LIMIT_SCAN_PER_MINdéfaut 12,RATE_LIMIT_WATCH_PER_MINdéfaut 120). Réponse :code: "RATE_LIMITED",retryAfterSec.POST /scan/validaten’est pas limité. Plusieurs onglets ou React StrictMode en dev peuvent déclencher la limite veille — fermez les onglets supplémentaires ou ajustez les variables env. - Sans
NVD_API_KEY, de grandes piles peuvent recevoir HTTP 403/429 de NVD upstream — réessayez plus tard ou ajoutez une clé (différent de la limite de débit applicative). - Auto scan complet périodique (30 min) optionnel dans les paramètres ; indépendant de l'intervalle de veille.
- La barre de progression dans l'en-tête reflète l'estimation côté client pendant les longs scans.
Suite : i18n et traduction