Skip to content

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)

  1. L'utilisateur clique Scan complet ; le client envoie stack et le flag translate.
  2. Le serveur valide le tableau stack et démarre les timers.
  3. JSON CISA KEV, pages GitHub advisory (cache) et flux RSS se chargent en parallèle.
  4. Pour chaque outil, NVD/OSV/GitHub s'exécutent avec look-back SCAN_DAYS.
  5. mergeVulnerabilities déduplique et fusionne les tags sources.
  6. enrichWithKev marque les CVE exploités.
  7. Si translate: true, des champs persans peuvent être remplis au scan ; d'autres locales via /api/translate ensuite.
  8. Compteurs résumé et tableau vuln retournés ; le client persiste via src/lib/scanCache.ts (stackKey doit 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)

  1. Le hook useWatch s'exécute à l'intervalle (2/5/15 min depuis les paramètres).
  2. Le client envoie les id CVE actuels comme knownIds.
  3. Le serveur ne fetch que OSV/GitHub/RSS.
  4. Les nouveaux id absents de knownIds remplissent newVulns ; bannière/toast si alertes activées.
  5. 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 /scan et POST /watch partagent des buckets in-memory séparés par IP (RATE_LIMIT_SCAN_PER_MIN défaut 12, RATE_LIMIT_WATCH_PER_MIN défaut 120). Réponse : code: "RATE_LIMITED", retryAfterSec. POST /scan/validate n’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