
إثبات المفهوم CVE-2025-31133
يشرح هذا المستند وظيفة سكربت إثبات المفهوم (PoC) المقدم لثغرة runc CVE-2025-31133.
runc لخاصية maskedPaths.maskedPaths، مما يسمح لها بالكتابة إلى ملفات حساسة على النظام المضيف. ويشكّل ذلك هروبًا من الحاوية (container escape)./proc/sys/kernel/core_pattern على المضيف من داخل حاوية."pwned" إلى الملف الهدف ولا ينفّذ أي كود تعسفي على المضيف. كما يوفّر تعليمات لاستعادة القيمة الأصلية.ميزة maskedPaths في مواصفات OCI للحاوية (config.json) هي آلية أمنية مصممة لمنع الحاويات من الوصول إلى ملفات النظام الحساسة. تعمل عن طريق الربط (bind mount) للملف /dev/null (ملف جهاز فارغ) فوق هذه المسارات الحساسة داخل الحاوية، مما يجعلها فعليًا غير قابلة للقراءة أو الكتابة.
الثغرة (CVE-2025-31133) هي حالة سباق من نوع التحقق قبل الاستخدام (Time-of-Check to Time-of-Use - TOCTOU). يعمل الاستغلال على النحو التالي:
runc الحاوية، فإنه يستعد لاستخدام ملف dev/null من rootfs الخاص بالحاوية كمصدر لعملية الربط (bind mount) التي ستقوم بحجب المسار الحساس (مثل /proc/sys/kernel/core_pattern).runc المسار إلى rootfs/dev/null واللحظة التي ينفّذ فيها فعليًا عملية التثبيت (mount).rootfs/dev/null بين عقدة جهاز شرعية ورابط رمزي يشير إلى الملف الهدف على المضيف (/proc/sys/kernel/core_pattern).runc عملية التثبيت في اللحظة المحددة التي يكون فيها rootfs/dev/null رابطًا رمزيًا. وهذا يجعل النواة تتبع الرابط الرمزي، مما يؤدي إلى فشل عملية الحجب المطلوبة للمسار /proc/sys/kernel/core_pattern./proc/sys/kernel/core_pattern، مما يعدّل ملف المضيف مباشرة، محققًا هروبًا من الحاوية.يستخدم هذا الـ PoC هذه التقنية للكتابة إلى /proc/sys/kernel/core_pattern، وهو هدف شائع لمثل هذه الاستغلالات لأن تعديله قد يؤدي إلى تنفيذ كود تعسفي على المضيف عند تعطل إحدى العمليات. ومع ذلك، يكتب هذا الـ PoC سلسلة غير ضارة فقط لإثبات وجود إمكانية الكتابة (write primitive).
يقوم سكربت poc.sh بأتمتة العملية بأكملها الموضحة أعلاه.
الإعداد والتنظيف:
runc الثنائي واسم الحاوية ومسار rootfs.cleanup قوية تضمن إزالة أي حاويات أو ملفات أنشأها السكربت مسبقًا. تُستدعى هذه الدالة تلقائيًا عند الخروج أو المقاطعة أو الإنهاء.التحضير:
/proc/sys/kernel/core_pattern الخاص بالمضيف في ملف مؤقت. يُستخدم هذا لاحقًا للتحقق من نجاح الاستغلال ولمساعدة المستخدم على استعادة النظام../rootfs) وملف config.json.config.json المسار /proc/sys/kernel/core_pattern صراحةً ضمن maskedPaths — الميزة نفسها التي يهدف الاستغلال إلى تجاوزها.دالة السباق (symlink_race)
rootfs/dev/null.المتطلبات الأساسية:
runc.busybox-static (لقشرة الحاوية).sudo) لتشغيل runc وتعديل /proc.الخطوات:
poc.sh.chmod +x poc.sh.sudo ./poc.sh.[+] EXPLOIT SUCCEEDED!، فهذا يعني أن حالة السباق قد كُسبت. تم تعديل ملف /proc/sys/kernel/core_pattern على المضيف بنجاح من داخل الحاوية، مما يؤكد وجود الثغرة.[-] Exploit did not succeed.، فهذا يعني أن السباق لم يُكسب في هذه المحاولة. حالات السباق احتمالية بطبيعتها وتعتمد بشكل كبير على توقيت النظام وحمولته. جرّب تشغيل السكربت عدة مرات أخرى.سيقوم الـ PoC بتعديل ملف نظام. لاستعادته إلى حالته الأصلية، نفّذ الأمر الذي يقترحه السكربت:
# The 'ORIGINAL_PATTERN' will be the actual value from your system
echo 'original_core_pattern_value' | sudo tee /proc/sys/kernel/core_pattern
rootfs/dev/null إلى الملف الهدف على المضيف (/proc/sys/kernel/core_pattern).rootfs/dev/null كجهاز حرفي (character device) صحيح (mknod).التنفيذ:
symlink_race كعملية خلفية.runc run ... لإنشاء الحاوية وتشغيلها. في هذه المرحلة يحاول runc تطبيق maskedPaths.runc exec لتنفيذ أمر داخل الحاوية: echo 'pwned' > /proc/sys/kernel/core_pattern.التحقق:
/proc/sys/kernel/core_pattern الخاص بالمضيف."pwned" وبالقيمة الأصلية.[+] EXPLOIT SUCCEEDED! أو [-] Exploit did not succeed.