
منتج إعادة إنتاج في حاوية لـ CVE-2021-22555 لتصعيد الامتيازات في لينكس، مع ملفات تعريف تخفيف seccomp وإرشادات النشر لمجموعات Kubernetes و OpenShift.
أولاً، يقوم هذا بتضمين كود الاستغلال من هنا كحاوية مبنية مسبقاً وسهلة الاستخدام: https://github.com/google/security-research/tree/master/pocs/linux/cve-2021-22555
الحاوية المبنية مسبقاً: quay.io/cgwalters/cve-2021-22555
التخفيف القوي هو تمكين seccomp الذي يرفض clone(CLONE_NEWUSER). تحتوي وثائق Kubernetes الرئيسية على بعض المعلومات حول هذا - لكنها تترك نشر السياسة على العقدة للمستخدم. في OpenShift 4، لدينا machine-config-operator الذي يمكنه التعامل مع هذا.
لا يتم مناقشة Seccomp كثيراً في الوثائق الرسمية. ومع ذلك، فإن دليل الأمان يذكر بعض هذا على الأقل، وكذلك هذه المدونة.
يأتي cri-o في الإصدار 4.7 مزوداً بسياسة seccomp افتراضية، لكنها غير ممكّنة افتراضياً. يأتي كل من podman و docker أيضاً مزودين بسياسة، وهي ممكّنة افتراضياً (لكنها تختلف، انظر أدناه).
سياسة cri-o لا ترفض clone(CLONE_NEWUSER) افتراضياً - وهذا ينطبق أيضاً على سياسة podman. ومع ذلك، فإن سياسة docker الافتراضية ترفض clone(CLONE_NEWUSER):
[root@cosa-devsh ~]# rpm -q podman moby-engine
podman-3.1.2-1.fc33.x86_64
moby-engine-19.03.13-1.ce.git4484c46.fc33.x86_64
[root@cosa-devsh ~]# podman run --rm -ti registry.fedoraproject.org/fedora:34 /bin/sh -c 'unshare -U --keep-caps true'
[root@cosa-devsh ~]# echo $?
0
[root@cosa-devsh ~]# docker run --rm -ti registry.fedoraproject.org/fedora:34 /bin/sh -c 'unshare -U --keep-caps true'
unshare: unshare failed: Operation not permitted
errchan: json: cannot unmarshal array into Go struct field systemdEventMessage.MESSAGE of type string
[root@cosa-devsh ~]# echo $?
1
[root@cosa-devsh ~]#
أو بعبارة أخرى: docker ليس عرضة لهذا بشكل افتراضي، لكن podman و cri-o عرضة. (TODO: التحقق من containerd)
يناقش إدخال المدونة openshift/seccomp-for-fun-and-profit بعض هذا، ويربط بملف تعريف أنشأه المؤلف. هذه السياسة ترفض clone(CLONE_NEWUSER).
لتسهيل الأمر، يحتوي هذا المستودع على نسخة من هذا الملف التعريفي في more-restricted.json، وملف Butane الذي ينشئ كائن MachineConfig سينشر هذا الملف التعريفي على العمال.
استخدم ملف pod مثال الذي يحتوي على:
securityContext:
seccompProfile:
type: Localhost
localhostProfile: more-restricted.json
نحصل على:
$ oc logs pod/cve-2021-22555
[+] Linux Privilege Escalation by theflow@ - 2021
[+] STAGE 0: Initialization
[*] Setting up namespace sandbox...
[-] unshare(CLONE_NEWUSER): Operation not permitted
وهذا يجب أن يجعل الاستغلال غير قابل للوصول.
ومع ذلك، يتطلب هذا اختيار الـ pods. لا يزال TODO: استكشاف ما إذا كان يمكن جعل سياسة seccomp إلزامية عبر SecurityContextConstraint، أو إذا كنا بحاجة إلى خطاف قبول متحول (mutating admission webhook).