
Detecta de forma segura si un servidor UniFi OS es vulnerable a CVE-2026-34908
Un detector seguro para la cadena de ejecución remota de código sin autenticación en UniFi OS Server ≤ 5.0.6, divulgado en el Boletín de Aviso de Seguridad 064 de Ubiquiti:
| CVE | Clase | Rol en la cadena |
|---|---|---|
| CVE-2026-34908 / CVE-2026-34909 | Control de acceso inadecuado / path traversal | Omisión de la puerta de autenticación (el punto de apoyo) |
| CVE-2026-34910 | Validación de entrada inadecuada → inyección de comandos | RCE sin autenticación alcanzada mediante la omisión |
Corregido en UniFi OS Server 5.0.8.
Sí. El detector está diseñado para uso en producción y evaluaciones:
GET.VULNERABLE requiere tanto que la omisión de autenticación haya alcanzado
el controlador vulnerable como que una solicitud de referencia (mismo endpoint, sin omisión) haya sido correctamente
rechazada con 401.UniFi OS utiliza nginx para servir sus servicios, el cual aplica la autenticación mediante una subconsulta. Esa
comprobación de autenticación trata cualquier solicitud cuya URI cruda comience con /api/auth/validate-sso/ como pública,
pero nginx enruta hacia el backend usando la URI normalizada (descodifica percentualmente %2f→/ y
colapsa ../). Una solicitud como:
GET /api/auth/validate-sso/..%2f..%2f..%2fproxy/users/api/v2/ucs/update/latest_package
es tratada como pública (prefijo crudo) pero enrutada al endpoint interno autenticado de actualización de paquetes
(ruta normalizada). Sin pkg_name, ese endpoint responde
query param pkg_name required — demostrando que la omisión funciona y el controlador vulnerable es
alcanzable.
El detector también envía una solicitud de referencia al mismo endpoint sin la omisión y
requiere que devuelva 401 antes de declarar un host como vulnerable. La comprobación prueba el
comportamiento vulnerable directamente — un veredicto de VULNERABLE significa que la omisión realmente alcanzó el sumidero.
Siempre que la sonda no confirme positivamente VULNERABLE o PARCHADO, el detector obtiene
la página raíz y busca la huella digital del portal de administración de UniFi OS (
<title>UniFi OS</title>, window.UNIFI_OS_MANIFEST, id="portal-root",
id="site-manager_portal-container"). Esto se aplica también a un 401: un host UniFi OS que
aplique autenticación en la omisión es NO CONCLUSIVO, pero un proxy que no sea UniFi y que simplemente devuelva 401
para todo no lleva huella digital y se reporta como NO AFECTADO. Así que cada resultado "no vulnerable"
se fundamenta en la huella digital: marcadores presentes → NO CONCLUSIVO; marcadores
ausentes → NO AFECTADO (la CVE no aplica).
# host único (puerto predeterminado 11443)
./cve_2026_34908_check.py 192.168.1.10
# puerto explícito / formularios URL
./cve_2026_34908_check.py host-a:11443 https://host-b
# escanear una lista, un objetivo por línea (se permiten comentarios '#'), salida compacta
./cve_2026_34908_check.py -f targets.txt --brief
# salida legible por máquina para pipelines
./cve_2026_34908_check.py -f targets.txt --json > results.json
Una consola vulnerable (detallado, el predeterminado). La segunda línea es el detalle del
veredicto; el marcador [!] y VULNERABLE se renderizan en rojo en una 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
Una consola parchada (5.0.8+):
$ ./cve_2026_34908_check.py 192.168.1.11
[+] 192.168.1.11:11443: PARCHADO
nginx rejected the normalized-path divergence (HTTP 400) — 5.0.8+ behavior
Un host UniFi OS confirmado que la sonda no pudo clasificar → NO CONCLUSIVO. La línea de detalle
distingue los dos casos (autenticación aplicada vs. respuesta inesperada):
$ ./cve_2026_34908_check.py 192.168.1.12 192.168.1.13
[?] 192.168.1.12:11443: NO CONCLUSIVO
bypass blocked / auth enforced (HTTP 401) on a confirmed UniFi OS host — not confirmed vulnerable
[?] 192.168.1.13:11443: NO CONCLUSIVO
UniFi OS detected, but probe returned an unexpected response: HTTP 302 text/html
Un host que no es UniFi OS en absoluto → NO AFECTADO (el aviso no aplica):
$ ./cve_2026_34908_check.py 203.0.113.9:443
[-] 203.0.113.9:443: NO AFECTADO
no UniFi OS web fingerprint on / (probe HTTP 404) — target is not a UniFi OS Server
Escanear una lista, una línea alineada por host (--brief). El código de salida es 1 si algún host
es VULNERABLE, si no 0 — útil en scripts:
$ ./cve_2026_34908_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE 192.168.1.10:11443
PARCHADO 192.168.1.11:11443
NO CONCLUSIVO 192.168.1.12:11443
NO AFECTADO 203.0.113.9:443
ERROR 10.0.0.1:11443 timeout
exit: 1
Salida legible por máquina para pipelines (--json). Cada resultado lleva el
verdict más el bypass.state/bypass.detail detrás de él; los resultados ERROR llevan un
campo error en lugar de bypass:
$ ./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": "PARCHADO"
},
{
"target": "10.0.0.1:11443",
"verdict": "ERROR",
"error": "timeout"
}
]
| Código | Significado |
|---|---|
0 | Ningún objetivo devolvió VULNERABLE |
1 | Al menos un objetivo es VULNERABLE |
2 | Error de uso (argumentos incorrectos / archivo de objetivos ilegible) |
NO CONCLUSIVO no es una garantía de seguridad — confirma un host UniFi OS pero no pudo clasificarlo
(autenticación aplicada en la omisión, o una respuesta inesperada). Un host que esté fuertemente filtrado o
detrás de un proxy inesperado puede no ser clasificable solo desde la red. Confirme la
versión en ejecución cuando sea posible.NO AFECTADO significa que la página raíz no llevaba huella digital del portal UniFi OS (incluyendo hosts que
devuelven 401 sin ella). Una consola UniFi OS oculta detrás de un proxy inverso que elimina o reescribe el
HTML del portal podría ser reportada incorrectamente; confirme directamente si se espera que el objetivo sea
UniFi OS.Actualice UniFi OS Server a la versión 5.0.8 o posterior. La corrección añade una comparación de URI cruda vs. normalizada en nginx (cerrando la omisión de autenticación) y validación de entrada en la ruta de actualización de paquetes (cerrando la inyección de comandos).
Este código se distribuye bajo una licencia MIT.
El uso de esta herramienta para atacar objetivos sin consentimiento mutuo previo es ilegal. Es responsabilidad del usuario final cumplir con todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no son responsables por cualquier uso indebido o daño causado por este programa.
| Respuesta de la sonda | Veredicto |
|---|
200 + marcadores de error del controlador | VULNERABLE |
400 (nginx rechaza la divergencia) | PARCHADO (5.0.8+) |
401, huella digital de UniFi OS presente | NO CONCLUSIVO (autenticación aplicada / omisión bloqueada) |
401, sin huella digital de UniFi OS | NO AFECTADO (no es un UniFi OS Server) |
| cualquier otra cosa, sin huella digital de UniFi OS | NO AFECTADO (no es un UniFi OS Server) |
| cualquier otra cosa, huella digital de UniFi OS presente | NO CONCLUSIVO (respuesta inesperada) |
| Indicador | Descripción |
|---|
targets | Uno o más host, host:port, o https://host:port |
-f, --targets-file ARCHIVO | Leer objetivos desde un archivo (uno por línea; comentarios #) |
--brief | Una sola línea alineada por objetivo — ideal para escanear muchos hosts |
--json | Emitir resultados JSON estructurados |
--timeout SEGS | Tiempo de espera por solicitud (predeterminado: 10) |
--no-color | Deshabilitar salida coloreada (también respeta NO_COLOR y no TTY) |
| Veredicto | Significado |
|---|
VULNERABLE | La omisión de autenticación alcanzó el controlador vulnerable sin autenticación. Aplique el parche a 5.0.8+. |
PARCHADO | nginx rechazó la divergencia de ruta normalizada (comportamiento de 5.0.8+). |
NO AFECTADO | No hay huella digital del portal UniFi OS en la página raíz — el objetivo no es un UniFi OS Server, por lo que el aviso no aplica. Incluye hosts que devuelven 401 sin la huella digital (por ejemplo, un proxy no relacionado que rechaza todo). |
NO CONCLUSIVO | Host UniFi OS confirmado que no pudo clasificarse — verifique la versión manualmente. La línea de detalle del veredicto indica el caso: (a) la omisión fue bloqueada/autenticación aplicada (401), o (b) la sonda devolvió una respuesta inesperada. |
ERROR | Falla de conexión/timeout/TLS. |