https://chacker.pl/
Co jeśli znajdziemy się w środowisku, w którym mamy możliwość wykonywania poleceń, ale nie mamy bezpośredniego dostępu do procesu Docker? Może obrazek by pomógł; Rysunek przedstawia ścieżkę ataku, w której możemy uciec z kontenera za pomocą prostej sekwencji ucieczki.

Tutaj znajdujemy pewną lukę w kontenerze i możemy wykonywać polecenia w kontenerze. Przyjrzyjmy się sekwencji ucieczki kontenera, która została po raz pierwszy ujawniona przez Felixa Wilhelma11 i demonstruje prosty problem z montowaniem chroot. Kontynuując poprzednie zajęcia laboratoryjne, obecnie znajdujemy się w kontenerze o nazwie target_web_1 na zdalnej instancji Dockera. Stąd uruchomimy zlokalizowany exploit przy użyciu potomnych grup cgroups, które umożliwiają nam wykonywanie poleceń systemu operacyjnego na hoście:

Pierwsze polecenie ustawia katalog na /sys/fs/cgroup/rdma (1), czyli katalog cgroups v1 odwołujący się do bezpośredniej pamięci współdzielonej przez wszystkie kontenery. Stąd tworzony jest katalog o nazwie w, który utworzy kolejną potencjalną grupę cgroup (tę po prostu nazywa się x (2). Grupy cgroup w v1 można zagnieżdżać według typu, a nie według procesu, więc utworzenie folderu w tym miejscu tworzy potencjalną nową grupę cgroup, po prostu bez odniesień. Flaga notification_on_release (3) informuje jądro, że wykona ostatnie polecenie wymienione w pliku release_agent. Jeśli możemy kontrolować plik release_agent, mamy wykonanie polecenia na hoście. Rozważmy, w jaki sposób jądro musiałoby znaleźć tę lokalizację: musiałoby znać nie lokalizację chroot pliku, ale rzeczywistą lokalizację pliku. Jak znaleźć lokalizację ostatniego polecenia cmd do uruchomienia? Ostateczny katalog roboczy hosta to ostatnia warstwa w systemie OverlayFS, do której zwykle odwołuje się katalog diff. Możemy go znaleźć, używając pliku mtab, aby zlokalizować lokalizację naszego systemu plików nakładki (4). Gdy już to wiemy, mamy kilka dodatkowych przeszkód. Po pierwsze, potrzebujemy lokalizacji do przechowywania naszych danych wyjściowych wewnątrz kontener; pomyśl o tym jako o sposobie wysyłania wiadomości z hosta do jądra. Możemy użyć do tego pliku (w naszym przypadku /output (5)). Następnie musimy poinformować release_agent o pliku do uruchomienia. W naszym przykładzie /cmd (6) to polecenie do uruchomienia, a /output przechowuje nasze dane wyjściowe. Ostatnim krokiem jest uczynienie polecenia wykonywalnym i poinformowanie cgroup, którą utworzyliśmy w /w, aby zakończyła działanie. (7) Możemy to zrobić, przechowując 0 w /w/cgroup.procs, co instruuje jądro, że cgroup może teraz zakończyć działanie. Możemy nawet odczytać zawartość tego wyjścia po zatrzymaniu się na 1 sekundę, aby umożliwić systemowi hosta wykonanie zadania (8). Dlaczego jest to możliwe? Jak możemy wykonać te polecenia? Przede wszystkim system cgroups v1 musi być na miejscu, co będzie miało miejsce przez jakiś czas, ponieważ jądro Linux nie wprowadziło cgroups v2 do wersji jądra 4.5 i nie było w głównej dystrybucji do Fedory 31. Ubuntu 18.04 LTS i 20.04 LTS nadal używają cgroups v1, podobnie jak wiele dystrybucji RedHat, które są nadal używane. Następną rzeczą, której potrzebujemy, jest flaga –privilege lub możliwości jądra, które umożliwiają montowanie. To tylko jeden z wielu przykładów, w których atak jądra może doprowadzić do naruszenia bezpieczeństwa systemu. Czy kiedykolwiek widziałeś jakieś exploity jądra w środowisku naturalnym, które mogą być również narzędziem tego?
Podsumowanie
Kontenery są używane jako mechanizm wspomagający skalowanie architektur i zapewniający odporność oprogramowania. Kontenery wymieniają bezpieczeństwo na wydajność operacyjną, a ten rozdział podkreśla wiele luk, na które możemy natrafić w środowisku naturalnym. W tym rozdziale omówiono komponenty znajdujące się w kontenerach i sposoby ich potencjalnego wykorzystania. Następnym razem, gdy znajdziesz się w stosie aplikacji, pierwszą rzeczą, którą należy sprawdzić, może być to, czy znajdujesz się w środowisku kontenerowym. Możesz mieć możliwość ucieczki z tego środowiska i przejścia na zewnątrz do innych części architektury z mniejszym wysiłkiem, niż początkowo sądzono.