
Bypass dell'autenticazione non autenticato in AdGuard Home
< 0.107.73tramite upgrade HTTP/2 in chiaro (h2c).
| CVE | CVE-2026-32136 |
| CVSS | 9.8 (Critical) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-287 (Improper Authentication) |
| Versioni interessate | AdGuard Home < 0.107.73 (PoC testato su v0.107.72) |
| Correzione | v0.107.73 (commit c003e9f9c0) |
| Avviso | GHSA-5fg6-wrq4-w5gh |
Il server HTTP in internal/home/web.go avvolge il middleware di autenticazione all'esterno di h2c.NewHandler. Quando un client invia una richiesta HTTP/1.1 con Upgrade: h2c a un percorso pubblico (ad es. /login.html), il middleware di autenticazione la lascia passare e h2c.NewHandler dirotta la connessione TCP per passare a HTTP/2. Ogni stream HTTP/2 che segue sulla connessione aggiornata viene inviato direttamente al mux interno — senza passare mai attraverso il middleware di autenticazione. Qualsiasi endpoint amministrativo /control/* può quindi essere raggiunto senza autenticazione sulla stessa socket.
La patch sposta il middleware di autenticazione all'interno dell'handler passato a h2c.NewHandler, così i frame HTTP/2 successivi a un upgrade in chiaro incontrano lo stesso controllo di autenticazione delle richieste HTTP/1.1.
curl --http2-prior-knowledge non innesca il bug — il livello HTTP/1.1 del server rifiuta la prefazione HTTP/2 grezza con un 401./control/login restituisce anch'esso 101 Switching Protocols, ma il 404 (endpoint solo POST) sullo stream 1 avvelena gli stream successivi. Usa un percorso statico che restituisce 200 OK (ad es. /login.html).# Kali / Debian / Ubuntu
sudo apt install -y python3-h2
python3 CVE-2026-32136.py <target-ip> [port] [path]
Valori predefiniti: 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 è il corpo della risposta grezzo; i messaggi di stato vengono scritti su stderr in modo che l'output si possa reindirizzare correttamente a jq.
Aggiorna AdGuard Home a 0.107.73 o versioni successive.
Questa prova di concetto è pubblicata a scopo educativo e di ricerca difensiva. Non eseguirla contro sistemi che non possiedi o per cui non hai un'autorizzazione esplicita al test.
| Endpoint | Restituisce |
|---|
/control/filtering/status | elenco filtri + user_rules |
/control/status | stato del server, interfacce in ascolto |
/control/clients | elenco client DHCP / DNS |
/control/dns_info | server DNS upstream |
/control/querylog | log delle query DNS (spesso contiene hostname interni) |