
Preuve de concept et analyse technique pour CVE-2026-27654, une vulnérabilité de débordement de tampon sur le tas (heap-based buffer overflow) dans le module HTTP WebDAV de NGINX, incluant l'analyse de la cause racine, la reproduction et les mesures d'atténuation.
Ce dépôt fournit un exploit proof-of-concept pour CVE-2026-27654, une vulnérabilité de débordement de tas (heap overflow) dans le ngx_http_dav_module de nginx. Le bug provient d'un underflow de size_t lors du traitement des requêtes MOVE/COPY avec des en-têtes Destination spécialement conçus et des emplacements basés sur alias.
⚠️ Avertissement : Cet outil est destiné uniquement à la recherche et aux tests de sécurité autorisés. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation explicite de test. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.
CVE-2026-27654 est un débordement de tampon basé sur le tas (heap-based buffer overflow) déclenchable à distance dans le module HTTP WebDAV de NGINX, causé par un underflow entier (integer underflow) dans ngx_http_dav_copy_move_handler() (src/http/modules/ngx_http_dav_module.c). La vulnérabilité survient lorsque la longueur de l'URI de destination est dérivée en soustrayant le préfixe d'emplacement configuré du chemin de l'en-tête Destination. Comme les deux opérandes sont de type size_t, un chemin de destination plus court fait que la soustraction s'emballe jusqu'à une valeur non signée proche du maximum.
La longueur résultant de cet emballement est ensuite utilisée comme argument de taille pour memcpy(), ce qui entraîne une écriture hors limites dans le tas qui corrompt la mémoire et fait immédiatement planter le processus worker de NGINX. Un attaquant distant non authentifié peut déclencher cette condition de manière fiable à l'aide d'une seule requête MOVE ou COPY spécialement conçue, ciblant un emplacement WebDAV mappé via alias. Bien que le processus master de NGINX relance automatiquement les workers en échec, des requêtes répétées peuvent maintenir le service dans une boucle continue de crash des workers, ce qui entraîne un déni de service (DoS) persistant.
AddressSanitizer (ASan) valide la vulnérabilité avec une erreur negative-size-param dans memcpy(), en retraçant le chemin d'exécution de ngx_http_dav_copy_move_handler() à ngx_http_core_module.c. La vulnérabilité affecte NGINX 0.5.13–1.28.2 (stable) et 1.29.0–1.29.6 (mainline) compilés avec --with-http_dav_module et configurés avec la directive alias. Le problème a été corrigé dans NGINX 1.28.3 et 1.29.7 (commit ab4b5b8, PR #1210) grâce à une validation appropriée de la longueur du chemin de destination calculé avant les opérations mémoire.
MOVE/COPY canonique qui déclenche l'underflow de size_t et fait planter le worker vulnérable.alias inscriptible)./etc/cron.d/, avec des invites interactives pour LHOST/LPORT et un rappel pour démarrer le listener.--cron-command.--check) – mode non interactif qui exécute le test de crash et affiche un verdict clair [VULNERABLE] / [NOT VULNERABLE], avec un code de sortie 0 ou 1.--proxy) – achemine toutes les requêtes via un proxy HTTP/HTTPS (par ex. Burp Suite, mitmproxy) pour le débogage ou l'inspection du trafic.--payload-file (binaire), --payload-text (texte littéral), ou utilisez le contenu de test par défaut.--destination-path, --alias-len, --escape-depth, --method, --location-prefix, et plus encore.requests n'est pas installée, le script se replie sur le module standard http.client de Python (la prise en charge du proxy est désactivée en mode de repli).git clone https://github.com/Debajyoti0-0/CVE-2026-27654-PoC.git
cd CVE-2026-27654-PoC
pip install -r requirements.txt
python exploit.py --target 192.168.1.100:8080
Un menu numéroté s'affichera et vous serez invité à sélectionner un mode.
python exploit.py --target 192.168.1.100:8080 --check
Cela force le mode crash, exécute l'exploit et affiche [VULNERABLE] ou [NOT VULNERABLE] avant de se terminer avec le code 0 ou 1.
python exploit.py --target 192.168.1.100:8080 --proxy http://127.0.0.1:8080
Toutes les requêtes HTTP seront envoyées via le proxy spécifié (utile pour le débogage avec Burp).