
Статический сканер конфигураций, который помечает конфигурации nginx, уязвимые для ошибки complex_value two-pass capture-clobbering (regex map + regex capture → переполнение кучи / утечка информации).
Статический сканер только для чтения, который выявляет конфигурации nginx, уязвимые к классу ошибок двухпроходной перезаписи захватов complex_value (рекомендация F5/nginx SIRT, июль 2026). Он разбирает вашу конфигурацию и сообщает об уязвимом шаблоне с указанием причины и местоположения. Он ничего не эксплуатирует и не затрагивает работающий сервер.
Один файл, только стандартная библиотека, Python 3.6+.
Полное описание уязвимости: https://cyberstan.co.uk/nginx-rce/
nginx строит многие значения директив в два прохода. Проход LEN измеряет длину и выделяет буфер, затем проход VALUE записывает в него. Захваты регулярных выражений ($1 до $9 или именованные (?P<name>...)) читаются из общего состояния, привязанного к запросу. map, ключ сопоставления которого является регулярным выражением, выполняет новое сопоставление PCRE в момент вычисления своей переменной, и это сопоставление перезаписывает общее состояние захватов. Если захват измеряется в проходе LEN, а затем регулярное выражение map выполняется до того, как проход VALUE перезапишет этот захват, два прохода расходятся:
Оба направления могут быть инициированы удалённо, когда входные данные map
подвержены влиянию атакующего ($request_body, $http_*, $arg_*, $uri,
$ssl_preread_server_name и так далее).
Сканер помечает location или server, когда всё перечисленное попадает в один двухпроходный буфер в эксплуатируемом порядке:
location ~, server_name ~, rewrite,
if (... ~ ...) или регулярное выражение map с группой захвата.map (http или stream) с ключом сопоставления по регулярному выражению ~ или ~*,
на который ссылаются через его выходную переменную.return, set, add_header, proxy_method,
proxy_pass, rewrite, index и другие): обе ссылки в одном значении.proxy_set_header, proxy_set_body,
fastcgi_param, scgi_param, uwsgi_param, grpc_set_header): они
строят один буфер на запрос для всего семейства, поэтому обе ссылки могут
находиться в отдельных директивах в одном location.# scan a single config (follows include directives by default)
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf
# scan a directory (uses nginx.conf if present, else all *.conf)
python3 nginx_capture_clobber_scan.py /etc/nginx/
# scan several roots
python3 nginx_capture_clobber_scan.py site-a.conf site-b.conf
# machine-readable output
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf --json
# do not expand include directives
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf --no-includes
| Параметр | Действие |
|---|---|
--json | Выводить отчёт в формате JSON вместо текста. |
--no-includes | Не обрабатывать директивы include. |
| Код | Значение |
|---|---|
0 | Уязвимых конфигураций не найдено. |
1 | Найдена как минимум одна уязвимая конфигурация. |
2 | Ошибка использования (путь не указан или не найден). |
Можно использовать в CI, так как при уязвимой конфигурации код выхода ненулевой:
python3 nginx_capture_clobber_scan.py /etc/nginx/nginx.conf || echo "review needed"
Текстовый режим выводит для каждой находки: файл и строку, охватывающую область, директиву-сток, задействованные переменные capture и map, сработавшую map и однострочную причину. В разделе cleared перечисляются безопасные по порядку сосуществования. --json выдаёт:
{
"vulnerable": true,
"findings": [
{
"file": "/etc/nginx/conf.d/api.conf",
"line": 12,
"scope": "location ~ ^/api/(.+)$",
"directive": "proxy (family buffer)",
"captures": ["$1"],
"map_vars": ["$is_bot"],
"triggers": ["$is_bot <- regex-map on $http_user_agent [nginx.conf:30]"],
"reason": "..."
}
],
"cleared_safe_order": [],
"regex_maps": [],
"missing_includes": []
}
map в том же location или буфере, что и
ссылка на $1–$9 или именованную группу захвата.(?P<name>...) в нескольких regex-картах.proxy_set_header или
fastcgi_param.set-переменными.include (например, абсолютные пути, которых не существует
локально) сообщаются в missing_includes, а не молча пропускаются. Запускайте его
на хосте, где конфигурация разрешается, для полного покрытия.Описание уязвимости и цепочка эксплуатации: https://cyberstan.co.uk/nginx-rce/