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)。

## 最小触发配置
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安全, 云资产清单, 内存安全, 堆缓冲区溢出, 大模型安全审计, 暴力破解, 漏洞分析, 网络安全, 蓝队分析, 路径探测, 逆向工具, 逆向工程, 隐私保护