
AdGuard Home
低于 0.107.73版本中存在未经身份验证的认证绕过漏洞,通过 HTTP/2 明文升级(h2c)实现。
| CVE | CVE-2026-32136 |
| CVSS | 9.8(严重) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-287(认证不当) |
| 影响版本 | AdGuard Home < 0.107.73(PoC 测试于 v0.107.72) |
| 修复版本 | v0.107.73(提交 c003e9f9c0) |
| 安全公告 | GHSA-5fg6-wrq4-w5gh |
internal/home/web.go 中的 HTTP 服务器将认证中间件放置在 h2c.NewHandler 外部。当客户端向公共路径(例如 /login.html)发送带有 Upgrade: h2c 的 HTTP/1.1 请求时,认证中间件会放行该请求,然后 h2c.NewHandler 劫持 TCP 连接以切换到 HTTP/2。随后在已升级连接上的每个 HTTP/2 流会直接被分派到内部 mux——而无需经过认证中间件。任何 /control/* 管理端点都可以在同一个套接字上未经认证地访问。
补丁将认证中间件移到了 h2c.NewHandler 所接收的处理器内部,这样明文升级后的 HTTP/2 帧将像 HTTP/1.1 请求一样经过同样的认证检查。
curl --http2-prior-knowledge 不会触发该漏洞——服务器的 HTTP/1.1 层会以 401 拒绝原始的 HTTP/2 前言。/control/login 上升级也会返回 101 Switching Protocols,但流 1 上的 404(仅 POST 端点)会污染后续流。请使用返回 200 OK 的静态路径(例如 /login.html)。# Kali / Debian / Ubuntu
sudo apt install -y python3-h2
python3 CVE-2026-32136.py <目标IP> [端口] [路径]
默认值:port=80,path=/control/filtering/status。
$ python3 CVE-2026-32136.py 192.168.1.5 80 /control/filtering/status | jq .user_rules
[+] h2c 升级成功 — 连接现为 HTTP/2
[+] 响应状态码: 200
[
"||tracking.corp.example^",
"||analytics.internal.example^",
...
]
stdout 是原始响应体;状态信息写入 stderr,以便输出能够干净地通过管道传递给 jq。
升级至 AdGuard Home 0.107.73 或更高版本。
此概念验证代码仅供教育和防御性研究目的发布。请勿对非你所有或未经明确授权测试的系统运行此代码。
| 端点 | 返回内容 |
|---|
/control/filtering/status | 过滤列表 + user_rules |
/control/status | 服务器状态、监听接口 |
/control/clients | DHCP / DNS 客户端列表 |
/control/dns_info | 上游 DNS 服务器 |
/control/querylog | DNS 查询日志(通常包含内部主机名) |