
CVE-2021-22555 Linux権限昇格のためのコンテナ化された再現ツール。seccomp緩和プロファイルと、KubernetesおよびOpenShiftクラスター向けのデプロイメントガイドを提供します。
まず、こちらのエクスプロイトコードを便利なプリビルドコンテナとしてまとめたものです: https://github.com/google/security-research/tree/master/pocs/linux/cve-2021-22555
プリビルドコンテナ: quay.io/cgwalters/cve-2021-22555
強力な緩和策として、clone(CLONE_NEWUSER) を拒否する seccomp を有効にすることが挙げられます。アップストリームの 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 ファイル として含めています。この 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
これにより、エクスプロイトが到達不能になるはずです。
ただし、この方法では Pod がオプトインする必要があります。まだ未解決の課題:seccomp ポリシーを SecurityContextConstraint で必須にできるかどうか、またはミューテーティングアドミッション Webhook が必要かどうかを調査する必要があります。