一个受控的网络安全实验室,用于验证和比较与 CVE-2026-42926 相关的行为,这是一个影响特定 NGINX 版本的 HTTP/2 帧注入 问题,当使用有漏洞的代理配置时。
本仓库仅用于防御性研究、补丁验证、配置审计和受控的实验室复现。
分类:HTTP/2 帧注入 受影响版本:NGINX
1.29.4至1.30.0修复版本:NGINX1.30.1+/1.31.0+
请仅在你拥有或明确授权测试的隔离实验室环境中使用本项目。
未经书面授权,请勿对第三方系统、公共基础设施、共享环境或生产服务运行此项目。
推荐的隔离方式:
该实验室检查目标 NGINX 二进制文件和配置是否满足复现该问题所需的条件,向测试位置发送精心构造的请求,并检查受控的上游日志器,以寻找注入的类似 HTTP/2 帧的字节到达上游侧的痕迹。
正常的验证模式是:
预期结果:
bashpython3php对于容器化工作流:
示例配置监听端口 80,通常需要 root 权限。对于非特权本地实验室,将 nginx_vulnerable.conf 中的 listen 80; 更改为可用的高位端口,例如 8080,然后在 PHP 命令中使用匹配的目标 URL。
使 shell 脚本可执行:
chmod +x nginx_config_verify.sh run_lab_comparison.sh
确认 PHP 有 cURL 支持:
php -m | grep -i curl
确认每个 NGINX 二进制文件可以打印版本:
/path/to/nginx -V
提供的 nginx_vulnerable.conf 包含所需的测试模式:
location /exploit {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 2;
proxy_set_body $request_body;
proxy_set_header Host $host;
proxy_set_header Content-Length $content_length;
}
重要细节:
proxy_http_version 2 启用对上游日志器的 HTTP/2 代理。proxy_set_body $request_body 使用客户端控制的请求体。client_max_body_size 20m 允许验证脚本使用的构造的 16 MiB 请求体。127.0.0.1:8081。docker/nginx_vulnerable.docker.conf 中的 Docker 特定配置保留了相同的易受攻击代理模式,但监听容器端口 8080 并代理到 Compose 服务名 upstream:8081。
Dockerfile 从源代码构建 NGINX 1.29.4,并安装实验室所需的 PHP/Python 工具。然后 Compose 从同一镜像运行三个服务:
upstream: 原始 HTTP/2 帧日志器nginx: 使用 docker/nginx_vulnerable.docker.conf 的易受攻击的 NGINX 1.29.4runner: 一次性 PHP 验证命令构建实验室镜像:
docker compose build
启动上游日志器和易受攻击的 NGINX:
docker compose up -d upstream nginx
确认捆绑的 NGINX 版本:
docker compose exec nginx nginx -V
在 Compose 网络内运行验证脚本:
docker compose --profile run run --rm runner
运行器使用以下容器内参数:
php /lab/cve_2026_42926_lab.php \
http://nginx:8080/exploit \
/lab/upstream_logs \
/lab/nginx_config_verify.sh \
/usr/local/nginx/sbin/nginx \
/lab/docker/nginx_vulnerable.docker.conf \
/exploit
生成的上游日志写入主机目录:
./upstream_logs/
NGINX 服务也通过以下地址暴露给主机:
http://localhost:8080/version
停止并移除实验室容器:
docker compose down
启动受控的上游日志器:
python3 upstream_frame_logger.py 8081 ./upstream_logs
在另一个终端中,使用示例配置启动 NGINX:
/path/to/nginx -c "$PWD/nginx_vulnerable.conf"
运行验证脚本:
php cve_2026_42926_lab.php \
http://localhost/exploit \
./upstream_logs \
./nginx_config_verify.sh \
/path/to/nginx \
"$PWD/nginx_vulnerable.conf" \
/exploit
运行后停止 NGINX:
/path/to/nginx -s stop
如果你更改了 NGINX 监听其他端口,请更新第一个参数。例如:
php cve_2026_42926_lab.php http://localhost:8080/exploit ./upstream_logs ./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
设置两个 NGINX 二进制文件的路径并运行比较框架:
VULNERABLE_NGINX=/usr/local/nginx_1.29.4/sbin/nginx \
PATCHED_NGINX=/usr/local/nginx_1.30.1/sbin/nginx \
bash run_lab_comparison.sh
可选的配置覆盖:
VULNERABLE_NGINX=/path/to/vulnerable/nginx \
PATCHED_NGINX=/path/to/patched/nginx \
VULNERABLE_CONFIG="$PWD/nginx_vulnerable.conf" \
PATCHED_CONFIG="$PWD/nginx_vulnerable.conf" \
bash run_lab_comparison.sh
比较脚本写入:
vulnerable_result.txtpatched_result.txtupstream_logs_vulnerable/upstream_logs_patched/当你只想检查配置是否包含易受攻击模式时,直接使用 nginx_config_verify.sh:
./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
辅助脚本检查:
proxy_http_version 2proxy_set_bodyclient_max_body_sizecve_2026_42926_lab.php 接受位置参数:
php cve_2026_42926_lab.php <target_url> <upstream_log_dir> <config_script> <nginx_binary> <nginx_config> <location> [version_url]
默认值:
cve_2026_42926_lab.php 返回三种判定之一:
| 判定 | 含义 |
|---|
阳性证据要求脚本关联运行标记、观察到的上游帧头、注入帧标志以及受影响的 NGINX 版本。
上游日志器写入类似命名的 JSON 文件:
frames_<timestamp>.json
每个日志包含解析后的 HTTP/2 帧元数据、有效载荷摘要、字节偏移、注入检测标志和运行关联字段。
比较框架为易受攻击和已补丁的运行存储单独的日志目录,以使两次执行的证据不会混合。
如果 PHP 脚本报告配置辅助脚本不可执行,请运行:
chmod +x nginx_config_verify.sh
如果请求返回 413 Request Entity Too Large,请将 client_max_body_size 增加到至少 16m;示例配置使用 20m。
如果没有创建上游日志,请检查:
upstream_frame_logger.py 是否正在运行。127.0.0.1:8081。/exploit 位置。如果 NGINX 无法绑定端口 80,请在实验室环境中以适当的权限运行,或者将配置更改为高位端口,如 8080。
如果比较结果不确定,请检查 vulnerable_result.txt、patched_result.txt 以及相应的上游日志目录,查找失败的前提条件。
本项目采用 MIT 许可证授权。详情请参见 LICENSE。
| 文件 | 描述 |
|---|
README.md | 项目文档。 |
LICENSE | MIT 许可证。 |
Dockerfile | 构建一个包含 NGINX 1.29.4、PHP CLI/cURL、Python 和项目脚本的自包含实验镜像。 |
docker-compose.yml | 启动易受攻击的 NGINX 服务、上游帧日志器和可选的验证运行器。 |
cve_2026_42926_lab.php | 主要实验验证脚本。检查版本/配置前提条件,发送构造的请求,检查上游日志并返回判定。 |
nginx_vulnerable.conf | 包含易受攻击代理模式的示例 NGINX 配置,用于易受攻击和已补丁的比较运行。 |
docker/nginx_vulnerable.docker.conf | Docker 特定的 NGINX 配置,使用相同的易受攻击模式和 Compose 服务发现。 |
nginx_config_verify.sh | 辅助脚本,验证目标 NGINX 配置是否包含所需的易受攻击代理模式。 |
upstream_frame_logger.py | 受控的原始 HTTP/2 上游日志器,用于捕获和检查从 NGINX 接收到的帧。 |
run_lab_comparison.sh | 编排易受攻击与已补丁的比较运行。 |
.dockerignore | 防止生成的日志和 IDE 元数据进入 Docker 构建上下文。 |
| 参数 | 默认值 |
|---|
target_url | http://localhost/exploit |
upstream_log_dir | ./upstream_logs |
config_script | ./nginx_config_verify.sh |
nginx_binary | nginx |
nginx_config | /etc/nginx/nginx.conf |
location | /exploit |
version_url | http://localhost/version |
| 退出码 |
|---|
positive | 观察到帧注入证据并与该运行相关联。 | 0 |
negative | 满足前提条件,未观察到注入证据。 | 1 |
inconclusive | 一个或多个前提条件或证据检查失败。 | 2 |