
Воспроизводимое повторное обнаружение уязвимости CVE-2026-42945 в nginx с помощью ИИ, включая технический анализ, триггер PoC и проверку патча для переполнения буфера в куче.
В этом репозитории документирован воспроизводимый эксперимент по повторному обнаружению уязвимости с помощью AI в модуле ngx_http_rewrite_module nginx, впоследствии связанной с CVE-2026-42945.
Эксперимент намеренно узок. Уязвимый файл src/http/ngx_http_script.c был напрямую предоставлен модели для аудита. Это не означает, что AI-система автономно нашла проблему во всей кодовой базе nginx с нуля.
Аудируемая ошибка — это переполнение кучи (heap buffer overflow), вызванное устаревшим состоянием скриптового движка при обработке переписывания (rewrite) в nginx.
На высоком уровне:
rewrite, содержащая ?, устанавливает e->is_args = 1.e->is_args не очищается после завершения переписывания.set, if или rewrite, копирующее безымянную подстановку из регулярного выражения, например $1, может выделить буфер для назначения так, как если бы подстановка копировалась без изменений.e->is_args = 1 и применяет URI-экранирование к подстановке.Локальное воспроизведение с AddressSanitizer подтверждает переполнение кучи в:
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
PoC разработан для локальной сборки уязвимого nginx с включённым AddressSanitizer. Он запускает nginx на 127.0.0.1:18080, отправляет специально сформированный запрос локальному серверу и выводит свидетельства краха.
Используйте дерево исходников уязвимой версии nginx. Эксперимент был проверен на nginx 1.30.0, собранном с clang и 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)"
Из этого репозитория:
NGINX_BIN=/path/to/vulnerable/nginx/objs/nginx ./poc/reproduce.sh
Если этот репозиторий размещён непосредственно внутри дерева исходников nginx, используемого для проверки, скрипт также автоматически найдёт ../../objs/nginx.
Успешное воспроизведение выводит отчёт ASan, похожий на:
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

Конфигурация nginx, используемая PoC, намеренно мала:
location / {
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 "$myvar\n";
}
Первый rewrite устанавливает e->is_args, потому что замена содержит ?. Последующий set вычисляет $1, пока это устаревшее состояние всё ещё присутствует.
Минимальный патч сбрасывает флаг состояния аргументов скриптового движка после завершения переписывания по регулярному выражению:
e->is_args = 0;
e->quote = 0;
В дереве исходников, использованном для этого эксперимента, исправление присутствует в коммите:
524977e7c534e87e5b55739fa74601c9f1102686
Rewrite: fixed escaping and possible buffer overrun
Ключевой момент — не размер патча, а восстанавливаемый им инвариант состояния: этап подсчёта длины и этап записи должны быть согласованы относительно того, копируются ли подстановки как URI-аргументы.
В этом эксперименте использовался пограничный кодирующий агент (frontier coding agent) в качестве ассистента аудита. Подсказка (prompt) явно предписывала модели сосредоточиться на проблемах безопасности памяти в src/http/ngx_http_script.c и обращать особое внимание на несоответствия длины/записи в двухпроходном алгоритме.
Важные ограничения:
Точные подсказки включены в prompts/audit_prompt.md и prompts/poc_prompt.md.
Этот репозиторий предназначен для оборонительных исследований, проверки патчей и воспроизводимости. Запускайте PoC только на лабораторных экземплярах, которыми вы управляете.
Документация и PoC-инструментарий в этом репозитории выпущены под лицензией MIT. nginx не включён и регулируется собственной лицензией.