
Audit CVE de serveurs web sensible aux déclencheurs pour nginx et Apache. Va au-delà de la simple correspondance de versions en vérifiant si le chemin de code vulnérable est réellement atteignable dans votre configuration. Classe les résultats en Actif / Latent / Non vérifié. Python 3.5+ en un seul fichier, sans dépendances.
Ne demandez pas si vous êtes vulnérable. Demandez si vous êtes exploitable.
Outil Python mono-fichier qui audite nginx et Apache face aux CVE connues en vérifiant à la fois la version installée et si le chemin de code vulnérable est réellement accessible via votre configuration.
La plupart des scanners de CVE s'arrêtent à la correspondance de version : « nginx 1.18.0 — CVE-2026-42945, sévérité HIGH, vous êtes vulnérable. » Mais de nombreuses CVE nécessitent un schéma de configuration spécifique pour être exploitables. Un scanner qui ignore la configuration vous submerge d'alertes rouges qui ne reflètent pas le risque réel — et pire, il peut masquer les risques latents qui deviendraient réels si votre configuration changeait demain.
web_server_audit répond à deux questions distinctes par CVE :
En combinant ces deux éléments, on obtient trois classifications honnêtes :
| Classification | Signification |
|---|
| 🔴 Risque d'exploitation active | Version vulnérable et déclencheur présent. Exploitable aujourd'hui. |
| 🟡 Risque latent | Version vulnérable, pas de déclencheur. Devient exploitable si un changement de configuration introduit le motif. |
| ⚪ Non vérifié | Configuration illisible ; statut inconnu. |
git clone https://github.com/YOUR_USERNAME/web-server-audit.git
cd web-server-audit
sudo python3 web_server_audit.py
| CVE | Sévérité | Motif déclencheur |
|---|---|---|
| CVE-2026-42945 (Rift) | HIGH | rewrite + capture sans nom ($1,$2) + ? dans le remplacement |
| CVE-2026-42946 | MEDIUM | scgi_pass ou uwsgi_pass utilisé |
| CVE-2026-40701 | MEDIUM | ssl_stapling on + resolver ensemble |
| CVE-2026-42934 | LOW | directives charset/charset_types/source_charset |
La liste des CVE Apache est actuellement vide, mais la structure est en place — voir Extension ci-dessous.
Au-delà des CVE, l'outil signale également :
/proc/sys/kernel/randomize_va_space) — un ASLR complet réduit considérablement l'exploitabilité RCE des failles mémoireesm-infra et esm-appsnginx, apache2, systemctl, ss, journalctl lorsqu'ils sont disponibles ; ignore ces vérifications proprement sinon# Compact report (default — hides OK lines)
sudo python3 web_server_audit.py
# All findings including OK lines
sudo python3 web_server_audit.py --verbose
# No ANSI colors (good for pipes, logs, CI output)
sudo python3 web_server_audit.py --no-color
# Machine-readable JSON
sudo python3 web_server_audit.py --json
| Code | Signification |
|---|---|
| 0 | Aucun problème |
| 1 | Uniquement des avertissements ou des constats critiques hors CVE |
| 2 | Au moins une CVE est exploitable activement |
Le code de sortie 2 est un signal d'échec naturel pour CI/CD.
========================================================================
Web Server Audit - 2026-05-16T01:24:55
Host: web-prod-01
web_server_audit.py v1.0.0 - SiberSAN - MIT License
========================================================================
[system]
------------------------------------------------------------------------
[OK] OK ASLR fully enabled (randomize_va_space=2)
[i] INFO OS: Ubuntu 18.04.6 LTS
[!] WARN Ubuntu 18.04 is in ESM-only support
[nginx] version 1.18.0 (active)
------------------------------------------------------------------------
[i] INFO nginx listening on: 0.0.0.0:80, 0.0.0.0:443
[i] INFO CVE-2026-42945 (HIGH): version vulnerable but NOT triggered
Trigger: rewrite + unnamed capture ($1,$2) + '?' in replacement
Evidence: No rewrite directives in configuration
[i] INFO CVE-2026-42946 (MEDIUM): version vulnerable but NOT triggered
[!] WARN nginx installed from PPA (1.18.0-3ubuntu1+bionic1)
========================================================================
Real-risk summary
------------------------------------------------------------------------
ACTIVE EXPLOITATION RISK: none detected.
LATENT RISK - vulnerable version, no trigger in config (3):
- [nginx] CVE-2026-42945 (HIGH)
- [nginx] CVE-2026-42946 (MEDIUM)
- [nginx] CVE-2026-42934 (LOW)
These become exploitable if config changes introduce the trigger.
Mitigation: config-change discipline + plan upgrade.
========================================================================
Findings: 0 critical, 2 warnings
========================================================================
L'ajout d'une nouvelle CVE se fait en deux étapes.
1. Écrivez une fonction de déclenchement qui prend le texte complet de la configuration (sortie de nginx -T) et retourne (triggered: bool, evidence: str) :
def _trigger_my_cve(conf):
hits = [l for l in conf.splitlines() if re.search(r'risky_directive', l)]
if hits:
return True, "Found: " + hits[0]
return False, "Pattern not present"
2. Ajoutez l'entrée à NGINX_CVES (ou APACHE_CVES) :
{
"id": "CVE-XXXX-NNNNN",
"name": "Descriptive name",
"severity": "HIGH",
"affected": ("1.10.0", "1.25.0"),
"fixed_in": ["1.25.1"],
"trigger_desc": "Human-readable trigger description",
"trigger_fn": _trigger_my_cve,
},
C'est tout. Le framework gère automatiquement la classification, le formatage de la sortie, le JSON, les codes de sortie et le résumé exécutif.
--verbose pour inspecter les détails en cas de doute.Les pull requests, les issues, les nouveaux détecteurs de CVE et la prise en charge d'autres serveurs web (lighttpd, Caddy, HAProxy, etc.) sont tous les bienvenus.
Lorsque vous proposez un nouveau détecteur de CVE, veuillez inclure :
Publié sous la licence MIT.
Copyright (c) 2026 SiberSAN