
Nicht authentifizierter Authentifizierungs-Bypass in AdGuard Home
< 0.107.73über ein HTTP/2-Klartext-(h2c)-Upgrade.
| CVE | CVE-2026-32136 |
| CVSS | 9.8 (Kritisch) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-287 (Fehlerhafte Authentifizierung) |
| Betroffen | AdGuard Home < 0.107.73 (PoC getestet mit v0.107.72) |
| Behoben | v0.107.73 (commit c003e9f9c0) |
| Sicherheitshinweis | GHSA-5fg6-wrq4-w5gh |
Der HTTP-Server in internal/home/web.go umschließt die Auth-Middleware außerhalb von h2c.NewHandler. Wenn ein Client eine HTTP/1.1-Anfrage mit Upgrade: h2c an einen öffentlichen Pfad sendet (z. B. /login.html), lässt die Auth-Middleware sie durch, und h2c.NewHandler übernimmt die TCP-Verbindung, um auf HTTP/2 zu wechseln. Jeder HTTP/2-Stream, der nach dem Upgrade auf der Verbindung folgt, wird direkt an den inneren Mux weitergeleitet — ohne jemals die Auth-Middleware zu durchlaufen. Jeder /control/*-Admin-Endpunkt kann dann ohne Authentifizierung über denselben Socket erreicht werden.
Der Patch platziert die Auth-Middleware innerhalb des an h2c.NewHandler übergebenen Handlers, sodass HTTP/2-Frames nach einem Klartext-Upgrade dieselbe Auth-Prüfung durchlaufen wie HTTP/1.1-Anfragen.
curl --http2-prior-knowledge löst den Fehler nicht aus — die HTTP/1.1-Ebene des Servers lehnt die rohe HTTP/2-Präambel mit einem 401 ab./control/login gibt ebenfalls 101 Switching Protocols zurück, aber die 404-Antwort (Nur-POST-Endpunkt) auf Stream 1 vergiftet nachfolgende Streams. Verwende einen statischen Pfad, der 200 OK zurückgibt (z. B. /login.html).# Kali / Debian / Ubuntu
sudo apt install -y python3-h2
python3 CVE-2026-32136.py <target-ip> [port] [path]
Standardwerte: 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 ist der rohe Antworttext; Statusmeldungen werden nach stderr geschrieben, damit die Ausgabe sauber in jq weitergeleitet werden kann.
Aktualisiere auf AdGuard Home 0.107.73 oder neuer.
Dieser Proof-of-Concept wird zu Bildungs- und Abwehrforschungszwecken veröffentlicht. Führen Sie ihn nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Genehmigung zum Testen haben.
| Endpunkt | Rückgabe |
|---|
/control/filtering/status | Filterliste + user_rules |
/control/status | Serverstatus, lauschende Schnittstellen |
/control/clients | DHCP-/DNS-Clientliste |
/control/dns_info | Upstream-DNS-Server |
/control/querylog | DNS-Abfrageprotokoll (enthält oft interne Hostnamen) |