
اكتشف بأمان ما إذا كانت وحدة تحكم UniFi Network Application معرضة للثغرة CVE-2026-22557
اكتشاف آمن لما إذا كان وحدة تحكم تطبيق شبكة UniFi معرضة للثغرة CVE-2026-22557 دون التسبب في أي تعطيل. اطّلع على الكتابة الكاملة في مدونة Bishop Fox.
CVE-2026-22557 هي ثغرة عبور مسار غير مصادق عليه في بوابة الضيوف الخاصة بتطبيق شبكة UniFi، تسمح للمهاجمين عن بُعد بقراءة ملفات عشوائية باسم مستخدم عملية التحكم (CVSS 10.0). تؤثر الثغرة على تطبيق شبكة UniFi الإصدار 10.1.85 وما قبله على الفرع 10.1.x، والإصدارات السابقة المقابلة على الفرعين 10.2.x و 9.0.x. قامت Ubiquiti بشحن الإصلاحات في الإصدارات 10.1.89 و 10.2.97 و 9.0.118 (SAB-062).
يقوم عارض صفحة الفشل في بوابة الضيوف بقراءة معامل الطلب page_error ويستخدمه كما هو كمسار نسبي في أداة تحميل موارد البوابة، دون أي تحقق. عندما يتم تعيين portal_customized: true على الموقع الذي يتم الاستعلام عنه (التكوين الذي ينتهي به أي بوابة ضيوف ذات علامة تجارية، مثل فنادق أو متاجر أو مقاهي)، يحل المحمّل ذلك المسار مقابل دليل البوابة على القرص، ويمكن للمسار الهروب منه.
تقوم هذه الأداة باختبار الثغرة بطريقة غير تخريبية عن طريق:
/status ومقارنته بخطوط الإصلاح في SAB-062page_error على /guest/<site>/wechat/sign بأعماق ../ من 1 إلى 8 مقابل اسم ملف ثنائي الفرع، لتحديد ما إذا كان العبور يعمل على الإطلاقfirmware.json) لتحديد ما إذا كان فرع نظام الملفات للبوابة المخصصة نشطًاتطلب الأداة ملف كتالوج وقت التشغيل فقط كإشارة لنشاط الفرع. إنها لا تقرأ بيانات الاعتماد، أو مواد TLS، أو حالة قاعدة البيانات، أو النسخ الاحتياطية، ولا تكتب أي محتوى ملف إلى stdout أو القرص. يتم طباعة الحكم فقط.
portal_customized: true على الموقع الذي يتم الاستعلام عنه تُرجع ملف الكتالوج عند العمق المُعاير، مما يؤكد VULNERABLE.portal_customized: false على الموقع الذي يتم الاستعلام عنه تُؤدي العبور في خطوة المعايرة ولكن لا تُرجع محتوى القرص في خطوة التأكيد → PARTIALLY EXPOSED. التطبيق الثنائي لا يزال ضعيفًا؛ التصحيح مطلوب حتى لو لم يكن هذا الموقع في الحالة القابلة للاستغلال.NOT VULNERABLE.NOT EXPOSED.git clone https://github.com/BishopFox/CVE-2026-22557-check
cd CVE-2026-22557-check
مطلوب Python 3.9+. تستخدم الأداة مكتبة Python القياسية فقط، لذلك لا حاجة لخطوة pip install.
اختبر وحدة تحكم تطبيق شبكة UniFi عند <TARGET>. وجّه الأداة إلى أي عنوان URL يصل إلى واجهة الويب الخاصة بوحدة التحكم؛ يتم توزيع المعالج القابل للثغرة على منفذ الإدارة (افتراضي 8443/TCP) وكذلك على منافذ بوابة الضيوف المخصصة (8843، 8880).
python3 cve_2026_22557_check.py <BASE_URL> [--site NAME]
اسم الموقع الافتراضي هو default. يجب على عمليات نشر UniFi التي تحتوي على مواقع متعددة إعادة تشغيل الأداة مع --site <name> لكل موقع. تصبح وحدة التحكم قابلة للاستغلال بمجرد أن يحتوي أي موقع من مواقعها على portal_customized: true.
تستخدم الأمثلة أدناه --brief للحصول على نتيجة سطر واحد لكل مضيف. قم بتشغيلها دون --brief للحصول على اللافتة الكاملة، والتقدم خطوة بخطوة، وكتلة النتائج التي تتضمن إجراءات التصحيح الموصى بها.
وحدة التحكم تعمل بإصدار قابل للثغرة وشرط البوابة المخصصة مسبقًا نشط للموقع المُستعلم عنه، لذلك مسار القراءة غير المصادق عليه قابل للوصول.
$ python3 cve_2026_22557_check.py https://192.168.1.100:8443 --brief
[VULNERABLE] https://192.168.1.100:8443 site=default
وحدة التحكم تعمل بإصدار قابل للثغرة، ولكن الموقع المُستعلم عنه ليس لديه portal_customized: true ممكّنًا، لذلك شرط القراءة من القرص غير مستوفٍ لهذا الموقع. لا يزال التطبيق الثنائي بحاجة إلى التصحيح؛ موقع آخر على نفس وحدة التحكم قد يكون في الحالة القابلة للاستغلال.
$ python3 cve_2026_22557_check.py https://192.168.1.100:8443 --brief
[PARTIAL] https://192.168.1.100:8443 site=default
وحدة التحكم تعمل بإصدار مُصحح (10.1.89، 10.2.97، 9.0.118، أو أحدث)، لذلك لا يُطلق العبور على أي عمق يُستعلم عنه.
$ python3 cve_2026_22557_check.py https://192.168.1.200:8443 --brief
[NOT VULNERABLE] https://192.168.1.200:8443 site=default
--site NAME اسم موقع UniFi لفحصه (افتراضي: "default")
--max-depth N أقصى عمق عبور `../` لتجربته (افتراضي: 8)
--no-tls-recon تخطي عرض الموضوع/أسماء SAN لشهادة TLS
--no-color تعطيل إخراج الألوان ANSI (يُحترم أيضًا: متغير البيئة NO_COLOR)
--timeout N مهلة لكل طلب بالثواني (افتراضي: 20)
--brief طباعة نتيجة سطر واحد، بدون لافتة أو خطوات
رموز الخروج: 0 VULNERABLE، 1 جزئيًا مكشوف / غير قابل للثغرة / غير مكشوف، 2 خطأ في النقل.
يمكن للأداة إرجاع حكم VULNERABLE فقط إذا توفرت الشروط التالية:
/guest/* على منفذ الإدارة (8443) وكذلك على منافذ بوابة الضيوف المخصصة (8843، 8880)؛ الأداة تفحص فقط عنوان URL المعطى لها.portal_customized: true في إعداد guest_access، وهو الشرط المسبق لمسار قراءة القرص. وحدة التحكم ذات المواقع المتعددة تكون قابلة للاستغلال إذا كان أي موقع من مواقعها لديه هذا ممكّنًا.إذا لم يتم استيفاء أي شرط، تتراجع الأداة إلى حكم أكثر تحفظًا. نتيجة PARTIALLY EXPOSED لا تزال تعني أن التطبيق ضعيف ويجب تصحيحه؛ الموقع المُستعلم عنه ببساطة لا يعرض مسار قراءة القرص.
نمط الطلب القابل للثغرة هو:
GET /guest/s/<site>/wechat/sign?page_error=<value>
يصل العملاء الشرعيون إلى /guest/s/<site>/wechat/sign فقط عبر POST (الذي يقبله الموزع دون تشغيل عارض صفحة الفشل). أي طلب GET لهذه النقطة النهائية يحمل معامل استعلام page_error=، خاصةً الذي يحتوي على ../ أو %2e%2e أو شرطة مائلة بادئة /، يعتبر شاذًا ويجب معاملته كمحاولة استغلال. يلتقط سجل الوصول القياسي لـ Tomcat سطر الطلب الكامل بما في ذلك سلسلة الاستعلام.
يتم توزيع هذا الكود بموجب ترخيص MIT.
استخدام هذه الأداة لمهاجمة أهداف دون موافقة مسبقة متبادلة غير قانوني. يتحمل المستخدم النهائي مسؤولية الامتثال لجميع القوانين المحلية والولائية والفيدرالية المعمول بها. لا يتحمل المطورون أي مسؤولية ولا يتحملون أي مسؤولية عن أي سوء استخدام أو ضرر ناتج عن هذا البرنامج.