ChamsBouzaiene/ai-vuln-rediscovery-nginx-cve-2026-42945

GitHub: ChamsBouzaiene/ai-vuln-rediscovery-nginx-cve-2026-42945

记录了AI辅助重现nginx rewrite模块中由陈旧script-engine状态导致的堆缓冲区溢出漏洞(CVE-2026-42945)的完整实验过程,包含PoC、审计提示词和技术分析。

Stars: 0 | Forks: 1

# AI 辅助 rediscovery nginx 中的 CVE-2026-42945 本仓库记录了一项针对 nginx `ngx_http_rewrite_module` 的、可重现的 AI 辅助漏洞重现实验,该漏洞后来被关联至 CVE-2026-42945。 该实验的范围经过了刻意的限制。包含漏洞的文件 `src/http/ngx_http_script.c` 被直接提供给模型进行审计。这并非声称 AI 系统从零开始在完整的 nginx 代码库中自主发现了该问题。 ## 摘要 审计的 bug 是一个由于 nginx rewrite 处理过程中存在陈旧的 script-engine 状态而导致的堆缓冲区溢出。 宏观流程如下: 1. 包含 `?` 的 `rewrite` 替换会将 `e->is_args` 设置为 `1`。 2. 在存在漏洞的代码中,rewrite 完成后没有清除 `e->is_args`。 3. 随后的 `set`、`if` 或 rewrite 表达式在复制未命名的 regex 捕获(例如 `$1`)时,会按照直接复制捕获内容的情况来计算目标缓冲区的大小。 4. 写入阶段随后会读取到陈旧的 `e->is_args = 1`,并对该捕获内容执行 URI 转义。 5. 转义操作会将某些字节(例如空格)从 1 个字节扩展为 3 个字节,因此写入阶段会超出长度计算阶段所分配的缓冲区大小。 本地的 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 专为启用了 AddressSanitizer 的本地实验环境构建的脆弱 nginx 版本而设计。它会在 `127.0.0.1:18080` 上启动 nginx,向本地服务器发送一个精心构造的请求,并打印崩溃证据。 ### 1. 使用 ASan 构建存在漏洞的 nginx 使用受影响的 nginx 源码树。本实验已在使用 clang 和 ASan 构建的 nginx `1.30.0` 上验证通过: ``` ./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)" ``` ### 2. 运行 PoC 在此仓库目录下执行: ``` NGINX_BIN=/path/to/vulnerable/nginx/objs/nginx ./poc/reproduce.sh ``` 如果将此仓库直接放置在用于验证的 nginx 源码检出目录中,该脚本也会自动找到 `../../objs/nginx`。 ### 3. 预期结果 成功的重现将打印类似如下的 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 ``` 参见 [poc/expected_output.txt](poc/expected_output.txt)。 ![ASan 崩溃截图](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/99987b92f5050907.png) ## 最小触发配置 PoC 所使用的 nginx 配置经过了刻意的精简: ``` location / { rewrite ^(.*) /new?c=1; set $myvar $1; return 200 "$myvar\n"; } ``` 第一个 rewrite 由于其替换内容包含 `?` 而设置了 `e->is_args`。随后的 `set` 在对该陈旧状态仍然存在的情况下计算了 `$1` 的值。 ## 官方补丁 该最小补丁在 regex rewrite 完成时重置了 script engine 的参数状态标志: ``` e->is_args = 0; e->quote = 0; ``` 在用于本实验的源码树中,此修复对应于以下 commit: ``` 524977e7c534e87e5b55739fa74601c9f1102686 Rewrite: fixed escaping and possible buffer overrun ``` 关键点不在于补丁的大小,而在于它所恢复的状态不变量:长度计算阶段和写入阶段必须在是否将捕获内容作为 URI 参数进行复制这一问题上保持一致。 ## 实验透明度 本实验使用了一种前沿的编程智能体作为审计助手。提示词明确指导模型重点关注 `src/http/ngx_http_script.c` 中的内存安全问题,并密切注意两阶段长度/写入不匹配的情况。 重要的局限性说明: - 包含漏洞的源文件是直接提供的。 - 审计提示词高度针对该类 bug。 - 模型在验证期间可以访问本地仓库的提交历史。 - 该结果应被解释为引导式漏洞重现,而非自主漏洞挖掘。 - PoC 仅演示了崩溃/ASan 证据;它不是一个武器化的 exploit。 确切的提示词包含在 [prompts/audit_prompt.md](prompts/audit_prompt.md) 和 [prompts/poc_prompt.md](prompts/poc_prompt.md) 中。 ## 负责任的使用 本仓库旨在用于防御性研究、补丁验证和结果重现。请仅在你控制下的本地实验环境中运行此 PoC。 ## 许可证 本仓库中的文档和 PoC 测试套件基于 MIT 许可证发布。本仓库不包含 nginx 本身,nginx 受其自身独立的许可证管辖。
标签:0day漏洞, AddressSanitizer, AI安全, C/C++安全, Chat Copilot, CISA项目, Cutter, CVE-2026-42945, LLM漏洞挖掘, Nginx, ngx_http_rewrite_module, PoC, Web安全, 云资产清单, 内存安全, 堆缓冲区溢出, 大模型安全审计, 暴力破解, 漏洞分析, 网络安全, 蓝队分析, 路径探测, 逆向工具, 逆向工程, 隐私保护