Der Artikel demonstriert die Implementierung eines minimalen Linux-Container-Runners in rund 570 Zeilen C-Code (contained.c), um untrusted Code mithilfe nativer Kernel-Primitive zu isolieren. Das Programm kombiniert Namespaces, Cgroups (v1), Capability-Reduktion, pivot_root-Mount-Manipulationen und Seccomp-System-Call-Filterung. Es verdeutlicht gezielt, welche Berechtigungen und Kernel-Schnittstellen beim Betrieb von Containern kritisch sind.
Wichtigste Punkte
Namespaces: Einsatz von clone() mit den Flags CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWNET, CLONE_NEWIPC, CLONE_NEWUTS und CLONE_NEWCGROUP zur strikten Isolation von Prozessbäumen, Netzwerken und Hostnamen.
Cgroups (v1): Ressourcenschranken für Speicher (memory.limit_in_bytes auf 1 GB), Kernel-Speicher (memory.kmem.limit_in_bytes auf 1 GB), CPU-Anteil (cpu.shares auf 256), Prozessanzahl (pids.max auf 64) und Block-I/O-Gewichtung (blkio.weight auf 10).
Capabilities: Gezieltes Entfernen gefährlicher Root-Privilegien (z. B. CAP_SYS_ADMIN, CAP_MKNOD, CAP_SYS_RAWIO, CAP_DAC_READ_SEARCH, CAP_SETFCAP) aus dem Bounding- und Inheritable-Set, um Privilege Escalations zu blockieren.
Mount-Isolation: Remounten aller Dateisysteme mit MS_PRIVATE gefolgt von pivot_root, um das Root-Verzeichnis des Containers auf ein temporäres Verzeichnis zu beschränken und das alte Root auszuhängen.
Seccomp-Filterung: System-Call-Blacklisting mittels libseccomp, um gefährliche Operationen wie chmod/fchmod mit Setuid/Setgid-Bits, ptrace, userfaultfd, unshare(CLONE_NEWUSER) und ioctl(TIOCSTI) zu verhindern.
Ressourcen-Limits: Begrenzung der maximalen Dateideskriptoren pro Prozessbaum auf 64 (FD_COUNT) via setrlimit (RLIMIT_NOFILE), um eine Erschöpfung der Host-Ressourcen zu verhindern.
Diskussions-Highlights
Sicherheitsgrenzen: In den Kommentaren besteht breite Einigkeit darüber, dass standardmäßige Linux-Container keinen verlässlichen Sicherheits-Boundary (Sicherheitsgrenze) darstellen, da sie sich den Host-Kernel teilen und anfällig für Kernel-LPE-Schwachstellen (Local Privilege Escalation) sind.
Moderne Alternativen: Als sicherere Alternativen zu reinen Linux-Containern werden moderne Sandboxing-Technologien wie Firecracker (MicroVMs), gVisor (User-Space-Kernel zur System-Call-Emulation) und Kata Containers (VM-basierte Container) diskutiert.
Produktionskomplexität: Mehrere Kommentatoren weisen darauf hin, dass die Integration von Systemen wie Kata Containers oder Firecracker in Kubernetes-Cluster extrem komplex ist, weshalb in der Praxis oft direkt auf rohe VMs oder spezifische Cloud-Lösungen zurückgegriffen wird.
Glossar
Namespace: Ein Linux-Kernel-Feature, das globale Systemressourcen (wie Prozess-IDs, Netzwerkschnittstellen oder Mounts) virtualisiert, sodass Prozesse isolierte Sichten auf das System erhalten.
Cgroups (Control Groups): Ein Kernel-Mechanismus zur Begrenzung, Priorisierung und Messung des Ressourcenverbrauchs (CPU, Arbeitsspeicher, Festplatten-I/O) von Prozessgruppen.
Capabilities: Eine feingranulare Aufteilung der traditionellen Superuser-Privilegien (Root) in einzelne Rechte, um Prozesse nach dem Prinzip der minimalen Privilegien einzuschränken.
Seccomp (Secure Computing Mode): Ein Linux-Kernel-Sicherheitsmechanismus, mit dem Prozesse die von ihnen aufrufbaren Systemaufrufe (Syscalls) filtern und blockieren können.
pivot_root: Ein Systemaufruf, der das Root-Dateisystem eines Prozesses atomar durch ein neues ersetzt und das alte Dateisystem in ein Unterverzeichnis verschiebt, um es auszuhängen.
User Namespace: Ein spezieller Namespace zur Isolation von Benutzer- und Gruppen-IDs (UID/GID), der es unprivilegierten Nutzern erlaubt, innerhalb eines Containers administrative Root-Rechte zu besitzen.
ptrace: Ein mächtiger Systemaufruf zur Prozessinspektion und -steuerung (wichtig für Debugger), der in Kombination mit Seccomp historisch zu Sandbox-Ausbrüchen missbraucht werden konnte.
userfaultfd: Ein Systemaufruf, der es dem Anwendungsprogramm ermöglicht, Seitenfehler (Page Faults) im Userspace zu behandeln, was jedoch in einigen Kernel-Exploits für Race Conditions missbraucht wurde.
MicroVM: Eine minimalistische virtuelle Maschine, die für die Ausführung isolierter Workloads optimiert ist und im Gegensatz zu traditionellen VMs auf unnötige Legacy-Hardware-Emulation verzichtet.