runc

runc — референсная имплементация OCI runtime-spec. Написан на Go, извлечён из Docker в 2015. То что реально создаёт namespaces и cgroups и запускает процесс.

Что делает

  1. Читает config.json (OCI runtime-spec) из bundle.
  2. Создаёт namespaces (clone/unshare).
  3. Настраивает cgroups.
  4. Применяет seccomp/apparmor/selinux профили.
  5. Делает pivot_root в rootfs.
  6. exec на процесс.

Использование напрямую

# bundle
mkdir mycontainer && cd mycontainer
docker export $(docker create alpine) | tar -x -C rootfs
runc spec  # генерит config.json

# запустить
sudo runc run mycontainer

Альтернативные OCI-runtime

RuntimeЯзыкОсобенность
runcGoреференс
crunCв 2× быстрее, меньше памяти
youkiRustmemory-safe
runsc (gVisor)Gouser-space kernel — доп. изоляция
kata-runtimeGoполная VM (QEMU/Firecracker)
FirecrackerRustmicro-VM (AWS Lambda)

Уязвимости

CVE-2019-5736

Malicious контейнер мог перезаписать сам бинарь runc на хосте через /proc/self/exe. Всем срочный апдейт.

CVE-2024-21626

File descriptor leak — доступ к хостовой файловой системе через /proc/self/fd/*.

seccomp default

runc по умолчанию блочит ~60 syscalls (mount, kexec, ptrace...). Docker/Podman ужесточают ещё.

См. также

← на главную