
Неаутентифицированный обход аутентификации в 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 |
HTTP-сервер в internal/home/web.go оборачивает auth-middleware снаружи h2c.NewHandler. Когда клиент отправляет HTTP/1.1-запрос с Upgrade: h2c на публичный путь (например, /login.html), auth-middleware пропускает его, а h2c.NewHandler перехватывает TCP-соединение для переключения на HTTP/2. Каждый HTTP/2-поток, идущий затем по переключённому соединению, направляется напрямую во внутренний mux — минуя auth-middleware. Любая административная конечная точка /control/* становится доступной без аутентификации на том же сокете.
Патч перемещает auth-middleware внутрь обработчика, передаваемого в h2c.NewHandler, поэтому HTTP/2-кадры после апгрейда с незашифрованного соединения проходят ту же проверку аутентификации, что и HTTP/1.1-запросы.
curl --http2-prior-knowledge не вызывает баг — HTTP/1.1-слой сервера отклоняет сырую HTTP/2-преамбулу с 401./control/login тоже возвращает 101 Switching Protocols, но 404 (эндпоинт только для POST) на потоке 1 отравляет последующие потоки. Используйте статический путь, который возвращает 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 или новее.
Данный proof-of-concept опубликован в образовательных целях и для защитных исследований. Не запускайте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
| Endpoint | Возвращает |
|---|
/control/filtering/status | список фильтров + user_rules |
/control/status | статус сервера, прослушиваемые интерфейсы |
/control/clients | список DHCP / DNS-клиентов |
/control/dns_info | вышестоящие DNS-серверы |
/control/querylog | журнал DNS-запросов (часто содержит внутренние имена хостов) |