
Rileva in modo sicuro se un controller UniFi Network Application è vulnerabile a CVE-2026-22557
Rileva in modo sicuro se un controller UniFi Network Application è vulnerabile a CVE-2026-22557 senza causare alcuna interruzione. Vedi l'analisi completa sul blog di Bishop Fox.
CVE-2026-22557 è una vulnerabilità di path-traversal non autenticata nel portale captive guest dell'UniFi Network Application che consente a un attaccante remoto di leggere file arbitrari come l'utente del processo del controller (CVSS 10.0). La vulnerabilità colpisce UniFi Network Application 10.1.85 e precedenti sul ramo 10.1.x, e le corrispondenti versioni precedenti sui rami 10.2.x e 9.0.x. Ubiquiti ha rilasciato correzioni in 10.1.89, 10.2.97 e 9.0.118 (SAB-062).
Il renderer della pagina di errore del portale guest legge il parametro di richiesta page_error e lo usa letteralmente come percorso relativo sul loader delle risorse del portale, senza alcuna validazione. Quando portal_customized: true è impostato sul sito interrogato (la configurazione che qualsiasi portale captive brandizzato, come un hotel, un negozio o un bar, assume), il loader risolve quel percorso rispetto alla directory del portale su disco, e il percorso può uscirne.
Questo strumento esegue test di vulnerabilità non distruttivi:
/status e confrontandola con le linee di correzione SAB-062page_error su /guest/<site>/wechat/sign con profondità ../ da 1 a 8 rispetto a un nome di file a doppio ramo, per determinare se il traversal si attivafirmware.json) per determinare se il ramo del filesystem del portale personalizzato è attivoLo strumento richiede solo il file di catalogo runtime come oracolo per determinare se il ramo è attivo. Non legge credenziali, materiale TLS, stato del database o backup, e non scrive alcun contenuto di file su stdout o su disco. Viene stampato solo il verdetto.
portal_customized: true sul sito interrogato restituiscono il file di catalogo alla profondità calibrata, confermando VULNERABLE.portal_customized: false sul sito interrogato attivano il traversal nella fase di calibrazione ma non restituiscono contenuto su disco nella fase di conferma → PARTIALLY EXPOSED. Il binario dell'applicazione è ancora vulnerabile; è necessaria una patch anche se questo sito non è nello stato sfruttabile.git clone https://github.com/BishopFox/CVE-2026-22557-check
cd CVE-2026-22557-check
È richiesto Python 3.9+. Lo strumento utilizza solo la libreria standard di Python, quindi non è necessario alcun passo di pip install.
Testa un controller UniFi Network Application all'<TARGET>. Punta lo strumento a qualsiasi URL raggiunga l'interfaccia web del controller; il gestore vulnerabile è inviato sulla porta admin (predefinita 8443/TCP) così come sulle porte dedicate del portale guest (8843, 8880).
python3 cve_2026_22557_check.py <BASE_URL> [--site NAME]
Lo slug predefinito del sito è default. Le distribuzioni UniFi con più siti configurati dovrebbero eseguire nuovamente lo strumento con --site <nome> per ciascuno. Un controller è sfruttabile non appena qualsiasi dei suoi siti ha portal_customized: true.
Gli esempi seguenti usano --brief per un risultato di una riga per host. Esegui senza --brief per ottenere il banner completo, il progresso passo-passo e un blocco di risultato che include le azioni di remediation consigliate.
Il controller è su una build vulnerabile e la precondizione del portale personalizzato è attiva per il sito interrogato, quindi il percorso di lettura non autenticato è raggiungibile.
$ python3 cve_2026_22557_check.py https://192.168.1.100:8443 --brief
[VULNERABLE] https://192.168.1.100:8443 site=default
Il controller è su una build vulnerabile, ma il sito interrogato non ha portal_customized: true abilitato, quindi la precondizione di lettura su disco non è soddisfatta per questo sito. Il binario dell'applicazione deve comunque essere patchato; un altro sito sullo stesso controller potrebbe ancora essere nello stato sfruttabile.
$ python3 cve_2026_22557_check.py https://192.168.1.100:8443 --brief
[PARTIAL] https://192.168.1.100:8443 site=default
Il controller è su una build corretta (10.1.89, 10.2.97, 9.0.118 o successive), quindi il traversal non si attiva su nessuna profondità interrogata.
$ python3 cve_2026_22557_check.py https://192.168.1.200:8443 --brief
[NOT VULNERABLE] https://192.168.1.200:8443 site=default
--site NAME UniFi site slug to probe (default: "default")
--max-depth N maximum ../ traversal depth to try (default: 8)
--no-tls-recon skip TLS certificate subject/SAN display
--no-color disable ANSI color output (also honored: NO_COLOR env var)
--timeout N per-request timeout in seconds (default: 20)
--brief print a single-line result, no banner or steps
Codici di uscita: 0 VULNERABLE, 1 parzialmente esposto / non vulnerabile / non esposto, 2 errore di trasporto.
Lo strumento può restituire un verdetto VULNERABLE solo se sono soddisfatte le seguenti condizioni:
/guest/* è inviato sulla porta admin (8443) così come sulle porte dedicate del portale guest (8843, 8880); lo strumento interroga solo l'URL che gli viene dato.portal_customized: true nella sua impostazione guest_access, che è la precondizione per il percorso di codice di lettura su disco. Un controller con più siti è sfruttabile se qualsiasi dei suoi siti ha questa impostazione abilitata.Se una qualsiasi condizione non è soddisfatta, lo strumento passa a un verdetto più conservativo. Un risultato PARTIALLY EXPOSED significa comunque che l'applicazione è vulnerabile e deve essere patchata; il sito interrogato semplicemente non espone il percorso di lettura su disco.
Il pattern di richiesta vulnerabile è:
GET /guest/s/<site>/wechat/sign?page_error=<value>
I client legittimi raggiungono /guest/s/<site>/wechat/sign solo tramite POST (che il dispatcher accetta senza attivare il renderer della pagina di errore). Qualsiasi GET di questo endpoint con un parametro query page_error=, in particolare che contenga ../, %2e%2e o un / iniziale, è anomalo e deve essere trattato come un tentativo di sfruttamento. Il log di accesso standard di Tomcat cattura la riga di richiesta completa inclusa la stringa di query.
Questo codice è distribuito sotto una licenza MIT.
L'utilizzo di questo strumento per attaccare target senza consenso reciproco preventivo è illegale. È responsabilità dell'utente finale rispettare tutte le leggi locali, statali e federali applicabili. Gli sviluppatori non si assumono alcuna responsabilità e non sono responsabili per qualsiasi uso improprio o danno causato da questo programma.