
UniFi OS Server가 CVE-2026-34908에 취약한지 안전하게 탐지
UniFi OS Server ≤ 5.0.6의 인증되지 않은 원격 코드 실행 체인을 위한 안전한 탐지기입니다. Ubiquiti 보안 권고 게시판 064에서 공개되었습니다.
| CVE | 클래스 | 체인에서의 역할 |
|---|---|---|
| CVE-2026-34908 / CVE-2026-34909 | 부적절한 접근 제어 / 경로 탐색 | 인증 게이트웨이 우회 (발판) |
| CVE-2026-34910 | 부적절한 입력 검증 → 명령 주입 | 우회를 통해 도달하는 인증되지 않은 RCE |
UniFi OS Server 5.0.8에서 수정됨.
예. 이 탐지기는 프로덕션 및 평가 용도로 설계되었습니다:
GET입니다.취약함 판정은 인증 우회가 취약한 핸들러에 도달했고, 기준 요청(동일 엔드포인트, 우회 없음)이 올바르게 401로 거부된 경우에만 발생합니다.UniFi OS는 서비스를 nginx로 프론트하며, nginx는 하위 요청을 통해 인증을 강제합니다. 이 인증 검사는 원시 URI가 /api/auth/validate-sso/로 시작하는 모든 요청을 공개로 처리하지만, nginx는 정규화된 URI(퍼센트 디코딩 %2f→/ 및 ../ 축소)를 사용하여 백엔드로 라우팅합니다. 다음과 같은 요청:
GET /api/auth/validate-sso/..%2f..%2f..%2fproxy/users/api/v2/ucs/update/latest_package
따라서 공개(원시 접두사)로 처리되지만 인증된 내부 패키지 업데이트 엔드포인트(정규화된 경로)로 라우팅됩니다. pkg_name이 없으면 해당 엔드포인트는 query param pkg_name required로 응답합니다. 이는 우회가 작동하고 취약한 핸들러에 접근 가능함을 증명합니다.
탐지기는 또한 우회 없이 동일한 엔드포인트로 기준 요청을 보내고, 호스트를 취약하다고 선언하기 전에 401을 반환해야 합니다. 이 검사는 취약한 동작을 직접 테스트합니다. 취약함 판정은 우회가 실제로 싱크에 도달했음을 의미합니다.
프로브가 취약함 또는 패치됨을 긍정적으로 확인하지 못할 때마다 탐지기는 루트 페이지를 가져와 UniFi OS 관리 포털 지문(<title>UniFi OS</title>, window.UNIFI_OS_MANIFEST, id="portal-root", id="site-manager_portal-container")을 찾습니다. 이는 401에도 적용됩니다: 우회에 인증을 강제하는 UniFi OS 호스트는 결론 없음이지만, 단순히 모든 것을 401로 응답하는 비UniFi 프록시는 지문이 없으므로 영향 없음으로 보고됩니다. 따라서 모든 "취약하지 않음" 결과는 지문에 근거합니다: 표시 존재 → 결론 없음; 표시 없음 → 영향 없음 (CVE가 적용되지 않음).
# single host (default port 11443)
./cve_2026_34908_check.py 192.168.1.10
# explicit port / URL forms
./cve_2026_34908_check.py host-a:11443 https://host-b
# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_34908_check.py -f targets.txt --brief
# machine-readable output for pipelines
./cve_2026_34908_check.py -f targets.txt --json > results.json
취약한 콘솔 (자세한 출력, 기본값). 두 번째 줄은 판정 세부 정보입니다. [!] 마커와 취약함은 TTY에서 빨간색으로 표시됩니다:
$ ./cve_2026_34908_check.py 192.168.1.10
[!] 192.168.1.10:11443: VULNERABLE
auth bypass reached the vulnerable handler (no command executed); baseline correctly 401
패치된 콘솔 (5.0.8+):
$ ./cve_2026_34908_check.py 192.168.1.11
[+] 192.168.1.11:11443: PATCHED
nginx rejected the normalized-path divergence (HTTP 400) — 5.0.8+ behavior
탐지기가 분류할 수 없는 확인된 UniFi OS 호스트 → 결론 없음. 세부 정보 줄이 두 가지 경우(인증 강제 vs. 예상치 못한 응답)를 구분합니다:
$ ./cve_2026_34908_check.py 192.168.1.12 192.168.1.13
[?] 192.168.1.12:11443: INCONCLUSIVE
bypass blocked / auth enforced (HTTP 401) on a confirmed UniFi OS host — not confirmed vulnerable
[?] 192.168.1.13:11443: INCONCLUSIVE
UniFi OS detected, but probe returned an unexpected response: HTTP 302 text/html
전혀 UniFi OS가 아닌 호스트 → 영향 없음 (권고가 적용되지 않음):
$ ./cve_2026_34908_check.py 203.0.113.9:443
[-] 203.0.113.9:443: UNAFFECTED
no UniFi OS web fingerprint on / (probe HTTP 404) — target is not a UniFi OS Server
목록 스캔, 호스트당 정렬된 한 줄 (--brief). 종료 상태는 취약함 호스트가 있으면 1, 없으면 0입니다 — 스크립트에 편리:
$ ./cve_2026_34908_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE 192.168.1.10:11443
PATCHED 192.168.1.11:11443
INCONCLUSIVE 192.168.1.12:11443
UNAFFECTED 203.0.113.9:443
ERROR 10.0.0.1:11443 timeout
exit: 1
파이프라인용 기계 판독 가능 출력 (--json). 각 결과는 verdict와 그 뒤의 bypass.state/bypass.detail을 포함합니다. ERROR 결과는 bypass 대신 error 필드를 포함합니다:
$ ./cve_2026_34908_check.py 192.168.1.10 192.168.1.11 10.0.0.1 --json
[
{
"target": "192.168.1.10:11443",
"bypass": {
"state": "vulnerable",
"detail": "auth bypass reached the vulnerable handler (no command executed); baseline correctly 401"
},
"verdict": "VULNERABLE"
},
{
"target": "192.168.1.11:11443",
"bypass": {
"state": "patched",
"detail": "nginx rejected the normalized-path divergence (HTTP 400) — 5.0.8+ behavior"
},
"verdict": "PATCHED"
},
{
"target": "10.0.0.1:11443",
"verdict": "ERROR",
"error": "timeout"
}
]
| 코드 | 의미 |
|---|---|
0 | 취약함을 반환한 대상 없음 |
1 | 최소 하나의 대상이 취약함 |
2 | 사용법 오류 (잘못된 인수 / 읽을 수 없는 대상 파일) |
결론 없음은 안전을 보장하지 않습니다 — UniFi OS 호스트를 확인했지만 분류할 수 없습니다(우회에 인증 강제 또는 예상치 못한 응답). 필터링이 심하거나 예상치 못한 프록시가 앞에 있는 호스트는 네트워크만으로 분류할 수 없을 수 있습니다. 가능한 경우 실행 중인 버전을 확인하십시오.영향 없음은 루트 페이지에 UniFi OS 포털 지문이 없음을 의미합니다(지문 없이 401을 반환하는 호스트 포함). 포털 HTML을 제거하거나 다시 작성하는 리버스 프록시 뒤에 숨겨진 UniFi OS 콘솔은 잘못 보고될 수 있습니다. 대상이 UniFi OS로 예상되는 경우 직접 확인하십시오.UniFi OS Server를 버전 5.0.8 이상으로 업데이트하십시오. 수정 사항은 nginx 원시 대 정규화 URI 비교(인증 우회 차단) 및 패키지 업데이트 경로의 입력 검증(명령 주입 차단)을 추가합니다.
이 코드는 MIT 라이선스 하에 배포됩니다.
사전 상호 동의 없이 대상을 공격하기 위해 이 도구를 사용하는 것은 불법입니다. 모든 해당 지역, 주 및 연방 법률을 준수하는 것은 최종 사용자의 책임입니다. 개발자는 어떠한 책임도 지지 않으며 이 프로그램으로 인한 오용 또는 손해에 대해 책임을 지지 않습니다.
| 프로브 응답 | 판정 |
|---|
200 + 핸들러 오류 표시 | 취약함 |
400 (nginx가 차이를 거부) | 패치됨 (5.0.8+) |
401, UniFi OS 지문 존재 | 결론 없음 (인증 강제 / 우회 차단됨) |
401, UniFi OS 지문 없음 | 영향 없음 (UniFi OS Server가 아님) |
| 기타, UniFi OS 지문 없음 | 영향 없음 (UniFi OS Server가 아님) |
| 기타, UniFi OS 지문 있음 | 결론 없음 (예상치 못한 응답) |
| 플래그 | 설명 |
|---|
targets | 하나 이상의 host, host:port 또는 https://host:port |
-f, --targets-file FILE | 파일에서 대상 읽기 (한 줄에 하나; # 주석) |
--brief | 대상당 정렬된 한 줄 — 많은 호스트 스캔에 이상적 |
--json | 구조화된 JSON 결과 출력 |
--timeout SECS | 요청당 제한 시간 (기본값: 10) |
--no-color | 색상 출력 비활성화 (NO_COLOR 및 비-TTY도 인식) |
| 판정 | 의미 |
|---|
취약함 | 인증 우회가 인증 없이 취약한 핸들러에 도달했습니다. 5.0.8+로 패치하세요. |
패치됨 | nginx가 정규화된 경로 차이를 거부했습니다 (5.0.8+ 동작). |
영향 없음 | 루트 페이지에 UniFi OS 포털 지문이 없음 — 대상이 UniFi OS Server가 아니므로 권고가 적용되지 않습니다. 지문 없이 401을 반환하는 호스트(예: 모든 것을 거부하는 관련 없는 프록시)를 포함합니다. |
결론 없음 | 분류할 수 없는 확인된 UniFi OS 호스트 — 버전을 수동으로 확인하십시오. 판정 세부 정보 줄이 어떤 경우인지 알려줍니다: (a) 우회가 차단됨 / 인증 강제 (401), 또는 (b) 프로브가 예상치 못한 응답을 반환함. |
오류 | 연결/시간 초과/TLS 실패. |