
RCE 概念验证,针对 CVE-2026-42945——这是 NGINX ngx_http_rewrite_module 中一个于 2008 年引入的严重堆缓冲区溢出漏洞。该漏洞使得攻击者能够对使用 rewrite 和 set 指令的服务器进行未经认证的远程代码执行。
该漏洞与另外三个内存破坏问题(CVE-2026-42946、CVE-2026-40701、CVE-2026-42934)一同,由 depthfirst 的安全分析系统在单击一次接入 NGINX 源码后自动发现。
想在您自己的代码中发现类似问题?试试同一套系统:https://depthfirst.com/open-defense。
NGINX 的脚本引擎采用两遍处理流程:先计算所需的缓冲区大小,再写入数据。当 rewrite 替换内容中包含 ? 时,主引擎上的 is_args 标志会被置位,但长度计算遍是在一个全新归零的子引擎上运行的。因此:
is_args = 0 → 返回原始捕获长度。is_args = 1 → 以 NGX_ESCAPE_ARGS 调用 ,将每个可转义字节扩展为 3 个字节。ngx_escape_uri写入操作会用攻击者控制的 URI 数据溢出容量不足的堆缓冲区。利用过程中,通过跨请求的堆风水(heap feng shui)破坏相邻 ngx_pool_t 的 cleanup 指针(由于 URI 字节不能包含空字节,因此通过 POST 请求体喷洒),将其重定向到伪造的 ngx_pool_cleanup_s,从而在池销毁时调用 system()。
更多关于此漏洞的细节,请参阅我们的技术文章。
| 产品 | 受影响版本 | 修复版本 |
|---|---|---|
| NGINX Open Source | 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
| NGINX Plus | R32 – R36 | R36 P4, R35 P2, R32 P6 |
K000161616:NGINX ngx_http_v3_module 漏洞 — HTTP/3 QPACK 从单向编码器流的池中分配会话 insert_buffer。关闭该流会释放池,而会话仍保留一个悬空指针,因此后续的编码器流会在 NGINX worker 进程中触发堆释放后使用(use-after-free)。
K000162097:NGINX map 指令与正则匹配漏洞 — map 指令中的正则匹配配合捕获变量,可能导致 NGINX worker 进程发生堆缓冲区溢出。
该漏洞存在于 stream 脚本引擎的两遍复杂值求值过程中。在易受攻击的 stream 配置中,使用 ssl_preread 时,攻击者控制的 TLS SNI 会被送入基于正则的变量。NGINX 先计算输出缓冲区长度,然后复制输出。map 正则可能会在这两遍之间更新全局捕获状态:长度遍计算的是较小值,而写入遍读取的是较大的正则捕获(如 $1),从而在 worker 中造成堆越界写入。
随附的 CVE-2026-42533/ PoC 是一个完整利用链。它利用 stream 泄漏原语恢复堆和 libc 基址以绕过 ASLR,通过 HTTP 请求体喷洒伪造的 ngx_pool_cleanup_s 记录,然后利用该溢出破坏相邻 NGINX 池的 cleanup 指针。当被破坏的池销毁时,清理分发会被重定向到 libc 的 system(),执行提供的命令。