Luka w Pythonie, która umożliwia wywoływanie poleceń systemowych z izolowanych skryptów

Opublikowano metodę ominięcia systemów wykonywania izolowanego kodu w Pythonie, opartą na wykorzystaniu znanego od dawna błędu, który pojawił się w Pythonie 2.7, został zidentyfikowany w 2012 roku i nie został jeszcze poprawiony w Pythonie 3. Błąd pozwala na użycie specjalnie połączonego Kod Pythona inicjujący dostęp do już zwolnionej pamięci (Użyj po zwolnieniu) w Pythonie. Początkowo zakładano, że błąd nie stanowi zagrożenia bezpieczeństwa i jedynie w bardzo rzadkich przypadkach, zwykle sztucznie stworzony, może doprowadzić do nieprawidłowego zakończenia działania skryptu.

Problemem zainteresował się badacz bezpieczeństwa działający pod pseudonimem kn32 i udało mu się przygotować działającego exploita, który umożliwia wywołanie dowolnego polecenia systemowego bez konieczności bezpośredniego dostępu do metod takich jak os.system. Exploit jest zaimplementowany w czystym Pythonie i działa bez importowania zewnętrznych bibliotek i bez instalowania modułu obsługi „code.__new__”. Z haków używany jest tylko „builtin.__id__”, co zwykle nie jest zabronione. Z praktycznego punktu widzenia proponowany kod może zostać wykorzystany do ominięcia mechanizmów izolacji w różnych usługach i środowiskach (na przykład w środowiskach edukacyjnych, powłokach online, wbudowanych procedurach obsługi itp.), które umożliwiają wykonanie kodu Pythona, ale ograniczają dostępne wywołania i nie zezwalaj na metody wywoływania, takie jak os.system.

Proponowany kod jest odpowiednikiem wywołania os.system, które działa poprzez wykorzystanie luki w CPythonie. Exploit działa ze wszystkimi wersjami Pythona 3 na systemach o architekturze x86-64 i wykazuje stabilną pracę na Ubuntu 22.04, nawet przy włączonych trybach ochrony PIE, RELRO i CET. Praca sprowadza się do uzyskania informacji z kodu Pythona o adresie jednej z funkcji w wykonywalnym kodzie CPython. Na podstawie tego adresu obliczany jest adres bazowy CPythona w pamięci oraz adres funkcji system() w instancji libc załadowanej do pamięci. Na koniec inicjowane jest bezpośrednie przejście na konkretny adres systemu poprzez podstawienie wskaźnika pierwszego argumentu do linii „/bin/sh”.

Luka w Pythonie, która umożliwia wywoływanie poleceń systemowych z izolowanych skryptów


Źródło: opennet.ru

Dodaj komentarz