
اكتشاف آمن لما إذا كان خادم UniFi OS معرضًا للثغرة CVE-2026-34908
أداة كشف آمنة لسلسلة تنفيذ الأوامر عن بعد غير الموثّق في خادم UniFi OS الإصدار 5.0.6 وما دونه، التي تم الكشف عنها في النشرة الأمنية 064 من Ubiquiti:
| CVE | الفئة | الدور في السلسلة |
|---|---|---|
| CVE-2026-34908 / CVE-2026-34909 | تحكم غير صحيح في الوصول / تجاوز المسار | تجاوز بوابة المصادقة (نقطة الارتكاز) |
| CVE-2026-34910 | تحقق غير صحيح من الإدخال → حقن أوامر | تنفيذ أوامر عن بعد غير موثّق يتم الوصول إليه عبر التجاوز |
تم الإصلاح في خادم UniFi OS الإصدار 5.0.8.
نعم. تم تصميم أداة الكشف للاستخدام في الإنتاج والتقييم:
GET عادي.VULNERABLE كلًّا من: وصول التجاوز المصادق إلى المعالج الضعيف، ورفض طلب أساسي (نفس النقطة، بدون تجاوز) بشكل صحيح برمز 401.يستخدم خادم UniFi OS خادم nginx لخدمة خدماته، الذي يفرض المصادقة عبر طلب فرعي. يعامل فحص المصادقة أي طلب يبدأ مساره الخام بـ /api/auth/validate-sso/ كعام، لكن nginx يوجّه إلى الخلفية باستخدام المسار المطبّع (يفك تشفير %2f→/ ويضغط ../). طلب مثل:
GET /api/auth/validate-sso/..%2f..%2f..%2fproxy/users/api/v2/ucs/update/latest_package
يتم معاملته كعام (مسار خام) ومع ذلك يُوجّه إلى نقطة تحديث الحزمة الداخلية الموثّقة (مسار مطبّع). بدون pkg_name، تردّ تلك النقطة query param pkg_name required — مما يثبت نجاح التجاوز وإمكانية الوصول إلى المعالج الضعيف.
ترسل أداة الكشف أيضًا طلبًا أساسيًا إلى نفس النقطة بدون التجاوز وتتطلب أن يعيد 401 قبل الإعلان عن أن المضيف ضعيف. يختبر الفحص السلوك الضعيف مباشرةً — حكم VULNERABLE يعني أن التجاوز وصل بالفعل إلى الحوض.
عندما لا يؤكد الاستكشاف VULNERABLE أو PATCHED بشكل إيجابي، تجلب أداة الكشف الصفحة الجذرية وتبحث عن بصمة بوابة إدارة UniFi OS (
<title>UniFi OS</title>، window.UNIFI_OS_MANIFEST، id="portal-root"،
id="site-manager_portal-container"). ينطبق هذا أيضًا على 401: مضيف UniFi OS الذي يفرض المصادقة على التجاوز هو INCONCLUSIVE، لكن وكيل غير UniFi يعيد 401 لكل شيء لا يحمل بصمة ويُبلغ عنه UNAFFECTED. لذا كل نتيجة "غير ضعيف" تستند إلى البصمة: وجود العلامات → INCONCLUSIVE؛ غياب العلامات → UNAFFECTED (CVE لا ينطبق).
# مضيف واحد (المنفذ الافتراضي 11443)
./cve_2026_34908_check.py 192.168.1.10
# منفذ / رابط URL صريح
./cve_2026_34908_check.py host-a:11443 https://host-b
# فحص قائمة، هدف واحد لكل سطر (يُسمح بتعليقات '#')، إخراج مضغوط
./cve_2026_34908_check.py -f targets.txt --brief
# إخراج قابل للقراءة آليًا للأنابيب
./cve_2026_34908_check.py -f targets.txt --json > results.json
وحدة تحكم ضعيفة (مفصل، الافتراضي). السطر الثاني هو تفاصيل الحكم؛ تظهر علامة [!] وVULNERABLE باللون الأحمر على TTY:
$ ./cve_2026_34908_check.py 192.168.1.10
[!] 192.168.1.10:11443: VULNERABLE
auth bypass reached the vulnerable handler (no command executed); baseline correctly 401
وحدة تحكم مُصحَّحة (5.0.8+):
$ ./cve_2026_34908_check.py 192.168.1.11
[+] 192.168.1.11:11443: PATCHED
nginx rejected the normalized-path divergence (HTTP 400) — 5.0.8+ behavior
مضيف UniFi OS مؤكد لم تتمكن أداة الكشف من تصنيفه → INCONCLUSIVE. يفرّق سطر التفاصيل بين الحالتين (المصادقة مفروضة مقابل استجابة غير متوقعة):
$ ./cve_2026_34908_check.py 192.168.1.12 192.168.1.13
[?] 192.168.1.12:11443: INCONCLUSIVE
bypass blocked / auth enforced (HTTP 401) on a confirmed UniFi OS host — not confirmed vulnerable
[?] 192.168.1.13:11443: INCONCLUSIVE
UniFi OS detected, but probe returned an unexpected response: HTTP 302 text/html
مضيف ليس UniFi OS على الإطلاق → UNAFFECTED (النشرة لا تنطبق):
$ ./cve_2026_34908_check.py 203.0.113.9:443
[-] 203.0.113.9:443: UNAFFECTED
no UniFi OS web fingerprint on / (probe HTTP 404) — target is not a UniFi OS Server
فحص قائمة، سطر واحد محاذٍ لكل مضيف (--brief). حالة الخروج 1 إذا كان أي مضيف VULNERABLE، وإلا 0 — مفيد في البرامج النصية:
$ ./cve_2026_34908_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE 192.168.1.10:11443
PATCHED 192.168.1.11:11443
INCONCLUSIVE 192.168.1.12:11443
UNAFFECTED 203.0.113.9:443
ERROR 10.0.0.1:11443 timeout
exit: 1
إخراج قابل للقراءة آليًا للأنابيب (--json). كل نتيجة تحمل verdict بالإضافة إلى bypass.state/bypass.detail؛ نتائج ERROR تحمل حقل error بدلاً من bypass:
$ ./cve_2026_34908_check.py 192.168.1.10 192.168.1.11 10.0.0.1 --json
[
{
"target": "192.168.1.10:11443",
"bypass": {
"state": "vulnerable",
"detail": "auth bypass reached the vulnerable handler (no command executed); baseline correctly 401"
},
"verdict": "VULNERABLE"
},
{
"target": "192.168.1.11:11443",
"bypass": {
"state": "patched",
"detail": "nginx rejected the normalized-path divergence (HTTP 400) — 5.0.8+ behavior"
},
"verdict": "PATCHED"
},
{
"target": "10.0.0.1:11443",
"verdict": "ERROR",
"error": "timeout"
}
]
| الرمز | المعنى |
|---|---|
0 | لا هدف أعاد VULNERABLE |
1 | هدف واحد على الأقل هو VULNERABLE |
2 | خطأ في الاستخدام (وسائط خاطئة / ملف أهداف غير قابل للقراءة) |
INCONCLUSIVE ليس ضمانًا للسلامة — يؤكد مضيف UniFi OS لكن لم يتمكن من تصنيفه (المصادقة مفروضة على التجاوز، أو استجابة غير متوقعة). قد لا يكون المضيف الذي تمت تصفيته بشدة أو وضعه خلف وكيل غير متوقع قابلاً للتصنيف من الشبكة فقط. تأكد من الإصدار الجاري حيثما أمكن.UNAFFECTED يعني أن الصفحة الجذرية لم تحمل بصمة بوابة UniFi OS (بما في ذلك المضيفات التي تعيد 401 بدونها). قد يتم الإبلاغ بشكل خاطئ عن وحدة تحكم UniFi OS مخفية خلف وكيل عكسي يزيل أو يعيد كتابة HTML للبوابة؛ تأكد مباشرة إذا كان من المتوقع أن يكون الهدف UniFi OS.قم بتحديث خادم UniFi OS إلى الإصدار 5.0.8 أو أحدث. يضيف الإصلاح مقارنة URIs الخام مقابل المطبّع في nginx (إغلاق تجاوز المصادقة) والتحقق من الإدخال في مسار تحديث الحزمة (إغلاق حقن الأوامر).
هذا الكود موزع تحت رخصة MIT.
استخدام هذه الأداة لمهاجمة أهداف دون موافقة مسبقة متبادلة غير قانوني. من مسؤولية المستخدم النهائي الامتثال لجميع القوانين المحلية والولائية والاتحادية المعمول بها. لا يتحمل المطورون أي مسؤولية ولا هم مسؤولون عن أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج.
| استجابة الاستكشاف | الحكم |
|---|
200 + علامات خطأ المعالج | VULNERABLE |
400 (nginx يرفض التباعد) | PATCHED (5.0.8+) |
401، توجد بصمة UniFi OS | INCONCLUSIVE (المصادقة مفروضة / التجاوز محظور) |
401، لا توجد بصمة UniFi OS | UNAFFECTED (ليس خادم UniFi OS) |
| أي شيء آخر، لا توجد بصمة UniFi OS | UNAFFECTED (ليس خادم UniFi OS) |
| أي شيء آخر، توجد بصمة UniFi OS | INCONCLUSIVE (استجابة غير متوقعة) |
| العلامة | الوصف |
|---|
targets | واحد أو أكثر من host، host:port، أو https://host:port |
-f, --targets-file FILE | قراءة الأهداف من ملف (واحد لكل سطر؛ تعليقات #) |
--brief | سطر واحد محاذٍ لكل هدف — مثالي لفحص العديد من المضيفات |
--json | إخراج نتائج JSON مهيكلة |
--timeout SECS | مهلة كل طلب (الافتراضي: 10) |
--no-color | تعطيل الإخراج الملون (يحترم أيضًا NO_COLOR وعدم TTY) |
| الحكم | المعنى |
|---|
VULNERABLE | تجاوز المصادقة وصل إلى المعالج الضعيف بدون مصادقة. قم بالتحديث إلى 5.0.8+. |
PATCHED | رفض nginx تباعد المسار المطبّع (سلوك 5.0.8+). |
UNAFFECTED | لا توجد بصمة بوابة UniFi OS على الصفحة الجذرية — الهدف ليس خادم UniFi OS، لذا النشرة لا تنطبق. يشمل المضيفات التي تعيد 401 بدون البصمة (مثل وكيل غير ذي صلة يرفض كل شيء). |
INCONCLUSIVE | مضيف UniFi OS مؤكد لم يتمكن من التصنيف — تحقق من الإصدار يدويًا. يذكر سطر تفاصيل الحكم الحالة: (أ) تم حظر التجاوز / فرض المصادقة (401)، أو (ب) أعاد الاستكشاف استجابة غير متوقعة. |
ERROR | فشل اتصال/مهلة/TLS. |