
Kit Python pour auditer le serveur Apache HTTP contre CVE-2026-23918 (RCE double-free HTTP/2) et 4 CVE associées. Scanner passif avec vérification ALPN + auditeur local en lecture seule. Aucun exploit.
Outils d'audit défensif pour CVE-2026-23918 (double-free RCE HTTP/2 d'Apache HTTPD) et quatre CVE associées divulguées dans l'avis de sécurité de la Apache Software Foundation du 4 mai 2026.
| CVE | Sévérité | Composant | Impact | Versions concernées |
|---|---|---|---|---|
| CVE-2026-23918 | Élevée (CVSS 8.8) | HTTP/2 | Double free / RCE | 2.4.66 uniquement |
| CVE-2026-24072 | Modérée | mod_rewrite (ap_expr) | Élévation de privilèges | ≤ 2.4.66 |
| CVE-2026-28780 | Faible | mod_proxy_ajp | Dépassement de tampon sur le tas | ≤ 2.4.66 |
| CVE-2026-29168 | Faible | mod_md (OCSP) | Épuisement des ressources | 2.4.30 – 2.4.66 |
| CVE-2026-29169 | Faible | mod_dav_lock | Déréférencement de pointeur NULL / DoS | ≤ 2.4.66 |
Tous les problèmes sont corrigés dans Apache HTTP Server 2.4.67.
Ces outils sont destinés à être utilisés uniquement contre des systèmes qui vous appartiennent ou pour lesquels vous disposez d'une autorisation écrite explicite de test. L'analyse non autorisée peut être illégale dans votre juridiction.
La boîte à outils est défensive par conception :
Server: et utilise l'ALPN TLS standard — le même mécanisme que celui utilisé par tous les navigateurs modernes pour négocier HTTP/2..
├── apache_passive_audit.py # External asset audit (banner-grab + ALPN)
├── apache_local_audit.py # On-host / SSH local audit
├── LICENSE # MIT
├── .gitignore
└── README.md
python3 par défaut d'Ubuntu 18.04 et toutes les versions ultérieures.git clone https://github.com/sibersan/cve-2026-23918.git
cd cve-2026-23918
chmod +x apache_passive_audit.py apache_local_audit.py
apache_passive_audit.pyLit l'en-tête HTTP Server: pour détecter la version d'Apache et la confronte au tableau des CVE. De plus, pour les cibles HTTPS, effectue une négociation ALPN TLS standard afin de déterminer si HTTP/2 est exposé — c'est la condition préalable essentielle pour que CVE-2026-23918 soit exploitable. Aucun payload d'exploitation n'est envoyé.
Le script propose h2 et http/1.1 dans l'extension ALPN de la poignée de main TLS (RFC 7301). Le choix du serveur est la réponse standard et sans ambiguïté à la question « HTTP/2 est-il activé ? » — utilisé par tous les navigateurs modernes et curl. Cela ne déclenche pas la vulnérabilité ni aucun comportement inhabituel.
Le verdict de risque reflète ceci :
# Single target
python3 apache_passive_audit.py -t https://web.example.com
# Multiple targets
python3 apache_passive_audit.py -t https://a.example.com -t https://b.example.com
# Targets file, parallel, CSV + JSON output
python3 apache_passive_audit.py -f targets.txt -w 20 -o report.csv --json report.json
# CI / log-friendly (no colors)
python3 apache_passive_audit.py -f targets.txt --no-color
Format de targets.txt (une cible par ligne, # pour les commentaires) :
https://www.example.com
intranet.example.local:8443
# old staging box
http://10.0.5.12
| Code | Signification |
|---|---|
| 0 | Toutes les cibles sûres |
| 1 | Au moins une cible UNKNOWN ou ERROR |
| 2 | Au moins une cible VULNERABLE ou |
ServerTokens Prod ou Minimal masquent la version — le script renvoie honnêtement UNKNOWN. Utilisez l'audit local pour confirmer.apache_local_audit.pyS'exécute sur l'hôte cible (ou via SSH) et examine le binaire Apache, la version, les modules chargés et la configuration HTTP/2. Il évalue également les conditions préalables d'exploitabilité : par ex. si la version est 2.4.66 mais que HTTP/2 est désactivé, le risque pour CVE-2026-23918 est réduit en conséquence.
sudo python3 apache_local_audit.py
# JSON report (for centralized inventory)
sudo python3 apache_local_audit.py --json /var/log/apache_audit_$(hostname).json
# Custom binary path
sudo python3 apache_local_audit.py --binary /opt/apache/bin/httpd
httpd -v / apache2 -v — versionhttpd -V — informations de compilation, HTTPD_ROOT, SERVER_CONFIG_FILEapache2ctl -M ou httpd -M — modules chargésdpkg-query / rpm -q — version du paquetInclude/IncludeOptional (y compris sites-enabled/, mods-enabled/ de Debian) → directive Protocols (h2 / h2c / http/1.1)| Flag | Description |
|---|---|
--binary | Chemin du binaire Apache (remplace la détection automatique) |
--json | Sortie de rapport JSON |
--no-color | Désactiver la sortie colorée |
| Code | Signification |
|---|---|
| 0 | SAFE |
| 1 | PATCH_NEEDED ou UNKNOWN |
| 2 | VULNERABLE ou AT_RISK |
sudo/root est recommandé pour une lecture complète de la configuration. Sans cela, certains fichiers dans sites-enabled/, mods-enabled/ ou /etc/httpd/conf.d/ peuvent être illisibles.
Pour exécuter l'audit local sur plusieurs hôtes et collecter les rapports de manière centralisée, un exemple de commande ad-hoc Ansible :
ansible all -i inventory.ini -b -m script \
-a "apache_local_audit.py --json /tmp/apache_audit.json --no-color"
ansible all -i inventory.ini -b -m fetch \
-a "src=/tmp/apache_audit.json dest=./reports/ flat=no"
Les fichiers JSON collectés peuvent être fusionnés avec jq ou un petit script Python.
Pour CVE-2026-23918 (jusqu'à la correction) :
h2 et h2c de la directive Protocols dans votre configuration, ou exécutez sudo a2dismod http2 sur Debian/Ubuntu, puis rechargez le service.mod_dav_lock s'il n'est pas utilisé (CVE-2026-29169)..htaccess (CVE-2026-24072).Avis officiel : https://httpd.apache.org/security/vulnerabilities_24.html
Les pull requests sont les bienvenues. Lors de l'ajout d'une nouvelle CVE, veuillez :
CVE_TABLE avec la plage de versions concernée et la lambda match.needs approprié pour les vérifications de conditions préalables (module chargé, protocole activé, etc.).from __future__ import annotations, les génériques PEP 585 (list[int]), subprocess.run(capture_output=True) et @dataclass.MIT © 2026 SiberSAN
Ce logiciel est fourni « tel quel », sans garantie d'aucune sorte. Validez-le dans un environnement de test avant toute utilisation en production. L'utilisateur assume l'entière responsabilité légale de toute utilisation contre des systèmes non autorisés.
| Flag | Description |
|---|
-t, --target | Cible unique (peut être répété) |
-f, --file | Fichier de liste de cibles |
-o, --csv | Sortie de rapport CSV |
--json | Sortie de rapport JSON |
--timeout | Délai d'expiration de la requête en secondes (défaut 10) |
-w, --workers | Threads de travail parallèles (défaut 10) |
--no-color | Désactiver la sortie colorée |
AT_RISK| Niveau | Signification |
|---|
VULNERABLE | La version correspond à une plage de CVE de l'avis ET sa condition préalable est remplie (par ex. HTTP/2 activé) |
AT_RISK | Version non corrigée mais la condition préalable de sévérité élevée n'est PAS remplie ; les autres CVE s'appliquent toujours |
SAFE | Version ≥ 2.4.67 |
UNKNOWN | Bannière masquée (ServerTokens Prod) ou masquée par un reverse proxy/WAF — vérifier avec le script d'audit local |
NOT_APACHE | Pas Apache (nginx, IIS, etc.) |
ERROR | Erreur de connexion |
| Niveau | Signification |
|---|
VULNERABLE | Version non corrigée + conditions préalables de la CVE de sévérité élevée remplies (par ex. HTTP/2 activé) |
AT_RISK | Version non corrigée + au moins une condition préalable de CVE remplie |
PATCH_NEEDED | Version non corrigée mais aucun module/protocole pertinent activé — corriger quand même |
SAFE | Version ≥ 2.4.67 |
UNKNOWN | Version impossible à détecter |