CVE Tracker est un tableau de bord de surveillance des vulnérabilités en production, alimenté par le flux officiel NVD (National Vulnerability Database) du NIST.
L'objectif : afficher en temps réel les CVE publiées avec leurs scores CVSS, références exploit, entrées CISA KEV et évolution temporelle — sans aucun appel API depuis le navigateur.
- 📡 Collecte automatique — un script cron récupère les CVE 3 fois par jour via l'API NVD
- 🔒 Clé API côté serveur — stockée dans nginx, jamais exposée au navigateur ni dans les scripts
- 📦 Fichiers JSON statiques — servis directement par Apache/nginx, zéro dépendance externe
- 📊 Dashboard interactif — filtres sévérité, tri CVSS/date/ID, export CSV, graphique d'évolution
- 🕐 Mises à jour récentes — fenêtre glissante 7 jours sur
lastModifiedNVD
flowchart TD
NVD["🌐 NVD — services.nvd.nist.gov\nAPI officielle NIST"]
subgraph SRV["🖥️ Serveur — Debian 13"]
direction TB
CRON["⏱️ cron-cve-fetch.sh\n3×/jour — bash + curl"]
PROXY["🔒 nginx /api/nvd/\nProxy local — injecte la clé API\ndepuis /etc/nginx/api-keys.conf"]
DATA["📦 /assets/data/\ncve-YYYY-MM.json mois complets\ncve-recent.json 7j lastModified\nindex.json liste des mois"]
RSYNC["🔄 rsync optionnel\n→ serveur web distant"]
CRON -->|"http://127.0.0.1/api/nvd/"| PROXY
PROXY -->|"HTTPS + apiKey header"| NVD
NVD -->|"JSON réponse"| PROXY
PROXY --> CRON
CRON -->|"Écriture atomique"| DATA
DATA -.->|"optionnel"| RSYNC
end
subgraph CLIENT["🌍 Navigateur Client"]
direction TB
HTML["cve.html + cve-fetcher.js"]
NOTE["✔ Aucun appel API NVD direct\n✔ Aucune clé API exposée\n✔ Zéro dépendance externe"]
HTML --- NOTE
end
DATA -->|"Fichiers JSON statiques HTTP"| CLIENT
# /etc/nginx/api-keys.conf (ne JAMAIS versionner ce fichier)
set $nvd_api_key "votre-cle-api-ici";# Proxy NVD — accessible uniquement depuis localhost
location /api/nvd/ {
allow 127.0.0.1;
deny all;
proxy_pass https://services.nvd.nist.gov/rest/json/cves/2.0/;
proxy_set_header apiKey $nvd_api_key;
proxy_hide_header apiKey;
}Le script cron interroge http://127.0.0.1/api/nvd/ — nginx injecte la clé et la masque en retour. Ni le navigateur ni les logs applicatifs ne voient la clé.
CVE/
├── README.md
├── CHANGELOG.md
├── scripts/
│ ├── cron-cve-fetch.sh # Collecte quotidienne (3×/jour)
│ ├── backfill-cve.sh # Backfill historique (1 seule fois)
│ └── nginx-nvd-proxy.conf # Exemple config proxy nginx
└── docs/
└── data-format.md # Format des fichiers JSON générés
apt-get install curl jq python3 nginxObtenir une clé sur https://nvd.nist.gov/developers/request-an-api-key
| Mode | Quota |
|---|---|
| Sans clé | 5 req / 30 s |
| Avec clé | 50 req / 30 s |
# Créer le fichier de clé (ne jamais versionner)
echo 'set $nvd_api_key "VOTRE_CLE_NVD";' > /etc/nginx/api-keys.conf
chmod 600 /etc/nginx/api-keys.conf
# Inclure le proxy dans votre vhost
# Copier le bloc de scripts/nginx-nvd-proxy.conf dans votre vhost
nginx -t && systemctl reload nginxmkdir -p /opt/cve-tracker
cp scripts/cron-cve-fetch.sh /opt/cve-tracker/
cp scripts/backfill-cve.sh /opt/cve-tracker/
chmod 700 /opt/cve-tracker/*.sh
# Adapter DATA_DIR dans les scripts
# DATA_DIR=/var/www/html/assets/data/opt/cve-tracker/backfill-cve.sh >> /var/log/cve-backfill.log 2>&1# /etc/cron.d/cve-fetch
0 6 * * * root /opt/cve-tracker/cron-cve-fetch.sh >> /var/log/cve-fetch.log 2>&1
0 13 * * * root /opt/cve-tracker/cron-cve-fetch.sh >> /var/log/cve-fetch.log 2>&1
0 21 * * * root /opt/cve-tracker/cron-cve-fetch.sh >> /var/log/cve-fetch.log 2>&1Tableau JSON de vulnérabilités NVD au format CVE 2.0 :
[
{
"cve": {
"id": "CVE-2025-XXXXX",
"published": "2025-01-15T10:00:00.000",
"lastModified": "2025-01-16T08:00:00.000",
"vulnStatus": "Analyzed",
"descriptions": [
{ "lang": "en", "value": "Description de la vulnérabilité..." }
],
"metrics": {
"cvssMetricV31": [{
"cvssData": {
"baseScore": 9.8,
"baseSeverity": "CRITICAL",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
}
}]
},
"references": [
{ "url": "https://...", "tags": ["Exploit", "Third Party Advisory"] }
]
}
}
]Index des mois disponibles, généré automatiquement :
{
"generated": "2025-04-05T06:00:00Z",
"months": ["2025-04", "2025-03", "2025-02", "2025-01", "2024-12"]
}CVE modifiées sur les 7 derniers jours glissants, triées par lastModified décroissant. Même format que les fichiers mensuels.
| Fonctionnalité | Détail |
|---|---|
| Filtres sévérité | CRITICAL / HIGH / MEDIUM / LOW |
| Tri | Par date, score CVSS, ID CVE |
| Recherche | Plein texte sur ID, description, CWE |
| Période | Sélecteur mois/année |
| Mises à jour récentes | CVE modifiées sur 7j (NVD lastModified) |
| Export CSV | Toutes les CVE filtrées |
| Métriques | CVSS moyen, taux exploit, CISA KEV, CWE dominant |
| Graphique | Évolution quotidienne des publications |
| Répartition | Barre de proportion CRITICAL/HIGH/MEDIUM/LOW |
| Indice de risque | Score composite pondéré par sévérité |
✔ Aucune clé API NVD
✔ Aucune IP ou hostname d'infrastructure
✔ Aucun fichier JSON de données CVE (données live)
✔ Aucun token, mot de passe ou clé SSH
✔ Les chemins sont génériques — à adapter à votre serveur
| 🖥️ Infrastructure & Sécurité | 💻 Développement & Web | 🤖 Intelligence Artificielle |
|
|
|
|
🔒 Un projet proposé par 0xCyberLiTech • Développé en collaboration avec Claude AI (Anthropic) 🔒