Hosted Docker isolation demo

Show the exploit, then show the boundary.

The app stays intentionally vulnerable. Dokuru should change what the container can see and how many resources it can consume.

UID map loading
PID namespace loading
PIDs current / max loading
Memory current / max loading

Demo board

Before / after evidence

Start with the WebSocket monitor, run one proof at a time, then read the live terminal stdout/stderr while Dokuru fixes are compared.

Live resource monitor

WebSocket reconnecting
PIDs Rule 5.29 proof
... / ...

PID sleepers: 0. Run PID bomb and watch this climb.

Memory Rule 5.11 proof
unavailable

Limit: unavailable

CPU Rule 5.12 proof
cpu.weight
...
cpu.max
...
burners
0
Namespace Rules 2.10, 5.16, 5.17, 5.21, 5.31
UID map
loading
PID ns
loading
Processes visible
...

Live terminal

WebSocket disconnected

This is the real stdout/stderr stream from commands and resource-pressure payloads running inside the vulnerable container.

waiting for terminal websocket...

Runtime evidence

Check

Use this card for the quick oral explanation: what user the app runs as, which namespaces it sees, and whether bind-mounted data is still writable after hardening.

User
loading
Userns
loading
cpu.weight
loading
cpu.max
loading

Namespace proof

Rules 2.10, 5.16, 5.17, 5.21, 5.31
UID remap

uid_map starts as 0 0. After Dokuru userns-remap, root maps to a host subuid.

PID namespace

Before hardening, host processes are visible. After the fix, the process list is container-scoped.

Namespace links

Compare /proc/self/ns/* before and after Dokuru recreates the container.

Cgroup pressure

Rules 5.11, 5.12, 5.29
How to prove PIDs

Watch pids.current in the live monitor, run the PID bomb, then compare before/after Dokuru. Before hardening it can spawn many sleepers; after rule 5.29 is fixed, pids.max is lower and spawning is capped or fails earlier.

Cleanup

Kill sleeper processes after PID tests.

Before / after proof

Screenshot guide

Use these exact changes as the explanation slide. The app remains vulnerable; the container boundary changes.

UID mapBefore: 0 0. After: remapped host UID range.
PID viewBefore: host process list. After: only container processes.
PIDsBefore: many sleepers spawn. After: pids.max caps the bomb.
MemoryBefore: unlimited or host-sized. After: explicit memory limit.
CPUBefore: default shares. After: explicit CPU shares/weight.
Inspect baseline docker inspect dokuru-lab