Opublikowano metodę omijania systemów izolowanego wykonania kodu w języku Python, opartą na wykorzystaniu dawno znanego błędu, który pojawił się w Pythonie 2.7, zidentyfikowanego w 2012 roku i do tej pory niepoprawionego w Pythonie 3. Błąd ten pozwala, za pomocą specjalnie skonstruowanego kodu w języku Python, zainicjować dostęp do już zwolnionej pamięci (Use-After-Free) w CPython. Pierwotnie sądzono, że błąd nie stanowi zagrożenia bezpieczeństwa i tylko w bardzo rzadkich przypadkach, zazwyczaj sztucznie stworzonych, może prowadzić do awaryjnego zakończenia skryptu.
Badacz bezpieczeństwa posługujący się pseudonimem kn32 zainteresował się problemem i udało mu się przygotować działający exploit, który pozwala na wywołanie dowolnej komendy systemowej bez bezpośredniego dostępu do metod typu os.system. Exploit został zaimplementowany w czystym języku Python i działa bez importowania zewnętrznych bibliotek i bez instalacji handlera „code.__new__”. Do hooków wykorzystano tylko „builtin.__id__”, który zazwyczaj nie jest zabroniony. Z praktycznego punktu widzenia zaproponowany kod może być używany do omijania mechanizmów izolacji w różnych usługach i środowiskach (na przykład w środowiskach edukacyjnych, interfejsach online, wbudowanych obsługach itd.), które dopuszczają wykonywanie kodu w języku Python, ale ograniczają dostępne wywołania i nie pozwalają na dostęp do takich metod jak os.system.
Proponowany kod stanowi odpowiednik wywołania os.system, działający poprzez wykorzystanie podatności w CPython. Exploit działa ze wszystkimi wersjami Pythona 3 na systemach z architekturą x86-64 i wykazuje stabilną pracę w Ubuntu 22.04, nawet przy włączonych trybach ochrony PIE, RELRO i CET. Proces ogranicza się do uzyskania z kodu w języku Python informacji o adresie jednej z funkcji w wykonywanym kodzie CPython. Na podstawie tego adresu obliczany jest podstawowy adres CPython w pamięci oraz adres funkcji system() w załadowanej do pamięci instancji libc. Na końcu następuje bezpośredni przeskok do określonego adresu system z podstawieniem wskaźnika pierwszego argumentu na ciąg „/bin/sh”.

Źródło: opennet.ru
