
Prova de conceito de exploit para CVE-2026-32136: bypass de autenticação não autenticado no AdGuard Home via upgrade HTTP/2 em texto claro (h2c). Demonstra como alcançar endpoints de administração sem credenciais.
Bypass de autenticação não autenticada no AdGuard Home
< 0.107.73via upgrade HTTP/2 em texto claro (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 (Autenticação Impropria) |
| Afetado | AdGuard Home < 0.107.73 (PoC testado em v0.107.72) |
| Corrigido | v0.107.73 (commit c003e9f9c0) |
| Aviso | GHSA-5fg6-wrq4-w5gh |
O servidor HTTP em internal/home/web.go envolve o middleware de autenticação fora de h2c.NewHandler. Quando um cliente envia uma requisição HTTP/1.1 com Upgrade: h2c para um caminho público (ex.: /login.html), o middleware de autenticação permite a passagem e h2c.NewHandler sequestra a conexão TCP para mudar para HTTP/2. Cada stream HTTP/2 que segue na conexão atualizada é despachada diretamente para o mux interno — sem jamais passar pelo middleware de autenticação. Qualquer endpoint admin /control/* pode então ser acessado sem autenticação no mesmo socket.
A correção move o middleware de autenticação para dentro do handler fornecido a h2c.NewHandler, de modo que os frames HTTP/2 após um upgrade em texto claro enfrentem a mesma verificação de autenticação que as requisições HTTP/1.1.
curl --http2-prior-knowledge não aciona o bug — a camada HTTP/1.1 do servidor rejeita o prefácio HTTP/2 bruto com um 401./control/login também retorna 101 Switching Protocols, mas o 404 (endpoint apenas POST) no stream 1 envenena os streams subsequentes. Use um caminho estático que retorna 200 OK (ex.: /login.html).# Kali / Debian / Ubuntu
sudo apt install -y python3-h2
python3 CVE-2026-32136.py <target-ip> [port] [path]
Padrões: 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 é o corpo da resposta bruta; mensagens de status são escritas para stderr para que a saída seja canalizada limpidamente para jq.
Atualize para AdGuard Home 0.107.73 ou superior.
Esta prova de conceito é publicada para fins educacionais e de pesquisa defensiva. Não execute contra sistemas que você não possui ou para os quais não tem autorização explícita para testar.
| Endpoint | Retorna |
|---|
/control/filtering/status | lista de filtros + user_rules |
/control/status | status do servidor, interfaces de escuta |
/control/clients | lista de clientes DHCP / DNS |
/control/dns_info | servidores DNS upstream |
/control/querylog | log de consultas DNS (geralmente contém nomes de host internos) |