runc
runc — референсная имплементация OCI runtime-spec. Написан на Go, извлечён из Docker в 2015. То что реально создаёт namespaces и cgroups и запускает процесс.
Что делает
- Читает
config.json(OCI runtime-spec) из bundle. - Создаёт namespaces (clone/unshare).
- Настраивает cgroups.
- Применяет seccomp/apparmor/selinux профили.
- Делает pivot_root в rootfs.
- 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 | Язык | Особенность |
|---|---|---|
| runc | Go | референс |
| crun | C | в 2× быстрее, меньше памяти |
| youki | Rust | memory-safe |
| runsc (gVisor) | Go | user-space kernel — доп. изоляция |
| kata-runtime | Go | полная VM (QEMU/Firecracker) |
| Firecracker | Rust | micro-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 ужесточают ещё.