
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 の外側でラップしています。クライアントが Upgrade: h2c を含む HTTP/1.1 リクエストを公開パス (例: /login.html) に送信すると、認証ミドルウェアはそれを通過させ、h2c.NewHandler が TCP 接続をハイジャックして HTTP/2 に切り替えます。アップグレードされた接続上で後続するすべての HTTP/2 ストリームは、認証ミドルウェアを一切経由することなく、内側の mux に直接ディスパッチされます。そのため、同じソケット上で任意の /control/* 管理エンドポイントに認証なしで到達できます。
このパッチは、認証ミドルウェアを h2c.NewHandler に渡されるハンドラーの内側に移動します。これにより、クリアテキストアップグレード後の HTTP/2 フレームは、HTTP/1.1 リクエストと同じ認証チェックを受けます。
curl --http2-prior-knowledge ではこのバグは発生しません — サーバーの HTTP/1.1 レイヤーが生の HTTP/2 プリアンブルを 401 で拒否します。/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 <target-ip> [port] [path]
デフォルト: port=80、path=/control/filtering/status。
$ python3 CVE-2026-32136.py 192.168.1.5 80 /control/filtering/status | jq .user_rules
[+] h2c upgrade successful — connection is now HTTP/2
[+] response status: 200
[
"||tracking.corp.example^",
"||analytics.internal.example^",
...
]
stdout は生のレスポンスボディです。ステータスメッセージは stderr に書き込まれるため、出力を jq にそのままパイプできます。
AdGuard Home 0.107.73 以降にアップグレードしてください。
この概念実証 (PoC) は、教育および防御研究を目的として公開されています。所有していないシステム、または明示的なテスト許可を得ていないシステムに対して実行しないでください。
| エンドポイント | 戻り値 |
|---|
/control/filtering/status | フィルターリスト + user_rules |
/control/status | サーバーステータス、リッスン中のインターフェース |
/control/clients | DHCP / DNS クライアントリスト |
/control/dns_info | アップストリーム DNS サーバー |
/control/querylog | DNS クエリログ (内部ホスト名を含むことが多い) |