
Contournement non authentifié de l'authentification dans AdGuard Home
< 0.107.73via la mise à niveau HTTP/2 en clair (h2c).
| CVE | CVE-2026-32136 |
| CVSS | 9.8 (Critique) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-287 (Authentification incorrecte) |
| Affecté | AdGuard Home < 0.107.73 (PoC testé sur v0.107.72) |
| Corrigé | v0.107.73 (commit c003e9f9c0) |
| Avis de sécurité | GHSA-5fg6-wrq4-w5gh |
Le serveur HTTP dans internal/home/web.go place le middleware d'authentification à l'extérieur de h2c.NewHandler. Lorsqu'un client envoie une requête HTTP/1.1 avec Upgrade: h2c vers un chemin public (par exemple /login.html), le middleware d'authentification le laisse passer et h2c.NewHandler détourne la connexion TCP pour basculer en HTTP/2. Chaque flux HTTP/2 qui suit sur la connexion mise à niveau est envoyé directement au mux interne — sans jamais passer par le middleware d'authentification. N'importe quel point d'administration /control/* peut alors être atteint sans authentification sur la même socket.
Le correctif déplace le middleware d'authentification à l'intérieur du handler donné à h2c.NewHandler, de sorte que les trames HTTP/2 après une mise à niveau en clair passent par la même vérification d'authentification que les requêtes HTTP/1.1.
curl --http2-prior-knowledge ne déclenche pas le bug — la couche HTTP/1.1 du serveur rejette la préface HTTP/2 brute avec un 401./control/login renvoie aussi 101 Switching Protocols, mais le 404 (point d'accès réservé au POST) sur le flux 1 empoisonne les flux suivants. Utilisez un chemin statique qui renvoie 200 OK (par exemple /login.html).# Kali / Debian / Ubuntu
sudo apt install -y python3-h2
python3 CVE-2026-32136.py <target-ip> [port] [path]
Valeurs par défaut : 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 contient le corps brut de la réponse ; les messages de statut sont écrits sur stderr afin que la sortie soit proprement redirigée vers jq.
Mettez à niveau AdGuard Home vers 0.107.73 ou une version ultérieure.
Cette preuve de concept est publiée à des fins éducatives et de recherche défensive. Ne l'exécutez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test.
| Point d'accès | Renvoie |
|---|
/control/filtering/status | liste de filtres + user_rules |
/control/status | statut du serveur, interfaces d'écoute |
/control/clients | liste des clients DHCP / DNS |
/control/dns_info | serveurs DNS en amont |
/control/querylog | journal des requêtes DNS (contient souvent des noms d'hôtes internes) |