CNCK0NSULTAI-Truthuni0naiHackatonipIII ↗k0nsult.dev ↗ dla botówDomeny osobne, spięte siecią CNC + kernelem.
K0NSULT // ai-truth/ipIII
k0nsult.cloud / ai-truth / ipIII / playbook-container-escape

Playbook O — Container escape / K8s breach

Reagowanie na ucieczkę procesu z kontenera na hosta oraz kompromitację klastra Kubernetes: przejęty node, nadmierne uprawnienia RBAC, privileged pod, ClusterRoleBinding do cluster-admin. Playbook czysto defensywny — bez instrukcji eksploatacji, wyłącznie sygnały, izolacja, dowody i odbudowa zaufanego stanu. Priorytet typowy P1, podbijany do P0 przy potwierdzonym dostępie do hosta lub eskalacji do cluster-admin.

Jeśli workload ma dostęp do hosta — traktuj incydent jak breach całego noda, nie jednego poda.

Gdy kontener działa w trybie privileged, ma zamontowany socket CRI/Docker, hostPID/hostNetwork lub nadmierne RBAC, granica izolacji przestaje być gwarantowana. Zasada robocza tego playbooka: dopóki nie udowodnisz, że proces pozostał w namespace kontenera, zakładaj najgorszy scenariusz — dostęp do hosta.

Problem — dlaczego to priorytet

Kubernetes izoluje workloady przez namespace'y jądra, cgroups i RBAC — nie przez twardą granicę maszyny wirtualnej. Błąd konfiguracji (privileged pod, hostPath na /, ClusterRoleBinding do cluster-admin) potrafi zredukować tę izolację do zera. Skutki w środowisku bankowym/fintech:

Sygnały uruchamiające playbook

Nowe pody w kube-system

Nieoczekiwany pod w namespace systemowym lub DaemonSet uruchomiony bez zmiany w IaC/GitOps.

Privileged / host* pola

privileged: true, hostPID, hostNetwork, hostIPC, allowPrivilegeEscalation: true, runAsUser: 0 na workloadzie, który tego nie wymaga.

Niebezpieczne mounty

/var/run/docker.sock, /run/containerd/containerd.sock, /proc, /sys, /, /etc, /root, /var/lib/kubelet zamontowane do kontenera aplikacyjnego.

Świeże ClusterRoleBinding

Nowy binding do cluster-admin lub roli z * na verbs/resources, zwłaszcza przypięty do ServiceAccount aplikacji.

Anomalia na nodzie

Proces poza oczekiwanymi kontenerami (ps auxf), nieznane binarki, nietypowe połączenia wychodzące (ss -tulpn), modyfikacja systemd/cron/SSH.

Audit log kube-apiserver

Wpisy create clusterrolebinding, create pod z privileged, patch daemonset, częste exec do kontenerów spoza standardowego dostępu operacyjnego.

Runtime detection alert

Reguła Falco/Tetragon/eBPF: shell w kontenerze, zapis do /proc//sys//etc, dostęp do socketu CRI, proces z host namespace.

Nietypowy ServiceAccount

Token ServiceAccount używany z nieoczekiwanego IP/pod-a lub przypięty do wielu namespace'ów bez uzasadnienia.

Zasada rozróżnienia: sama obecność ryzykownego pola (privileged, hostPath) to ekspozycja konfiguracyjna — dopiero dowód aktywności na nodzie (nieznany proces, modyfikacja systemu, ruch wychodzący) podnosi sprawę do potwierdzonego escape. Brak dowodu na nodzie nie oznacza braku ryzyka — oznacza konieczność dalszej analizy w krokach 4-5.

Role i priorytet SEV

RolaOdpowiedzialność
IC (Incident Commander)decyzje, priorytet, komunikacja
Platform/K8s Engineercontainment na poziomie klastra i noda
SecOpskorelacja audit log, IoC, oś czasu
Forensicszebranie artefaktów przed rebuildem noda
App Ownerocena wpływu na workload i dane
Legal/DPOobowiązki regulacyjne
SEVWarunek
SEV1potwierdzony dostęp do hosta lub eskalacja do cluster-admin
SEV2privileged pod/hostPath aktywny, brak jeszcze dowodu aktywności na nodzie
SEV3nadmierne RBAC wykryte, workload nieaktywny lub już wygaszony
SEV4ryzykowna konfiguracja wykryta przed wdrożeniem (policy-as-code, CI gate)

Playbook — 9 kroków reakcji

SYGNAŁTRIAGEODCIĘCIE WORKLOADUIZOLACJA NODADOWÓDANALIZA ŚCIEŻKIERADYKACJAROTACJA + REBUILDZAMKNIĘCIE
Krok 1 — Przyjęcie i triage. Alert runtime detection (Falco/Tetragon), audit log lub zgłoszenie ręczne. Platform Engineer + SecOps potwierdzają zakres: pod, namespace, node, ServiceAccount. Wstępny SEV wg tabeli wyżej.
Krok 2 — Odcięcie workloadu. kubectl scale deploy <name> -n <ns> --replicas=0 lub, gdy wymagana szybka reakcja, kubectl delete pod <pod> -n <ns> --grace-period=0 --force. Jeśli planowana forensyka — najpierw snapshot/artefakty (krok 4), dopiero potem kasowanie.
Krok 3 — Izolacja noda. kubectl cordon <node> + kubectl drain <node> --ignore-daemonsets --delete-emptydir-data. Przy wysokim podejrzeniu escape: kubectl taint nodes <node> quarantine=true:NoSchedule i odcięcie egress noda na poziomie sieci poza wymaganymi endpointami IR. Zablokuj powiązane tokeny ServiceAccount (kubectl delete secret/serviceaccount).
Krok 4 — Zabezpieczenie dowodów. Z klastra: kubectl get all/secrets/cm/rbac -A -o yaml, kubectl get pods -A -o json, kubectl get events -A --sort-by=.lastTimestamp. Z poda: logi i describe. Z noda (jeśli dostępny bez ingerencji w ślad): journalctl, ps auxf, ss -tulpn, crictl ps -a/inspect. Hash + znacznik czasu → Evidence Layer.
Krok 5 — Analiza ścieżki kompromitacji. Sprawdź kolejno: securityContext poda (privileged, allowPrivilegeEscalation, runAsUser: 0, host*), zamontowane hostPath, RBAC (ClusterRoleBinding do cluster-admin, verbs/resources *, ServiceAccount na wielu namespace'ach), audit log (create clusterrolebinding, create pod privileged, patch daemonset, exec). Ustal, które z tych warunków były spełnione i w jakiej kolejności.
Krok 6 — Eradykacja. Usuń złośliwe/podejrzane zasoby: pod, deployment, DaemonSet, Job, ClusterRoleBinding. Zasada: nie sprzątać nazwy zasobu bez zrozumienia jak powstał — inaczej wektor wróci przy następnym GitOps sync.
Krok 7 — Rotacja sekretów. Rotuj: tokeny ServiceAccount, kubeconfigi, registry credentials, cloud credentials, hasła do baz danych, certyfikaty mTLS, sekrety CI/CD — wszystko, do czego dotknięty workload lub node miał potencjalny dostęp.
Krok 8 — Rebuild noda i recovery. Jeśli escape był możliwy — nie ufaj nodowi po incydencie. Bezpieczniejszy dowód kontroli niż ręczne czyszczenie: kubectl delete node <node> i reprovision przez IaC/autoscaler z czystego obrazu. Zweryfikuj digesty obrazów (kubectl get pods -A -o jsonpath='{..image}'), przywróć minimalne RBAC, włącz polityki admission, monitoruj 24–72h (nowe pody, bindingi, exec, egress, workloady privileged).
Krok 9 — Zamknięcie i hardening. Zamknij, gdy: podejrzane pody/bindingi usunięte, dotknięte nody odbudowane, sekrety zrotowane, audit nie pokazuje dalszej aktywności, polityki admission blokują pierwotną ścieżkę, RBAC zminimalizowany, monitoring potwierdza brak nowych anomalii. Postmortem → guardraile +1.

Ryzykowne pola konfiguracji

PoleRyzyko
privileged: truekontener działa z pełnymi uprawnieniami jądra hosta
allowPrivilegeEscalation: trueproces może uzyskać więcej uprawnień niż proces nadrzędny
runAsUser: 0proces działa jako root wewnątrz kontenera
hostPID / hostNetwork / hostIPCwspółdzielenie przestrzeni nazw hosta — widoczność/dostęp poza kontenerem
hostPath: /, /proc, /sys, /etc, /var/lib/kubeletbezpośredni zapis/odczyt systemu plików hosta
socket docker.sock / containerd.sockpełna kontrola nad runtime kontenerów na nodzie

Hardening po incydencie

Pod Security Admission (PSA)

Następca deprecjonowanego Pod Security Policy. Etykiety namespace: enforce=restricted, audit=restricted, warn=restricted — blokują privileged, hostPID/Network/IPC, hostPath dla większości workloadów.

OPA / Gatekeeper

Policy-as-code na poziomie admission controller — reguły odrzucające pody z Principal: "*", brakiem runAsNonRoot, niedozwolonym rejestrem obrazów lub obrazem bez podpisu. Egzekwowane przed wdrożeniem, nie po fakcie.

Seccomp

Profil RuntimeDefault (lub własny, minimalny) ograniczający dostępne wywołania systemowe kontenera — zawęża powierzchnię ataku na jądro hosta niezależnie od pozostałych ustawień.

Minimalny securityContext

runAsNonRoot: true, allowPrivilegeEscalation: false, readOnlyRootFilesystem: true, capabilities.drop: [ALL] jako domyślny szablon dla nowych workloadów.

NetworkPolicy default-deny

Domyślna blokada ingress/egress na poziomie namespace, z jawnym dopuszczeniem tylko wymaganych połączeń.

RBAC least privilege

Regularny audyt kubectl auth can-i --list --as=system:serviceaccount:<ns>:<sa>. Zakaz przypisywania cluster-admin do ServiceAccount aplikacji.

Runtime detection

Falco, Tetragon, auditd, telemetria eBPF, audit log kube-apiserver — reguły na shell w kontenerze, zapis do /proc//sys//etc, dostęp do socketu CRI, tworzenie privileged pod lub ClusterRoleBinding.

Image provenance

Weryfikacja digestów obrazów, skan podatności przed wdrożeniem, zakaz obrazów bez podpisu/atestu pochodzenia.

Flagi prawne i eskalacja

WarunekFlagaObowiązek
Dotknięty workload przetwarzał dane osoboweGDPR_PERSONAL_DATAOcena naruszenia — patrz zasada niżej
Potwierdzony dostęp do danych osobowych z poziomu hosta/klastraGDPR_BREACHRODO art. 33 — zgłoszenie do PUODO w 72h; art. 34 — zawiadomienie osób przy wysokim ryzyku
Podmiot to usługa kluczowa/ważnaNIS2_RELEVANTWczesne ostrzeżenie do CSIRT w 24h, zgłoszenie 72h, raport końcowy
Sekret/credential dający dostęp do systemu produkcyjnego był w zasięguSECRET_EXPOSURENatychmiastowa rotacja + wewnętrzna eskalacja bezpieczeństwa
Powiązanie z innymi playbookami: gdy container escape prowadzi do potwierdzonego ujawnienia danych osobowych, ten playbook sprzęga się z Playbookiem E (wyciek danych). Gdy wektorem wejścia był zależność/obraz z rejestru zewnętrznego — powiąż z Playbookiem F (supply chain). Gdy pierwotną przyczyną była ekspozycja chmurowa (np. publiczny endpoint K8s API) — powiąż z Playbookiem M (cloud misconfig).

Kryteria zamknięcia incydentu

Najkrótsza decyzja operacyjna. Jeśli istnieje dowód na container escape: cordon + drain + snapshot artefaktów + rebuild noda + rotacja sekretów + audyt RBAC. Nie ufaj nodowi po escape — proces mógł uzyskać uprawnienia hosta i zmodyfikować system poza kontrolą kube-apiserver.

Metryki skuteczności SYMULACJA

Dane demonstracyjne (demo). Poniższe wartości ilustrują format panelu, nie są rzeczywistymi pomiarami środowiska odbiorcy.
18 min
Mediana czasu do izolacji noda SYMULACJA
cel < 30 min od alertu
100%
Nodów po escape odbudowanych, nie „czyszczonych" SYMULACJA
zasada zero zaufania po escape
92%
Namespace'ów pod PSA restricted SYMULACJA
cel hardeningu
0
ServiceAccount aplikacji z cluster-admin SYMULACJA
cel RBAC least privilege

Powiązane strony

Zgłoś incydent

Formularz Intake uruchamiający ten playbook. → Incident Intake

Klasyfikacja

Reguły kierujące zdarzenie do Playbooka O. → Classification Engine

Cloud misconfig

Pokrewny wektor — błędna konfiguracja chmury/K8s API. → Playbook M

Supply chain

Sprzężenie, gdy wektorem wejścia był skompromitowany obraz/zależność. → Playbook F

Uwaga metodyczna: ten playbook jest wyłącznie defensywny — opisuje sygnały, containment, dowody i hardening, bez instrukcji eksploatacji. Ramki RODO/NIS2 opierają się na treści regulacji (norma), nie stanowią porady prawnej. Metryki oznaczone SYMULACJA są przykładowe, nie operacyjne. Wsparcie decyzyjne (decision-support) — nie zastępuje wewnętrznej procedury reagowania na incydenty ani oceny prawnej.