
إثبات مفهوم لثغرة CVE-2024-21626، وهي ثغرة هروب من الحاويات في runc. يتضمن سكربتات تحقق، وطريقتي استغلال (صدفة عكسية عبر cron واستبدال الأوامر)، وتحليلًا للسبب الجذري والتصحيح.
| اسم الثغرة | ثغرة الهروب من docker runc |
|---|---|
| رقم الثغرة | CVE-2024-21626 |
| تاريخ الكشف | 2024-01-31 |
| الميزة | / |
| الإصدارات المتأثرة | runc @ [v1.0.0-rc93,1.1.11] |
شروط الاستغلال صعبة بعض الشيء، وتتطلب تفاعل الضحية، أعتقد شخصياً أنها غير عملية إلى حد ما:
التحقق من وجود الثغرة والحصول على الواصف:
git clone https://github.com/V0WKeep3r/CVE-2024-21626-runcPOC.git
cd CVE-2024-21626-runcPOC
bash verify.sh
كما في الشكل أدناه، توجد الثغرة، وواصف الملف هو /proc/self/fd8
يمكن لـ verify.sh العثور على القيمة المحددة لـ fd في بيئة الجهاز الحالي. إذا لم يكن fd يساوي 8، فيجب تعديل WORKDIR في Dockerfile إلى القيمة المقابلة أو استخدام -w في docker run لتحديدها.
التحقق من الهروب/رفع الامتيازات: هنا أقرب إلى الواقع العملي، يستخدم poc.sh مهمة مجدولة لعكس shell. يستخدم poc2.sh طريقة استبدال الأوامر (ملاحظة: استخدام هذه الطريقة يتطلب نسخ احتياطي للملفات مسبقاً لتجنب صعوبة استعادتها).
# يجب التأكد من وجود ملف المهمة المجدولة، وإلا يمكن إنشاؤه وكتابته، لكن ذلك لن يؤدي إلى تشغيل المهمة المجدولة
# فقط الملفات التي تم إنشاؤها بواسطة crontab -e (في مجموعة crontab) يتم تنفيذها مجدولاً
docker build . -t poc1
docker run -it --rm poc1 bash /poc.sh

POC2:
docker build . -t poc2
docker run -it --rm poc2 bash /poc.sh
# افتح terminal آخر
/bin/bash.copy

ليس فهماً كاملاً، ولكن بالجمع مع التصحيح يمكن فهم الفكرة العامة.
أثناء عملية docker exec أو docker run، يتم استدعاء دالة execve الخاصة بـ runc، لكن أثناء عملية exec في runc، لا يتم إغلاق واصفات الملفات (fd)، مما يؤدي إلى تسرب واصفات ملفات المضيف إلى بيئة الحاوية، ويمكن للمستخدم من خلال هذا الواصف قراءة وكتابة ملفات المضيف، وبالتالي تحقيق الهروب من الحاوية.
خطة الإصلاح ترقية runc إلى إصدار 1.12 أو أعلى. رابط runc الرسمي: https://github.com/opencontainers/runc/releases
تحليل التصحيح
commit الفرق: https://github.com/opencontainers/runc/commit/2a4ed3e75b9e80d93d1836a9c4c1ebfa2b78870e
إغلاق واصفات الملفات الداخلية قبل execve في الوقت المناسب
init_linux.go، التحقق من أن cwd (دليل العمل الحالي) موجود داخل الحاوية بعد chdir
