Runc and CVE-2019-5736

By Jan Kappert / 12 februari 2019

Kwetsbaarheid in runc gevonden, wat nu?!  

Er is een fout gedetecteerd in runc waardoor een schadelijke container toegang op rootniveau op de hostcomputer kan krijgen.  
 
Dit beveiligingslek raakt zowel de docker– als runc-pakketten die beschikbaar zijn op Red Hat Enterprise Linux 7, die worden geleverd via het kanaal Extra’s. OpenShift Container Platform (OCP) 3.x is afhankelijk van deze pakketten, afkomstig van Red Hat Enterprise Linux 7 Extras en wordt ook beïnvloed.

Wat is Runc 

Heel kort, runc is een low-level tool die het zware werk doet om containers te starten. Andere tools als Docker, Containerd en CRI-O draaien op Runc om zaken als data formatting en serialisatie aan te pakken. Runc is de kern van al deze systemen. Kubernetes zit op zijn beurt weer bovenop deze tools, Kubernetes zelf is niet kwetsbaar.  

Wat houdt de kwetsbaarheid in

Hoewel volledige details nog steeds zijn voorzien van embargo's om mensen de tijd te geven om te patchen, is de ruwe versie dat wanneer een proces als root (UID 0) in een container wordt uitgevoerd, dat proces een bug in runc kan misbruiken om root privileges te verkrijgen op de onderliggende hosts die de containers uitvoeren . Dit geeft hen vervolgens onbeperkte toegang tot de server en alle andere containers op die server. 

Als het proces in de container vertrouwd is (iets waarvan u weet dat het niet vijandig is) of niet wordt uitgevoerd als UID 0, is het beveiligingslek niet van toepassing. Het kan ook worden voorkomen door SELinux in enforced mode te draaien. RedHat Enterprise Linux, CentOS en Fedora hebben allemaal de juiste SELinux-rechten bij hun pakketten en worden daarom verondersteld niet te worden beïnvloed. De meest voorkomende risicobron is een attacker-controller container images van publieke repositories. 

Wat kun je er aan doen

Zoals met alle beveiligingsproblemen zijn er meerdere opties om het beveiligingslek te verminderen. Upgrade naar de laatste versie van runc die de oplossing bevat. Of controleer de policies in uw Openshift of Kubernetes omgeving. 

Aangezien de exploit UID 0 binnen de container vereist, is een directe beperking nodig om te zorgen dat al uw containers worden uitgevoerd als een niet-0 gebruiker. Dit is in te stellen in de container image of via uw podspecificatie: 

apiVersion: v1 

kind: Pod 

metadata: 

  name: run-as-uid-1000 

spec: 

  securityContext: 

    runAsUser: 1000 

  # ...

Ook is het mogelijk dit globaal te regelen via de PodSecurityPolicy:

apiVersion: policy/v1beta1 

kind: PodSecurityPolicy 

metadata: 

  name: non-root 

spec: 

  privileged: false 

  allowPrivilegeEscalation: false 

  runAsUser: 

    # Require the container to run without root privileges. 

    rule: 'MustRunAsNonRoot' 

Bovenstaande is niet nodig in OpenShift als er geen aparte policy’s zijn aangemaakt waarin je een user met UID 0 toelaat om iets te laten draaien in een container. 

Binnen OpenShift is het mogelijk om in te zien wie er gebruik mag maken om containers als UID 0 te laten starten met het volgende commando: 

oc describe scc anyuid  

Name:                                           anyuid 

Priority:                                       10 

Access: 

  Users:                                        system:serviceaccount:jx:jenkins,system:serviceaccount:jx:default 

  Groups:                                       system:cluster-admins 

Settings: 

  Allow Privileged:                             false 

  Allow Privilege Escalation:                   0xc4215c41ac 

  Default Add Capabilities:                     <none> 

  Required Drop Capabilities:                   MKNOD 

  Allowed Capabilities:                         <none> 

  Allowed Seccomp Profiles:                     <none> 

  Allowed Volume Types:                         configMap,downwardAPI,emptyDir,persistentVolumeClaim,projected,secret 

  Allowed Flexvolumes:                          <all> 

  Allowed Unsafe Sysctls:                       <none> 

  Forbidden Sysctls:                            <none> 

  Allow Host Network:                           false 

  Allow Host Ports:                             false 

  Allow Host PID:                               false 

  Allow Host IPC:                               false 

  Read Only Root Filesystem:                    false 

  Run As User Strategy: RunAsAny 

    UID:                                        <none> 

    UID Range Min:                              <none> 

    UID Range Max:                              <none> 

  SELinux Context Strategy: MustRunAs 

    User:                                       <none> 

    Role:                                       <none> 

    Type:                                       <none> 

    Level:                                      <none> 

  FSGroup Strategy: RunAsAny 

    Ranges:                                     <none> 

  Supplemental Groups Strategy: RunAsAny 

    Ranges:                                     <none> 


Meer informatie

Onderstaande link bevat meer informatie  

https://access.redhat.com/security/vulnerabilities/runcescape

About the author

Jan Kappert

Jan is per 1 maart 2019 DevOps Engineer met focus op OpenShift! Hij zoekt altijd naar manieren om zijn skills te verbeteren! Ervaring? Red Hat OpenShift, Kubernetes, Docker, Red Hat Linux (RHCE), Red Hat clustering, Red Hat virtualization (RHEV), KVM virtualization, VMWare, Hyper-V, Openstack, Automation (Ansible, Puppet, RedHat Satellite, Foreman), Red Hat Cloudforms, CentOS Linux, Fedora Linux, Debian Linux, Ubuntu Linux, Monitoring (Elastic Stack, Nagios, Zabbix, Observium), Security (firewall), Storage (GlusterFS, Red Hat Storage, Equallogic, SAN), SEP Backup


>