
Co znajdziesz w tym artykule?
- 1 Wprowadzenie do problemu / definicja luki
- 2 W skrócie
- 3 Kontekst / historia / powiązania
- 4 Analiza techniczna / szczegóły luki
- 5 Praktyczne konsekwencje / ryzyko
- 6 Rekomendacje operacyjne / co zrobić teraz
- 7 Różnice / porównania z innymi przypadkami
- 8 Podsumowanie / kluczowe wnioski
- 9 Źródła / bibliografia
Wprowadzenie do problemu / definicja luki
Na początku listopada 2025 r. ujawniono trzy poważne podatności w runC – referencyjnej implementacji OCI wykorzystywanej m.in. przez Dockera, containerd i CRI-O. Każda z nich może prowadzić do pełnego przełamania izolacji kontenera i uzyskania dostępu do systemu-gospodarza (hosta) z uprawnieniami roota, głównie poprzez wymuszenie niebezpiecznych zapisów do plików w procfs. Łatki opublikowano w wersjach runC 1.2.8, 1.3.3 oraz 1.4.0-rc.3 i nowszych.
W skrócie
- Trzy CVE: CVE-2025-31133, CVE-2025-52565, CVE-2025-52881.
- Wspólny efekt: możliwość skierowania zapisu wykonywanego przez runC do „wrażliwych” plików w /proc (np.
.../proc/sysrq-trigger), co otwiera drogę do eskalacji i ucieczki z kontenera. - Zakres: dotyczy praktycznie wszystkich linii runC stosowanych pod Linuksem (szczegóły wersji poniżej).
- Status: dostępne aktualizacje; dystrybutorzy i chmury publikują obrazy z łatami (Ubuntu, Red Hat, Google COS, AWS EKS).
Kontekst / historia / powiązania
Zespół runC poinformował społeczność (kanały oss-security) o trzech podatnościach wysokiej wagi. W ciągu tego samego dnia wydano poprawione wydania (1.2.8/1.3.3/1.4.0-rc.3). Producenci dystrybucji Linuksa i dostawcy chmur zaczęli sukcesywnie wypychać aktualizacje obrazów node’ów Kubernetes i paczek systemowych.
Analiza techniczna / szczegóły luki
1) CVE-2025-31133 — nadużycie maskedPaths z /dev/null (maskowanie za pomocą bind-mount)
- Mechanizm: runC maskuje wrażliwe ścieżki bind-mountem /dev/null nad docelowym plikiem.
- Luka: jeśli atakujący podmieni
/dev/nullna dowiązanie symboliczne wskazujące na plik pod /proc, runC nie weryfikuje dostatecznie źródła i zamountuje cel symlinku RW – przez co uzyskuje się zapis do zabronionych plików procfs. - Zasięg: dotyczy wszystkich znanych wersji runC przed poprawką.
2) CVE-2025-52565 — błąd w bind-mouncie /dev/console
- Mechanizm: podczas tworzenia
/dev/consolerunC bind-montuje odpowiedni /dev/pts/$n do wnętrza kontenera. - Luka: wyścig i brak poprawnych sprawdzeń pozwalają na podmianę
/dev/pts/$nna symlink — runC zamountuje wtedy nieoczekiwany cel nad/dev/console, zanim zostaną nałożone maskedPaths/readonlyPaths, otwierając furtkę do RW na krytycznych plikach. - Zasięg: od 1.0.0-rc3 w górę, obejmuje szerokie spektrum wydań.
3) CVE-2025-52881 — procfs write redirect i „gadżety zapisu” (arbitrary write)
- Mechanizm: przy sprzyjających warunkach (m.in. wyścigi na współdzielonych montach), runC można nakłonić do przekierowania własnych zapisów do /proc na inne cele w procfs, de facto uzyskując dowolny zapis do niebezpiecznych plików.
- Skutek uboczny: omijanie LSM re-labeling (np. AppArmor/SELinux) znane z wcześniejszych prac — ułatwia łańcuchowanie z 31133.
- Zasięg: szeroki (dotyka wspieranych linii przed aktualizacją).
Wersje naprawione
- runC 1.2.8, 1.3.3 i 1.4.0-rc.3 (i nowsze) zawierają łatki na wszystkie trzy CVE. Jeżeli korzystasz z Dockera/containerd/CRI-O, to po stronie hosta liczy się wersja binarki runC dostarczana przez system albo obraz node’a.
Praktyczne konsekwencje / ryzyko
- Ucieczka z kontenera: możliwość nadpisania/zapisania do kluczowych wpisów procfs (
/proc/sysrq-trigger,/proc/self/attr/..., itp.) umożliwia m.in. reset systemu, manipulacje bezpieczeństwem jądra czy obejście etykiet LSM — finalnie root na hoście. - Łańcuchowanie: 52881 może neutralizować warstwę LSM, co zwiększa skuteczność 31133.
- Wejście w wektor przez pipeline’y buildowe: podatności da się wyzwalać podczas buildów (np.
docker buildx) i przy niestandardowych konfiguracjach montowań — realne ryzyko dla CI/CD. - Brak exploitów 0-day w obiegu w momencie publikacji, ale wymagany jest natychmiastowy patch – powierzchnia ataku jest powszechna (runC jest „wszędzie”).
Rekomendacje operacyjne / co zrobić teraz
0. Szybka walidacja środowiska
Sprawdź, jaką wersję runC faktycznie uruchamia host/worker:
# na hoście
runc --version
# jeśli runc dostarcza dystrybucja:
dpkg -l | grep -E 'runc' # Debian/Ubuntu
rpm -q runc # RHEL/CentOS/Fedora/SUSE
# containerd
ctr version | grep -i runc
crictl info | jq '.config.containerd.runtimes'
# Kubernetes node (przez SSH na worker)
kubelet --version
1. Aktualizacje (preferowane)
- System/obrazy node’ów: zaktualizuj paczki
runc/containerdlub przeprowizjonuj AMIs/OS images dla klastrów (EKS/AKS/GKE/COS ma już rollout z łatą). - Minimalne bezpieczne wersje runC: 1.2.8 / 1.3.3 / 1.4.0-rc.3 (lub nowsze).
- Przykładowe ścieżki:
- Ubuntu:
sudo apt-get update && sudo apt-get install --only-upgrade runc(USN-7851-1). - RHEL/SUSE:
sudo dnf update runc/zypper up runc(RHSA/SUSE advisory). - EKS: zaktualizuj node groups / wymuś rolling replace zgodnie z biuletynem AWS.
- Google COS/GKE: dobierz najnowszy cos-stable z notatek wydania.
- Ubuntu:
2. Dodatkowe twardnienie (gdy patch jeszcze w toku)
Poniższe nie zastępują aktualizacji, ale ograniczają ryzyko:
- User Namespaces (bez mapowania hostowego UID 0): uruchamiaj kontenery z root-less lub z remapowaniem UID/GID – uniemożliwia wielu ścieżkom zapisu do procfs dzięki DAC.
- Rootless Docker/Podman tam, gdzie to możliwe.
- Ogranicz niestandardowe montowania w
docker run,PodSpeci pipeline’ach buildowych (buildx) – polityki Admission Controller (OPA/Gatekeeper/Kyverno) blokującehostPath,--mount, nieautoryzowane bind-mounty,SYS_ADMIN,CAP_SYS_ADMIN. - LSM / seccomp / AppArmor/SELinux: włączone profile to wciąż bariera, choć 52881 redukuje ich skuteczność – traktuj to jako warstwę „Defense in Depth”.
- ReadOnlyRootFilesystem,
no-new-privileges, drop większości capabilities; brak--privileged. - RBAC: zablokuj możliwość tworzenia podów z niestandardowymi montami przez nieuprawnionych deweloperów.
3. Wykrywanie i obserwowalność
- Sygnatury EDR/eBPF/Falco pod kątem:
- Podejrzanych symlinków w
/dev/pts/*i podmian/dev/nullpodczas init kontenera. - Zapisów do plików /proc/ nietypowych dla workloadu (np.
*/proc/sysrq-trigger,*/proc/*/attr/*).
- Podejrzanych symlinków w
- Telemetria z auditd/BPF i korelacja z cyklem życia kontenerów. (Sysdig publikuje wskazówki detekcyjne oraz opis wektorów).
Przykładowa reguła Falco (szkic – dostosuj do środowiska):
- rule: Suspicious_Procfs_Write_From_Container
desc: "Zapis do krytycznych plików procfs przez proces w kontenerze"
condition: evt.type in (open,openat) and fd.name pmatch (
"/proc/sysrq-trigger",
"/proc/*/attr/*",
"/proc/sys/kernel/*"
) and container and (evt.arg.flags & O_WRONLY != 0 or evt.arg.flags & O_RDWR != 0)
output: "procfs write in container (user=%user.name proc=%proc.name file=%fd.name container=%container.id)"
priority: CRITICAL
tags: [container, mitre-privilege-escalation]
Różnice / porównania z innymi przypadkami
- Historyczne analogie: 52881 to „bardziej wyrafinowany” następca problemów z LSM relabel obserwowanych wcześniej (np. CVE-2019-19921). Wspólny motyw to przekierowanie zapisów wykonywanych przez sam runtime, co omija klasyczne sandboxowe ograniczenia procesu w kontenerze.
- Wobec CVE w Docker Desktop 2025 (SSRF/ECI): inna klasa – tam problem dotyczył środowiska desktop/WSL2 i API dockerd, tutaj mówimy o jądrze i procfs w runtime. (Wspólna nauka: aktualizacje toolchainu kontenerowego są krytyczne).
Podsumowanie / kluczowe wnioski
- Te trzy CVE w runC to fundamentalne problemy izolacji kontenera; aktualizacja runC do 1.2.8/1.3.3/1.4.0-rc.3 (lub nowszej) powinna być traktowana jak pilny changerequest na wszystkich hostach/workerach.
- Do czasu pełnego patcha: rootless/userns, blokady niestandardowych montów i wzmocnione monitorowanie procfs.
- Zadbaj o pipeline’y buildowe (buildx) i obrazy bazowe node’ów w chmurach – wielu dostawców już publikuje zaktualizowane obrazy, ale rollout bywa rozłożony w czasie.
Źródła / bibliografia
- BleepingComputer: przegląd i wersje naprawione (1.2.8/1.3.3/1.4.0-rc.3). (BleepingComputer)
- GitHub (opencontainers/runc) – release notes z opisem trzech CVE i kontekstem technicznym. (GitHub)
- NVD: karty CVE z opisem zakresu wersji i szczegółami (31133, 52565, 52881). (NVD)
- Advisory/dystrybutorzy: Ubuntu USN-7851-1; Red Hat RHSA-2025:19927; Google COS release notes; AWS Security Bulletin (EKS). (Ubuntu)
- Sysdig: analiza wektorów i wskazówki detekcyjne. (sysdig.com)