release_agent exploit - Relative Paths to PIDs
Aby uzyskać dalsze szczegóły, sprawdź wpis na blogu z https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Oto tylko streszczenie:
Technika opisuje metodę wykonywania kodu hosta z poziomu kontenera, pokonując wyzwania wynikające z konfiguracji sterowników magazynu, które utrudniają ścieżkę systemu plików kontenera na hoście, takie jak Kata Containers lub konkretne ustawienia devicemapper
.
Kluczowe kroki:
Lokalizacja identyfikatorów procesów (PID): Za pomocą symbolicznego łącza
/proc/<pid>/root
w pseudosystemie plików Linuxa można uzyskać dostęp do dowolnego pliku wewnątrz kontenera w odniesieniu do systemu plików hosta. Pozwala to ominąć konieczność znajomości ścieżki systemu plików kontenera na hoście.Brute Force PID: Wykorzystuje się podejście brute force do przeszukiwania PID-ów na hoście. Polega to na sekwencyjnym sprawdzaniu obecności określonego pliku w
/proc/<pid>/root/<file>
. Gdy plik zostanie znaleziony, oznacza to, że odpowiadający PID należy do procesu uruchomionego wewnątrz docelowego kontenera.Wywołanie wykonania: Zgadywana ścieżka PID jest zapisywana w pliku
release_agent
grupy cgroups. To działanie wywołuje wykonanierelease_agent
. Sukces tego kroku jest potwierdzany przez sprawdzenie utworzenia pliku wynikowego.
Proces eksploatacji
Proces eksploatacji obejmuje bardziej szczegółowy zestaw działań, mających na celu wykonanie ładunku na hoście poprzez zgadywanie poprawnego PID procesu uruchomionego wewnątrz kontenera. Oto jak to się odbywa:
Inicjalizacja środowiska: Na hoście przygotowywany jest skrypt ładunku (
payload.sh
), a tworzony jest unikalny katalog do manipulacji grupą cgroups.Przygotowanie ładunku: Tworzony jest skrypt ładunku, który zawiera polecenia do wykonania na hoście, i jest on nadawany uprawnienia do wykonania.
Konfiguracja grupy cgroups: Grupa cgroups jest montowana i konfigurowana. Ustawiana jest flaga
notify_on_release
, aby zapewnić wykonanie ładunku po zwolnieniu grupy cgroups.Brute Force PID: Pętla iteruje przez potencjalne PID-y, zapisując każdy zgadywany PID w pliku
release_agent
. Efektem tego jest ustawienie skryptu ładunku jakorelease_agent
.Wywołanie i sprawdzenie wykonania: Dla każdego PID-u zapisywane jest
cgroup.procs
grupy cgroups, co powoduje wykonanierelease_agent
, jeśli PID jest poprawny. Pętla trwa, dopóki nie zostanie znaleziony wynikowy plik skryptu ładunku, co oznacza udane wykonanie.
PoC z wpisu na blogu:
Last updated