Red Hot Cyber
Sicurezza Informatica, Notizie su Cybercrime, Analisi Vulnerabilità e Intelligenza Artificiale
Logo di hackerhood, il gruppo di hacker etici di red hot cyber

HackerHood scopre un nuovo bug su UaniaOS: da un tool di cattura pacchetti a una shell da root

24 Settembre 2026 09:56
In sintesi

Una vulnerabilità di UaniaOS trasformava un semplice accesso alla GUI di UaniaBOX in un possibile controllo completo del dispositivo. Un ricercatore di HackerHood ha scoperto una catena che, sfruttando UBUS e permessi ACL eccessivi, consentiva di leggere e scrivere file di sistema fino a eseguire comandi con privilegi root.

Molti apparati di rete moderni scelgono di affidare l’intera amministrazione a un’interfaccia web, senza lasciare all’operatore alcun accesso a shell: una scelta comune, pensata per semplificare la gestione e ridurre la superficie esposta.

Ma quando quell’interfaccia diventa l’unico punto di accesso al sistema, la sua robustezza finisce per coincidere con la sicurezza dell’intero dispositivo, come dimostra il caso di UaniaOS.

Alessandro Sgreccia, ricercatore di sicurezza noto come rainpwn e appartenente al team di HackerHood, si è imbattuto in una UaniaBOX, apparato SD-WAN prodotto da UANIA per l’aggregazione di banda su più connessioni WAN (fino a tre), durante una valutazione tecnica in vista di una possibile adozione presso alcuni clienti. Prima di lasciar passare il dispositivo verso la produzione, ha deciso di metterlo alla prova.

Advertising

Il risultato è una catena che parte da una funzionalità apparentemente innocua, la cattura di pacchetti di rete tramite tcpdump, e arriva, passando per un endpoint interno mal protetto, fino all’esecuzione di comandi come root, su un dispositivo che per design non avrebbe dovuto concedere altro che una sessione web autenticata.

Nessuna shell, solo una GUI

UaniaOS espone un’interfaccia di amministrazione web raggiungibile su /cgi-bin/luci (porta 65080), che ricorda immediatamente LuCI, l’interfaccia grafica di OpenWrt. Con le credenziali fornite dal vendor, l’accesso alla dashboard è stato immediato: modello del dispositivo, uptime e lease DHCP attivi.

La schermata di login di UaniaOS 3.0 stable, con l’utente admin già inserito.

La dashboard di UaniaBox dopo il login: modello, uptime e lease DHCP attivi.

Il tentativo di accedere via SSH con lo stesso account amministrativo, invece, è stato respinto:

Advertising
rainpwn@0xdeadspace:~$ ssh [email protected]
([email protected]) Password:
([email protected]) Password: # Rejected

L’appliance è quindi amministrata esclusivamente tramite GUI web, senza alcuna shell a disposizione dell’operatore. Ed è proprio questo vincolo il motivo per cui l’analisi è proseguita. Se non si può ottenere una shell dalla porta principale, occorre trovare una funzionalità della GUI che esegua comandi per conto dell’utente.

Tra le voci di menu, una in particolare ha attirato l’attenzione: Servizi → Packet Capture, una pagina che consente di configurare ed eseguire una cattura di traffico con tcpdump, con parametri come filtro, durata, numero di pacchetti, risoluzione DNS e verbosità.

La pagina Packet Capture, con i campi filtro, durata, numero di pacchetti e le opzioni di risoluzione domini e verbose.

Il campo filtro è blindato

Osservando le richieste generate dalla pagina, sono emersi due elementi chiave: il frontend dialoga con un endpoint JSON-RPC su /ubus/, e questo endpoint viene interrogato anche solo per verificare l’esistenza di file sul filesystem (ad esempio il file PID di tcpdump o il .pcap prodotto dalla cattura).

Il campo più promettente sembrava il filtro passato a tcpdump, inoltrato tramite una chiamata a /usr/libexec/packet_capture_start. Ogni tentativo di command injection su questo campo, però, è stato respinto lato server con un errore di validazione (“Il filtro inserito non risulta corretto”). Un campo gestito correttamente.

Il CGI di download nasconde un path traversal

Il download del file .pcap catturato avviene tramite una richiesta a /cgi-bin/cgi-download, che accetta un parametro path indicante il file da restituire:

sessionid=AUTH_TOKEN&path=%2Ftmp%2Fcapture.pcap&filename=...&mimetype=application%2Fvnd.tcpdump.pcap

Sostituendo il valore di path con /etc/passwd, il CGI ha restituito il contenuto del file senza alcun controllo:

root:x:0:0:root:/root:/bin/ash
daemon:*:1:1:daemon:/var:/bin/false
...

Una lettura di file arbitraria, ottenuta modificando un solo parametro. Il meccanismo non è però completamente privo di controlli. Richiedere /etc/shadow produce un rifiuto esplicito (“Access to path denied by ACL”), segno della presenza di una lista di controllo accessi (ACL) sottostante.

Sotto il cofano: OpenWrt e UBUS

Le chiamate osservate su /ubus/ seguivano tutte lo stesso schema: protocollo JSON-RPC 2.0, oggetto file, metodi come stat, e un parametro path.

Una ricerca su questo pattern ha condotto rapidamente alla documentazione di UBUS, il bus di messaggistica interno di OpenWrt che i vari demoni e moduli del sistema usano per comunicare tra loro, esposto via HTTP tramite rpcd e tipicamente affiancato da LuCI.

In questo link è possiible accedere alla documentazione tecnica https://openwrt.org/docs/techref/ubus e verificare le chiamate read e write usate per exploit.

Il riferimento costante nel percorso delle richieste a /cgi-bin/luci/admin/services/packet_capture ha confermato il quadro che UaniaBOX, sotto la sua interfaccia proprietaria, è un dispositivo OpenWrt.

In OpenWrt le ACL governano l’accesso alle chiamate UBUS esposte dai vari moduli di sistema: un utente autenticato riceve un token di sessione legato a uno specifico insieme di permessi (scope), e ogni chiamata viene confrontata con quello scope. È esattamente questo meccanismo ad aver bloccato la lettura di /etc/shadow.

La domanda successiva, a questo punto, era: cosa consentono davvero queste ACL?

Dalla lettura alla scrittura: enumerazione via UBUS

Partendo dalla chiamata file stat già osservata nel traffico legittimo della pagina, sostituendo il metodo con file read è stato possibile leggere /etc/passwd direttamente via UBUS, senza passare dal CGI di download:

[{
  "jsonrpc":"2.0","id":1167,"method":"call",
  "params":["AUTH_TOKEN","file","read",{"path":"/etc/passwd"}]
}]

Anche il metodo list ha funzionato senza restrizioni, restituendo il contenuto completo di directory come /etc/, con nome, dimensione, permessi, UID e GID di ogni voce.

Per velocizzare l’enumerazione manuale, il ricercatore ha scritto un piccolo script Python, battezzato scherzosamente Goofy Shell, capace di tradurre comandi minimali (ls, cat, cd, pwd) nelle corrispondenti chiamate JSON-RPC verso l’endpoint UBUS. Non una vera shell, ma abbastanza per rendere sostenibile e veloce l’esplorazione del filesystem, senza dover costantemente giocare con i payload.

La scrittura arbitraria e il file che si autoesegue come root

Se la lettura funzionava, restava da capire fin dove si potesse spingere la scrittura. Dopo diversi tentativi bloccati dalle ACL, un percorso si è rivelato scrivibile: /etc/firewall.user.

Chiunque abbia familiarità con OpenWrt sa cosa significa: si tratta di uno script di shell eseguito automaticamente ad ogni (ri)avvio del firewall, con privilegi di root, proprio per permettere agli amministratori di aggiungere regole iptables personalizzate.

Il payload consiste in una singola chiamata file write che aggiunge un comando in coda al file, preservando i commenti originali per non destare sospetti:

{
  "jsonrpc":"2.0","id":0,"method":"call",
  "params":["AUTH_TOKEN","file","write",{
    "path":"/etc/firewall.user",
    "data":"# ...commenti originali...\nid > /tmp/capture.pcap"
  }]
}

Non è nemmeno necessario attendere un riavvio del dispositivo: è sufficiente che la GUI stessa ricarichi la configurazione del firewall, ad esempio salvando una regola di bypass qualsiasi.

Il salvataggio innesca il riavvio di uci-firewall, che esegue lo script, e con esso il payload iniettato.

Il dialogo Bypass con una regola disabilitata usata come innesco, ASN e Nota impostati su “test”.

La regola di test salvata, con una freccia che indica il pulsante Salva e applica.

Il banner “Applying configuration changes… 88s” durante il riavvio del firewall.

Rileggendo il file /tmp/capture.pcap tramite la stessa chiamata file read usata dalla pagina per il proprio output:

[{"jsonrpc":"2.0","id":1167,"result":[0,{"data":"uid=0(root) gid=0(root)\n"}]}]

uid=0. Un utente web autenticato, privo per design di qualunque shell, stava eseguendo comandi come root.

Dall’exploit alla shell completa

L’intera catena — autenticazione, recupero del token, lettura di /etc/passwd come verifica, scrittura del payload, trigger del reload del firewall, lettura dell’output — è stata automatizzata in un unico exploit Python:

[+] UANIA BOX is online
[+] Authentication: Success!
[+] Got CSRF token: 66247a9114d60235ca3eb1563d000b50
[*] Writing: 'id > /tmp/capture.pcap' in /etc/firewall.user ...
[+] Payload delivered successfully!
[*] Restarting uci-firewall will cause an internal network outage for a few seconds. Proceed? (Y/n) Y
[+] It's Raining! Exploit successful!
uid=0(root) gid=0(root)

Da notare che il riavvio di uci-firewall causa alcuni secondi di interruzione della rete interna: lo script chiede conferma prima di procedere, un dettaglio non trascurabile su un apparato che gestisce traffico di produzione.

Da lì, ottenere una shell interattiva è stata una formalità:

rainpwn@0xdeadspace:~$ ssh 192.168.100.1 -l rainpwn
BusyBox v1.31.1 () built-in shell (ash)
---------------------------------------------------
            UaniaOS 3.0 - Uania Srl
---------------------------------------------------
root@redacted:~# id
uid=0(root) gid=0(root)

Disclosure timeline

  • 25/07/2025 – Prima segnalazione inviata a UANIA ([email protected]) da Alessandro Sgreccia
  • 27/01/2026 – Segnalazione reinviata, la prima era rimasta senza risposta
  • 28/01/2026 – Segnalazione reinviata grazie all’interessamento di Manuel Roccon, che ha facilitato il contatto con UANIA dopo che la prima segnalazione era rimasta senza risposta.
  • 10/02/2026 – UANIA riproduce il problema, lo attribuisce a permessi ACL eccessivi nella loro customizzazione OpenWrt (chiamata ubus file write su path arbitrari da utente non-root autenticato), conferma il fix già sviluppato e propone una disclosure coordinata con CVE congiunta
  • 10/02/2026 – Il ricercatore accetta la disclosure coordinata a 60 giorni, chiede la pubblicazione della CVE con MITRE, la revisione dell’advisory finale e la ripubblicazione su Red Hot Cyber (HackerHood fa parte del gruppo)
  • 17/02/2026 – UANIA accetta la richiesta CVE e non pone obiezioni alla pubblicazione su Red Hot Cyber
  • 24/03/2026 – UANIA invia le bozze dell’advisory e della submission MITRE per revisione
  • 25/03/2026 – Il ricercatore approva entrambe le bozze, crediti inclusi
  • 10/09/2026 – A cinque mesi di distanza, senza CVE assegnata, il ricercatore chiede un aggiornamento
  • 14/09/2026 – UANIA conferma che l’advisory è live su uania.com/security e che la richiesta CVE, inoltrata a suo tempo tramite il modulo MITRE (nel frattempo diventato legacy) senza mai ricevere risposta, è stata ripresentata, ottenendo questa volta un riferimento di tracking interno

Conclusioni

Il caso UaniaOS è un promemoria di una dinamica ricorrente: quando un vendor limita l’amministrazione di un apparato alla sola interfaccia web “per ridurre la superficie di attacco”, il rischio si sposta semplicemente su quell’interfaccia.

Un endpoint interno come UBUS, pensato per la comunicazione tra componenti di sistema ed esposto via HTTP con controlli ACL incompleti, ha permesso a un utente autenticato di leggere e scrivere file arbitrari, e la scrittura su un singolo file (/etc/firewall.user) eseguito automaticamente come root, ha chiuso il cerchio trasformando un accesso web in un’esecuzione di codice completa sul dispositivo.

La vulnerabilità, corretta in UaniaOS 3.0.1, resta priva di CVE assegnata nonostante oltre un anno di processo di disclosure. Non è la prima volta che il team di HackerHood si scontra con questo tipo di attesa: anche nel caso delle vulnerabilità scoperte su BreldoBox, la richiesta di assegnazione presso il MITRE è rimasta a lungo in fase di elaborazione, con l’ente che ha risposto genericamente di operare “su un modello di gestione basato sul rischio” per via dell’elevato volume di richieste ricevute.

Il caso UaniaOS conferma quindi come, indipendentemente dalla qualità tecnica del lavoro svolto dal ricercatore, il percorso amministrativo verso l’assegnazione di un identificativo CVE possa incontrare ostacoli che esulano completamente dal merito della scoperta.

Se sei una azienda che vuole testare la sicurezza dei propri device o infrastrutture, invia una email a [email protected]. Possiamo analizzare gratuitamente la tua infrastruttura o i tuoi device con i nostri ricercatori di sicurezza.


📢 Resta aggiornatoTi è piaciuto questo articolo? Rimani sempre informato seguendoci su 🔔 Google News.
Ne stiamo anche discutendo sui nostri social: 💼 LinkedIn, 📘 Facebook e 📸 Instagram.
Hai una notizia o un approfondimento da segnalarci? ✉️ Scrivici


Manuel Roccon 300x300
Ho iniziato la mia carriera occuparmi nella ricerca e nell’implementazioni di soluzioni in campo ICT e nello sviluppo di applicazioni. Al fine di aggiungere aspetti di sicurezza in questi campi, da alcuni anni ho aggiunto competenze inerenti al ramo offensive security (OSCP), occupandomi anche di analisi di sicurezza e pentest in molte organizzazioni.
Aree di competenza: Ethical Hacking, Bug Hunting, Penetration Testing, Red Teaming, Security Research, Cybersecurity Communication