静态配置扫描器,用于标记易受 complex_value 两遍捕获覆盖漏洞(正则映射 + 正则捕获 → 堆溢出 / 信息泄露)影响的 Nginx 配置。
一个只读静态扫描器,用于标记易受 complex_value 两遍捕获覆盖(capture-clobbering)缺陷类影响的 nginx 配置(F5/nginx SIRT 公告,2026 年 7 月)。它解析你的配置,并报告存在漏洞的模式及其原因和位置。它不利用任何漏洞,也不接触正在运行的服务器。
单文件,仅使用标准库,Python 3.6+。
漏洞的完整说明: https://cyberstan.co.uk/nginx-rce/
nginx 分两遍构建许多指令值。LEN 遍测量长度并分配缓冲区,然后 VALUE 遍写入其中。正则捕获($1 到 $9,或命名捕获 (?P<name>...))从每请求的共享状态中读取。匹配键为正则表达式的 map 会在其变量被求值的那一刻执行一次新的 PCRE 匹配,而该匹配会覆盖共享的捕获状态。如果某个捕获在 LEN 遍中被测量,随后在 VALUE 遍重写该捕获之前运行了一个正则 map,两遍就会不一致:
当 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"
文本模式会为每个发现项打印:文件和行号、所在作用域、sink 指令、涉及的 capture 和 map 变量、触发该发现的 map,以及一行原因说明。被清除的部分会列出安全顺序的共存情况。--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 变量和
$1 到 $9 或命名捕获引用。(?P<name>...) 组。proxy_set_header 或
fastcgi_param 系列之外。set 变量产生的值。include 目标(例如本地不存在的绝对路径)会在
missing_includes 下报告,而不是被静默跳过。请在配置能够解析的主机上运行它,以获得完整覆盖。漏洞分析与利用链: https://cyberstan.co.uk/nginx-rce/