
CVE-2026-32136에 대한 개념 증명 익스플로잇: HTTP/2 cleartext (h2c) 업그레이드를 통한 AdGuard Home의 인증되지 않은 인증 우회. 자격 증명 없이 관리자 엔드포인트에 접근하는 방법을 보여줍니다.
AdGuard Home
< 0.107.73에서 HTTP/2 클리어텍스트(h2c) 업그레이드를 통한 인증되지 않은 인증 우회
| CVE | CVE-2026-32136 |
| CVSS | 9.8 (심각) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-287 (부적절한 인증) |
| 영향 | AdGuard Home < 0.107.73 (PoC는 v0.107.72에서 테스트됨) |
| 패치됨 | v0.107.73 (커밋 c003e9f9c0) |
| 권고 | GHSA-5fg6-wrq4-w5gh |
internal/home/web.go의 HTTP 서버는 인증 미들웨어를 h2c.NewHandler 외부에 래핑합니다. 클라이언트가 공개 경로(예: /login.html)에 Upgrade: h2c가 포함된 HTTP/1.1 요청을 보내면 인증 미들웨어가 이를 통과시키고 h2c.NewHandler가 TCP 연결을 하이재킹하여 HTTP/2로 전환합니다. 업그레이드된 연결에서 뒤따르는 모든 HTTP/2 스트림은 인증 미들웨어를 전혀 통과하지 않고 내부 mux로 직접 전달됩니다. 따라서 동일한 소켓에서 인증 없이 모든 /control/* 관리 엔드포인트에 접근할 수 있습니다.
패치는 인증 미들웨어를 h2c.NewHandler에 전달되는 핸들러 내부로 이동시켜, 클리어텍스트 업그레이드 이후의 HTTP/2 프레임이 HTTP/1.1 요청과 동일한 인증 검사를 받도록 합니다.
curl --http2-prior-knowledge는 하지 않습니다 버그를 트리거하지 않습니다. 서버의 HTTP/1.1 계층이 원시 HTTP/2 프리페이스를 401로 거부합니다./control/login에서 업그레이드하면 101 Switching Protocols도 반환되지만, 스트림 1에서 404(POST 전용 엔드포인트)가 이후 스트림을 오염시킵니다. 200 OK를 반환하는 정적 경로(예: /login.html)를 사용하세요.# Kali / Debian / Ubuntu
sudo apt install -y python3-h2
python3 CVE-2026-32136.py <target-ip> [port] [path]
기본값: port=80, path=/control/filtering/status.
$ python3 CVE-2026-32136.py 192.168.1.5 80 /control/filtering/status | jq .user_rules
[+] h2c 업그레이드 성공 — 연결이 이제 HTTP/2입니다
[+] 응답 상태: 200
[
"||tracking.corp.example^",
"||analytics.internal.example^",
...
]
stdout은 원시 응답 본문입니다. 상태 메시지는 stderr로 출력되므로 출력이 jq로 깔끔하게 파이프됩니다.
AdGuard Home 0.107.73 이상으로 업그레이드하세요.
이 개념 증명은 교육 및 방어 연구 목적으로 게시되었습니다. 소유하지 않거나 명시적 테스트 권한이 없는 시스템에 대해 실행하지 마십시오.
| 엔드포인트 | 반환 |
|---|
/control/filtering/status | 필터 목록 + user_rules |
/control/status | 서버 상태, 수신 인터페이스 |
/control/clients | DHCP / DNS 클라이언트 목록 |
/control/dns_info | 업스트림 DNS 서버 |
/control/querylog | DNS 쿼리 로그 (종종 내부 호스트명 포함) |