Zum Inhalt springen
← Alle Beiträge
· 4 Min. Lesezeit· Von

KI-Coding-Agents in Docker-Sandboxes isolieren: sicher und reproduzierbar

Wie Sie Claude Code, Codex & Co. in wegwerfbaren Containern oder microVMs absichern – von Docker-Flags über gVisor bis zu Docker Sandboxes (sbx).

DockerSandboxingKIClaude CodegVisorSecurityDevOpsSelf-Hosting

KI-Coding-Agents (Claude Code, Codex CLI u. a.) haben schreibenden Zugriff auf das Dateisystem, führen beliebige Shell-Befehle aus und können bei uneingeschränktem Netzwerkzugriff Daten nach außen übertragen. Der Hugging-Face-Vorfall vom Juli 2026 macht das anschaulich: Eine Tailscale-Analyse rekonstruierte 17.600 Angreifer-Aktionen, 136 aus einem Kubernetes-Secret gestohlene Credentials – und 181 unberechtigte Nodes im Corporate-Tailnet. Der Angriffsvektor war kein Rootkit, sondern schlicht mangelnde Egress-Kontrolle in einer automatisierten Umgebung.

Dieser Beitrag zeigt, wie Sie einen Coding-Agent in drei Isolationsstufen absichern: von einfachen Docker-Flags für netzwerklose Tasks bis zur microVM, wenn der Agent selbst Docker braucht.

Was Sandboxing für Agents bedeutet

Sandboxing heißt hier: den Agent in einem kurzlebigen, wegwerfbaren Container oder einer microVM laufen zu lassen, der genau das darf, was er braucht – und nichts mehr. Das bringt drei Vorteile: Reproduzierbarkeit (keine „läuft nur bei mir"-Situation), Filesystem-Isolation (der Agent kann nicht außerhalb seines Workspaces schreiben) und Netzwerk-Egress-Kontrolle (keine unbeabsichtigten API-Calls an externe Dienste).

Die Faustregel: Je größer die Autonomie des Agents und je sensibler die Umgebung, desto stärker sollte die Isolation sein.

Drei Isolationsstufen

Stufe 1  Docker-Flags (--cap-drop, --read-only, ...)  einfachste Haertung, netzwerklose Tasks
Stufe 2  gVisor-Runtime (runsc)                       Syscall-Isolation im User-Space
Stufe 3  Docker Sandboxes (sbx)                       eigener Kernel, DinD sicher moeglich

Stufe 1: Docker-Flag-Härtung

Für einen Agent, der ausschließlich lokal arbeitet – keine API-Calls, kein Docker – genügt eine Kombination aus Standard-Flags:

docker run --rm \
  --read-only \
  --tmpfs /tmp \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  --memory 512m \
  --cpus 1.0 \
  -v "$PWD/workspace":/workspace:rw \
  -v "$PWD/tools":/tools:ro \
  myimage

Was diese Flags tun:

  • --read-only + --tmpfs /tmp: Das Root-Filesystem ist schreibgeschützt; nur /tmp (im RAM, nicht persistent) ist beschreibbar.
  • --cap-drop ALL: Alle Linux Capabilities entfernt – kein CAP_NET_RAW, kein CAP_SYS_PTRACE, kein CAP_DAC_OVERRIDE.
  • --security-opt no-new-privileges: Verhindert Privilege Escalation über setuid-Binaries.
  • -v ...:ro / :rw: Read-only-Tools und beschreibbarer Workspace sauber getrennt.

Das Netzwerk wird hier absichtlich nicht gesperrt: --network none macht Claude Code sofort nicht mehr startfähig, da die CLI api.anthropic.com für jeden API-Call benötigt. Wenn Sie den Egress einschränken möchten, setzen Sie iptables-Regeln mit einer Allowlist für die benötigten Endpunkte – die fertige Vorlage dazu liefert der offizielle Dev Container (Stufe 3).

Stufe 2: gVisor-Runtime

gVisor ist ein User-Space-Kernel von Google. Statt Syscalls direkt an den Host-Kernel weiterzureichen, verarbeitet ein User-Space-Prozess (runsc) sie vorab. Ein Syscall-Exploit im Container erreicht damit den Host-Kernel nicht.

Installation unter Ubuntu (Docker Engine 29.x):

curl -fsSL https://gvisor.dev/archive.key | sudo gpg --dearmor \
  -o /usr/share/keyrings/gvisor-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/gvisor-archive-keyring.gpg] \
  https://storage.googleapis.com/gvisor/releases release main" \
  | sudo tee /etc/apt/sources.list.d/gvisor.list > /dev/null

sudo apt-get update && sudo apt-get install -y runsc
# Das Paket registriert runsc beim Docker-Daemon automatisch (post-install Script).
# Falls nicht (z. B. Docker war beim Install gestoppt):
#   sudo runsc install && sudo systemctl restart docker
sudo systemctl restart docker

Anschließend genügt --runtime=runsc beim docker run:

docker run --runtime=runsc --rm \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  --memory 512m \
  -v "$PWD/workspace":/workspace:rw \
  myimage

Der Overhead: leicht erhöhte CPU-Last und Netzwerklatenz, da der Netzwerk-Stack im User-Space läuft. Für typische Coding-Agent-Tasks fällt das kaum ins Gewicht.

Stufe 3: Docker Sandboxes (sbx)

Sobald der Agent selbst docker build oder docker run aufruft – Claude Code tut das regelmäßig –, versagt die Flag-Härtung. Docker-in-Docker erfordert privilegierten Modus, was die Isolation aufhebt. Die Lösung: ein eigener Kernel pro Session in einer microVM.

Docker Sandboxes (sbx) ist ein kostenloses, standalone Tool (kein Docker Desktop nötig). Jeder Aufruf startet eine microVM mit eigenem Docker-Daemon; der aktuelle Projektordner wird hinein synchronisiert.

# Installation (Ubuntu, Docker Engine 29.x)
curl -fsSL https://get.docker.com | sudo REPO_ONLY=1 sh
sudo apt-get install docker-sbx

# Agent starten
cd ~/mein-projekt
sbx run claude

Die Isolation in der Übersicht:

+---------------------------------+
|  Host (Linux / macOS / Win)     |
|                                 |
|  +---------------------------+  |
|  |  microVM (KVM / HVF)      |  |
|  |                           |  |
|  |  +---------------------+  |  |
|  |  |  Docker-Daemon      |  |  |
|  |  +---------------------+  |  |
|  |  |  Agent-Container    |  |  |
|  |  |  /workspace (sync)  |  |  |
|  |  +---------------------+  |  |
|  +---------------------------+  |
|                                 |
|  kein gemeinsamer Host-Kernel   |
+---------------------------------+

Der Agent kann Container starten, Packages installieren und das Dateisystem beliebig nutzen – alles innerhalb der microVM. Zum Host-Kernel gibt es keinen Pfad.

Drei typische Stolperfallen

1. Docker-Socket-Mount bricht die Isolation. -v /var/run/docker.sock:/var/run/docker.sock erlaubt dem Agent, privilegierte Container auf dem Host zu starten – vollständiger Sandbox-Break. Den Socket niemals mounten; wenn Docker-in-Docker nötig ist, sbx oder Sysbox verwenden.

2. --network none macht Agent-CLIs nicht startfähig. Coding-Agent-CLIs brauchen mindestens Zugriff auf ihre API-Endpunkte. Kein Pauschalverbot, sondern eine Egress-Allowlist: Der offizielle Claude Code Dev Container liefert eine default-deny iptables-Firewall mit Allowlist als fertige Vorlage.

3. Langlebige Credentials im Container. Selbst bei intakter Netzwerk-Isolation können API-Keys, die als Environment-Variablen injiziert wurden, exfiltriert werden – der HF-Vorfall zeigt es. Nur kurzlebige, session-spezifische Tokens injizieren und Cloud-Metadata-Endpoints (AWS IMDS, GCP Metadata API) in der Firewall sperren.

Wie es weitergeht

Als nächster Schritt empfiehlt sich der offizielle Claude Code Sandbox-Environments-Artikel mit der fertigen Dev-Container-Vorlage inklusive Egress-Firewall. Für parallele Agent-Sessions oder den Einsatz auf Kubernetes: Anthropic Self-Hosted Sandboxes. Zur Vertiefung der Syscall-Ebene: gVisor User Guide und Docker Sandboxes Dokumentation.

Hinweis: Die Beiträge dieses Blogs werden unter Einsatz von KI erstellt und vor der Veröffentlichung redaktionell geprüft. Die redaktionelle Verantwortung trägt Emre Yurtbay (siehe Impressum).

Projekt besprechen