Attacker
dokuru-lab-baseline
The vulnerable web app. You trigger every payload from inside this container — cryptominer, memory blast, secret theft, proxy sabotage.
Container isolation lab
A three-container playground that stays intentionally vulnerable. You trigger payloads from dokuru-lab-baseline, and Dokuru changes what that container can see and how much it can consume — without rewriting the app.
The setup
Attacker
dokuru-lab-baseline
The vulnerable web app. You trigger every payload from inside this container — cryptominer, memory blast, secret theft, proxy sabotage.
Neighbor
victim-checkout
A second container Dokuru must protect. Holds POSTGRES_PASSWORD and serves a checkout API that should keep responding through every blast.
Signal
customer-traffic
An out-of-band probe that hits the neighbor on a loop. Its latency feed becomes the customer truth in Customer Live View.
01 Blast radius
Each scenario runs from inside dokuru-lab-baseline. Open the terminal sidebar to follow stdout/stderr while the customer signal updates live.
Real customer path
waitingLatency is sampled by the customer-traffic sidecar hitting the neighbor victim-checkout. Even when the attacker lab steals CPU or memory, this signal originates from a separate container so blast radius is observable end-to-end.
Probe victim-checkout directly to confirm the neighbor service is healthy before any payload runs.
Saturate available CPU cores with short-lived miners. Watch Active burners and customer latency when no CPU quota is configured.
Start a child process that holds 1280 MiB. Use Stop payload to terminate it; with rule 5.11, only that process is OOM-killed.
Locate the postgres neighbor PID and read /proc/<pid>/environ to leak POSTGRES_PASSWORD.
Send SIGSTOP to the host caddy process — the lab UI disconnects briefly until an automatic SIGCONT resumes it. Use as a fallback only.
02 Live monitor
Streamed over /ws/monitor straight from dokuru-lab-baseline. See the exact limits and isolation status below.
PID sleepers: 0. Run PID bomb and watch this climb.
03 Namespace isolation
CIS Docker Benchmark rules 2.10, 5.16, 5.17, 5.21, 5.31. Capture proof output before and after Dokuru recreates the container.
uid_map starts as 0 0. After Dokuru userns-remap, root maps to a host subuid.
Before hardening, host processes are visible. After the fix, the process list is container-scoped.
Compare /proc/self/ns/* before and after Dokuru recreates the container.
04 Cgroup controls
CIS Docker Benchmark rules 5.11, 5.12, 5.29. Tune inputs, run pressure, then read the live monitor while Dokuru applies mem_limit, cpu_shares, and pids_limit.
Starts a child process that holds memory until Cleanup or Stop payload.
Kill sleeper, CPU, and memory pressure processes to reset the environment.
05 Evidence
Side-by-side comparison of container isolation. The application remains vulnerable, but the blast radius is strictly contained.
Runtime snapshot of the container's isolation boundary — which user identity it holds, which namespaces it's confined to, and whether resource limits are actively enforced.
Observable differences before and after Dokuru applies container hardening rules. The application workload remains unchanged; only the isolation boundary shifts.
docker inspect dokuru-lab-baseline