
الإفصاح عن ثغرة قراءة/كتابة ملفات بصلاحيات الجذر في قناة التصحيح الخاصة بـ TP-Link Deco XE75 Pro V3 (أكواد tmpsvr 0xC456/0xF0)، مع تحليل CVSS وإعادة تفكيك المعالج.
مشروع VLAN المرافق: نسخة ألفا تجريبية بمُعرّف VLAN ثابت 30 لبرنامج XE75 Pro V3 والملف التعريفي المطابقين تمامًا. يتطلب ملفات أصلية يوفّرها المشغّل، ولا يتضمن مثبّتًا عامًا أو صورة قابلة للتفليش. لا تزال شبكة VLAN الضيف 591 دون حل؛ ولم يكتمل بعد قبول الإقلاع البارد النهائي للوحدات الثلاث، ولا اختبار واجهة المستخدم وعزل العملاء. راجع الحالة الحالية.
إفصاح بحثي، TP-Link Deco XE75 Pro V3، البرنامج الثابت 1.5.0 Build
20260603 Rel.15804. أُعِدّ لـ [email protected] وللنشر العام إلى جانب تنفيذنا لشبكة VLAN الخاصة بإنترنت الأشياء وفق 802.1Q (deco-iot-vlan).
تصل قناة SSH للتصحيح المصادَق عليها من مالك Deco (Dropbear على TCP 20001،
إعادة توجيه direct-tcpip فقط، مصادقة بكلمة مرور) إلى خدمة داخلية
tmpsvr على 127.0.0.1:20002. أحد معالجات Lua الخاصة بها،
inner_file_push (رمز العملية 0xC456)، يفتح params.file بوضع "w"
ويكتب params.content حرفيًا بصلاحيات الجذر، دون قائمة مسارات مسموح بها، ودون
حد للحجم، ودون إسقاط للصلاحيات. ويوفّر رمز عملية شقيق (0xF0) قراءةً
مطابقة للملفات بصلاحيات الجذر. ومجتمعان معًا: قراءة + كتابة مصادَق عليهما لكامل
نظام ملفات الجذر، وهو على جهاز التوجيه يعني الجهاز بأكمله.
SSH :20001 (username = SHA1(owner_email), password = TP-Link account password)
-> direct-tcpip -> 127.0.0.1:20002 (TMPv2)
-> 0xC456 inner_file_push : io.open(file,"w"); write(content); close() [root]
-> 0x00F0 root file read : byte-exact file read [root]
/etc/config هو ramfs قابل للكتابة أثناء التشغيل → غيّر مفتاحًا، وسيحترمه الراوتر./www عبر HTTPS بواسطة uhttpd → الملفات المدفوعة تصبح قابلة للوصول فورًا./tp_data/user_data هو فلاش ubifs دائم → يبقى بعد إعادة التشغيل.GET /cgi-bin/luci → تنفيذ Lua بصلاحيات root → io.popen → تنفيذ ثنائي
عشوائي بصلاحيات root.تم تنفيذ الخطوات الأربع جميعها ثم التراجع عنها على الوحدة الرئيسية المملوكة للمالك نفسه.
tmpsvr دون إصلاح بعد عامين من CCS'24 / Black Hat '24وثّق فريق UCR SecLab علنًا قناة التصحيح :20001 -> 127.0.0.1:20002 (tmpsvr) قبل عامين في CCS 2024 — "Untangling the Knot: Breaking Access Control in Home Wireless Mesh Networks" (وBlack Hat USA 2024 — "Fallen Tower of Babel"). كانت نقطة دخولهم على طرازات Deco الأقدم (X55، FW 1.2.2) هي تحليل مفاتيح RSA المضيفة ذات 512 بت وإساءة استخدام معالجات tmpsvr غير المُتحقَّق منها.
الفروق الملحوظة والمعالجات المتبقية على هذا الإصدار الثابت من البرنامج الثابت تحديدًا:
ssh-rsa المضيف من 512 بت إلى 2048 بت (مفتاح مشترك واحد ملحوظ عبر وحدات الشبكة المتداخلة الثلاث، SHA256:9feb3ac4...932a36، بالإضافة إلى ecdsa-sha2-nistp521 لكل وحدة)، مما أغلق مسار تحليل 512 بت من محاضرة 2024.1.5.0:
:20001 (svr_auth_uci) لا تزال نشطة باستخدام SHA1(owner_email) + كلمة مرور TP-Link ID المشتركة.0xC456 (inner_file_push) لا يزال يفتح أي مسار يقدمه المستدعي في وضع "w" بصلاحيات root دون أي تحقق من المسار.0x00F0 لا يزال يقرأ أي ملف على نظام الملفات بصلاحيات root.0xC505 (tty2tcp/start) — معالج حقن الأوامر /bin/sh -c غير المُقتبَس بعينه الذي أُبرز في ورقة 2024 — لا يزال موجودًا في البرنامج الثابت ليونيو 2026 (1.5.0) دون إصلاح بالكامل.luci/controller/admin/mobile_app/iot_device، inner_file_push).لم يُثبَت سوى قابلية الوصول من LAN. بالنسبة للملف الملحوظ الخاص بـ LAN فقط نستخدم متغيرات AV:A: v3.1 6.8 / v4.0 8.5. درجات AV:N أدناه مشروطة بوجود مسار شبكي مُثبَت؛ قابلية الوصول عبر السحابة غير مُتحقَّق منها.
هذا تصعيد بعد المصادقة، بصلاحيات المالك إلى root — وليس RCE دون مصادقة — الدرجات الخاصة بالملف الملحوظ أدناه هي 6.8 (v3.1) و8.5 (v4.0). المبررات الكاملة
والتضخيمات المرفوضة موجودة في docs/cvss-analysis.md.
CVSS v3.1 — تقييم LAN فقط 6.8 (متوسط)؛ المتغير البعيد المشروط 7.2 (مرتفع):
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H = 7.2 (High)
CVSS:3.1/AV:A/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H = 6.8 (Medium) # if LAN-only
استدعاءات حاسمة: PR:H (المالك / حساب TP-Link-ID هو المسؤول الإداري للجهاز) و**S:U** (المعالج يعمل بالفعل بصلاحيات الجذر — لا يتم تجاوز أي حد للصلاحيات). سجّلت مسودة سابقة 9.9 عبر PR:L + S:C؛ وكلاهما مرفوض.
CVSS v4.0 — تقييم LAN-only بقيمة 8.5 (High)؛ المتغير البعيد الشرطي بقيمة 8.6 (High):
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N = 8.6 (High)
CVSS:4.0/AV:A/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N = 8.5 (High) # if LAN-only
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L = 9.3 (Critical) # with Subsequent-System LAN/mesh impact
المخاطر الواقعية — تحوّل كلمة مرور TP-Link-ID المسروقة/المُعاد استخدامها إلى
صلاحية root دائمة عبر الشبكة المتداخلة بأكملها إضافةً إلى MITM لحركة مرور العملاء — تنتمي إلى
السرد (ومقاييس v4.0 SC:H/SI:H/SA:L الخاصة بـ Subsequent-System)، وليس إلى
متجه أساسي v3.1 منتفخ.
poc/deco_filepush_poc.py — مكتفٍ ذاتيًا (stdlib + paramiko). بيانات الاعتماد
عبر متغيرات البيئة DECO_EMAIL / DECO_PASSWORD فقط. تتطلب الأوضاع الحية
DECO_HOSTKEY، مُتحقَّقًا منها بشكل مستقل: base64 خام، أو سطر مفتاح عام، أو سطر
مفتاح واحد من ssh-keyscan (التعليقات مدعومة). الفحص وحده لا يصادق
على الجهاز. يتحقق فحص HTTPS من البايتات المُقدَّمة لكنه لا يتحقق من شهادته.
يلزم وضع واحد بالضبط؛ التحقق الفاشل يخرج بقيمة غير صفرية.
python3 poc/deco_filepush_poc.py --selftest # offline framing sanity
[email protected] DECO_PASSWORD=*** DECO_HOSTKEY="$TRUSTED_DECO_HOSTKEY" \
python3 poc/deco_filepush_poc.py --run # write marker + readback + HTTPS check
[email protected] DECO_PASSWORD=*** DECO_HOSTKEY="$TRUSTED_DECO_HOSTKEY" \
python3 poc/deco_filepush_poc.py --cleanup <nonce> # overwrite marker with empty content
يكتب PoC علامة خاملة واحدة إلى /www/log_export (ramfs؛ وتُمسح أيضًا
عند إعادة التشغيل)، ثم يتطلب قراءة استرجاعية مطابقة بايتًا ببايت عبر
opcode القراءة الجذرية الخاص بالجهاز وتقديم HTTPS دون تعديل قبل الإبلاغ
عن النجاح.
ssh-keyscan -p 20001 <deco> → تثبيت مفتاح المضيف (RSA بـ 2048 بت مشترك عبر
الشبكة المتداخلة + nistp521 لكل وحدة).SHA1(owner_email) / كلمة مرور حساب TP-Link، وطلب
direct-tcpip إلى 127.0.0.1:20002.01010100 → 01010200 → 01010200)، ثم طلب رمز opcode 1.0xC456، {"params":{"file":"/www/log_export/deco-write-<nonce>.html", "content":"..."}} → {"error_code":0,...}.0xF0، {"params":{"file":"..."}} → قراءة استرجاعية مطابقة بايتًا ببايت.GET https://<deco>/log_export/deco-write-<nonce>.html → 200، بايتات مطابقة.tty2tcp (0xc505) مؤكَّد الوجود + غير مُتحقَّق منه (ساكن)
لكنه غير مُتحقَّق منه مباشرةً كحقن منفصل؛ مُدرَج لاكتمال الصورة.