
Redécouverte reproductible de vulnérabilité assistée par IA de CVE-2026-42945 dans nginx, y compris l'analyse technique, le déclencheur PoC et la validation du correctif pour le débordement de tampon de tas.
Ce dépôt documente une expérience reproductible de redécouverte de vulnérabilité assistée par IA contre ngx_http_rewrite_module de nginx, ultérieurement associée à CVE-2026-42945.
L'expérience est délibérément restreinte. Le fichier vulnérable, src/http/ngx_http_script.c, a été directement fourni au modèle pour audit. Il ne s'agit pas d'une affirmation selon laquelle un système d'IA aurait trouvé le problème de manière autonome dans l'ensemble du code source de nginx.
Le bogue audité est un débordement de tampon sur le tas causé par un état obsolète du moteur de script dans le traitement de réécriture de nginx.
De manière générale :
rewrite contenant ? définit e->is_args = 1.e->is_args n'est pas effacé après la fin de la réécriture.set, if ou rewrite ultérieure qui copie une capture nommée ou non d'une expression régulière, comme $1, peut dimensionner le tampon de destination comme si la capture était copiée brute.e->is_args = 1 obsolète et échappe la capture dans l'URI.La reproduction locale avec AddressSanitizer confirme un débordement de tampon sur le tas dans :
ngx_escape_uri
ngx_http_script_copy_capture_code
ngx_http_rewrite_handler
.
├── README.md
├── LICENSE
├── prompts/
│ ├── audit_prompt.md
│ └── poc_prompt.md
├── poc/
│ ├── trigger.py
│ ├── nginx.conf
│ ├── reproduce.sh
│ └── expected_output.txt
├── docs/
│ ├── technical-analysis.md
│ ├── vulnerability-breakdown.md
│ └── methodology.md
└── screenshots/
└── asan-crash.png
Le PoC est conçu pour une construction locale en laboratoire de nginx vulnérable avec AddressSanitizer activé. Il démarre nginx sur 127.0.0.1:18080, envoie une requête conçue à un serveur local et affiche les preuves du crash.
Utilisez une arborescence source nginx affectée. L'expérience a été validée avec nginx 1.30.0 construit avec clang et ASan :
./auto/configure \
--prefix=/tmp/nginx-asan-poc \
--with-cc-opt='-O0 -g -fsanitize=address -fno-omit-frame-pointer' \
--with-ld-opt='-fsanitize=address'
make -j"$(getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu)"
Depuis ce dépôt :
NGINX_BIN=/chemin/vers/nginx/vulnerable/objs/nginx ./poc/reproduce.sh
Si ce dépôt est placé directement dans le répertoire source nginx utilisé pour la validation, le script trouve également ../../objs/nginx automatiquement.
Une reproduction réussie affiche un rapport ASan similaire à :
ERROR: AddressSanitizer: heap-buffer-overflow
WRITE of size 1
#0 ngx_escape_uri ngx_string.c:1687
#1 ngx_http_script_copy_capture_code ngx_http_script.c:1399
#2 ngx_http_rewrite_handler ngx_http_rewrite_module.c:180
Voir poc/expected_output.txt.

La configuration nginx utilisée par le PoC est intentionnellement petite :
location / {
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 "$myvar\n";
}
La première rewrite définit e->is_args car la chaîne de remplacement contient ?. Le set ultérieur évalue $1 alors que cet état obsolète est toujours présent.
Le correctif minimal réinitialise le drapeau d'état des arguments du moteur de script lorsqu'une réécriture par expression régulière se termine :
e->is_args = 0;
e->quote = 0;
Dans l'arborescence source utilisée pour cette expérience, le correctif apparaît comme le commit :
524977e7c534e87e5b55739fa74601c9f1102686
Rewrite: fixed escaping and possible buffer overrun
Le point clé n'est pas la taille du correctif, mais l'invariant d'état qu'il rétablit : la passe de longueur et la passe d'écriture doivent être d'accord sur le fait que les captures sont copiées comme arguments d'URI.
Cette expérience a utilisé un agent de codage de pointe comme assistant d'audit. L'invite dirigeait explicitement le modèle pour se concentrer sur les problèmes de sécurité mémoire dans src/http/ngx_http_script.c et pour prêter une attention particulière aux divergences de longueur/écriture en deux passes.
Limitations importantes :
Les invites exactes sont incluses dans prompts/audit_prompt.md et prompts/poc_prompt.md.
Ce dépôt est destiné à la recherche défensive, à la validation de correctifs et à la reproductibilité. N'exécutez le PoC que sur des instances de laboratoire locales que vous contrôlez.
La documentation et le harnais PoC de ce dépôt sont publiés sous la licence MIT. nginx lui-même n'est pas inclus et est régi par sa propre licence.