
Контейнеризированный репродуктор для повышения привилегий в Linux (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, развертывающий этот профиль на рабочих узлах.
Используйте пример файла пода, который содержит:
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
Это должно сделать эксплойт недоступным.
Однако это требует согласия подов. Ещё TODO: Исследовать, можно ли сделать политику seccomp обязательной через SecurityContextConstraint, или нужен изменяющий вебхук допуска.