release_agent exploit - Relative Paths to PIDs
Aby uzyskać więcej szczegółów, sprawdź wpis na blogu pod adresem https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. To tylko podsumowanie:
Technika opisuje metodę wykonywania kodu hosta z wnętrza kontenera, pokonując wyzwania związane z konfiguracjami sterowników pamięci, które ukrywają ścieżkę systemu plików kontenera na hoście, takie jak Kata Containers lub specyficzne ustawienia devicemapper
.
Kluczowe kroki:
Lokalizacja identyfikatorów procesów (PID): Używając symbolicznego linku
/proc/<pid>/root
w pseudo-systemie plików Linux, można uzyskać dostęp do dowolnego pliku w kontenerze w odniesieniu do systemu plików hosta. To omija potrzebę znajomości ścieżki systemu plików kontenera na hoście.Bashowanie PID: Zastosowano podejście brute force do przeszukiwania PID na hoście. Robi się to, sprawdzając kolejno obecność konkretnego pliku w
/proc/<pid>/root/<file>
. Gdy plik zostanie znaleziony, wskazuje to, że odpowiadający PID należy do procesu działającego wewnątrz docelowego kontenera.Wywołanie wykonania: Odgadnięta ścieżka PID jest zapisywana w pliku
cgroups release_agent
. Ta akcja wywołuje wykonanierelease_agent
. Sukces tego kroku potwierdza się, sprawdzając utworzenie pliku wyjściowego.
Proces eksploatacji
Proces eksploatacji obejmuje bardziej szczegółowy zestaw działań, mających na celu wykonanie ładunku na hoście poprzez odgadnięcie poprawnego PID procesu działającego wewnątrz kontenera. Oto jak to się rozwija:
Inicjalizacja środowiska: Skrypt ładunku (
payload.sh
) jest przygotowywany na hoście, a unikalny katalog jest tworzony do manipulacji cgroup.Przygotowanie ładunku: Skrypt ładunku, który zawiera polecenia do wykonania na hoście, jest zapisany i uczyniony wykonywalnym.
Konfiguracja cgroup: Cgroup jest montowany i konfigurowany. Flaga
notify_on_release
jest ustawiona, aby zapewnić, że ładunek zostanie wykonany, gdy cgroup zostanie zwolniony.Brute Force PID: Pętla iteruje przez potencjalne PID, zapisując każdy odgadnięty PID w pliku
release_agent
. To skutecznie ustawia skrypt ładunku jakorelease_agent
.Wywołanie i sprawdzenie wykonania: Dla każdego PID zapisywane jest
cgroup.procs
cgroup, co wywołuje wykonanierelease_agent
, jeśli PID jest poprawny. Pętla trwa, aż znajdzie się wyjście skryptu ładunku, co wskazuje na pomyślne wykonanie.
PoC z wpisu na blogu:
Last updated