
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 पर आधिकारिक दस्तावेज़ों में वास्तव में चर्चा नहीं की गई है। हालाँकि, सुरक्षा गाइड में कम से कम इसका कुछ उल्लेख है, और यह ब्लॉग भी कुछ ऐसा ही करता है।
4.7 में cri-o एक डिफ़ॉल्ट 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: जाँच करें कि क्या SecurityContextConstraint के माध्यम से seccomp नीति को अनिवार्य बनाया जा सकता है, या क्या हमें म्यूटेटिंग एडमिशन वेबहुक की आवश्यकता है।