HTTP Garden:HTTP解析器漏洞研究工具
工具概述
HTTP Garden 是一个由可组合的HTTP服务器和代理组成的集合,配合相关脚本进行交互,旨在大幅简化漏洞发现过程。该工具在 ShmooCon 2024 会议上进行了演示,展示了其发现的漏洞示例。
技术依赖与运行环境
- 支持平台:x86_64 和 AArch64 架构的 Linux 系统,其他平台未经测试。
- 核心依赖:
- Docker:用于构建和运行目标服务器容器。
- Python 3.12+ 及以下库:
docker、pyyaml、tqdm。
使用示例
基本流程
- 启动服务器与代理:使用
./garden.sh start --build 命令启动如 Gunicorn、Hyper、Nginx、HAProxy 等组件。
- 通过REPL交互:在另一个终端启动 REPL 界面,发送请求并观察解析结果。
示例分析
- 示例一(合规请求):发送标准GET请求,通过HAProxy转换后,由多个源服务器(Gunicorn、Hyper、Nginx)处理。工具以网格形式展示各服务器解析结果的一致性,并能智能忽略非关键差异(如Nginx额外添加的
content-length 和 content-type 头部)。
- 示例二(违规请求):发送一个使用裸LF行尾的分块传输编码请求(违反规范)。结果显示:Gunicorn返回400错误,Hyper无响应,Nginx则接受请求。这揭示了Nginx对规范的一种已知且未修复的偏离。工具能识别并视本质相同的拒绝响应为一致。
项目结构
目录布局
images/:包含每个HTTP服务器和转换器(用于修改HTTP消息的组件)的子目录,每个目标拥有独立的Docker镜像。目标程序尽可能从源代码构建,并可通过仓库URL、分支和提交哈希进行参数化配置以支持多版本构建。
tools/:包含与服务器交互的脚本,例如:
probe_quirks.py:枚举被测系统中的良性HTTP解析怪癖,以便在模糊测试中忽略。
repl.py:HTTP Garden的主要用户界面。
update.py:用于更新 docker-compose.yml 中的提交哈希。
支持的目标组件
HTTP服务器(共34个)
包括但不限于:aiohttp, apache_httpd, gunicorn, nginx, node_stdlib, twisted, uvicorn 等知名服务器和库。
HTTP转换器(共14个)
包括但不限于:envoy, haproxy, nginx_proxy, squid, varnish 等代理和负载均衡器。
组件排除说明
以下为一些未被包含的知名项目及其原因:
- 使用相同解析器:例如
unicorn (使用 yahns 解析器), SwiftNIO (使用 llhttp), Deno (使用 hyper), Caddy (使用Go标准库) 等,因功能已由库中其他项目覆盖而排除。
- 维护或回应问题:例如
boa 已停止维护;Cheroot 忽略了项目方的报告;dart_stdlib 和 openjdk_stdlib 缺乏有效的漏洞披露渠道或曾忽略报告。
- 非生产用途或功能限制:例如
CPython http.server 不用于生产;uwsgi 不支持分块消息体。
- 基于已有组件:例如
Vultr Load Balancer (基于HAProxy), VMWare Avi Load Balancer (基于Nginx) 等。
研究成果
项目已发现的全部漏洞列表记录在 TROPHIES.md 文件中。