Sårbarhet i Python som tillater å ringe systemkommandoer fra sandkasseskript

En metode er publisert for å omgå isolerte kodeutførelsessystemer i Python, basert på bruken av en lenge kjent feil som dukket opp i Python 2.7, ble identifisert i 2012 og har ennå ikke blitt rettet i Python 3. Feilen tillater bruk av spesielt lenkede Python-kode for å starte et anrop til allerede frigjort minne (Use-After-Free) i Python. I utgangspunktet ble det antatt at feilen ikke utgjorde en sikkerhetstrussel og kun i svært sjeldne tilfeller, vanligvis kunstig opprettet, kunne føre til en unormal avslutning av skriptet.

En sikkerhetsforsker under pseudonymet kn32 ble interessert i problemet og klarte å forberede en fungerende utnyttelse som gjør det mulig å kalle en hvilken som helst systemkommando uten å ha direkte tilgang til metoder som os.system. Utnyttelsen er implementert i ren Python og fungerer uten å importere eksterne biblioteker og uten å installere "code.__new__"-behandleren. Av krokene er det kun «builtin.__id__» som brukes, noe som vanligvis ikke er forbudt. På den praktiske siden kan den foreslåtte koden brukes til å omgå isolasjonsmekanismer i ulike tjenester og miljøer (for eksempel i læringsmiljøer, online-skall, innebygde behandlere, etc.), som tillater kjøring av Python-kode, men begrenser tilgjengelige anrop og tillater ikke anropsmetoder som os.system.

Den foreslåtte koden er en analog av os.system-kallet, som fungerer ved å utnytte en sårbarhet i CPython. Utnyttelsen fungerer med alle versjoner av Python 3 på systemer med x86-64-arkitektur og demonstrerer stabil drift på Ubuntu 22.04, selv når PIE-, RELRO- og CET-beskyttelsesmoduser er aktivert. Arbeidet kommer ned til å hente informasjon fra Python-koden om adressen til en av funksjonene i den kjørbare CPython-koden. Basert på denne adressen beregnes basisadressen til CPython i minnet og adressen til system()-funksjonen i libc-forekomsten som er lastet inn i minnet. På slutten initieres en direkte overgang til en spesifikk systemadresse med erstatning av pekeren til det første argumentet til linjen "/bin/sh".

Sårbarhet i Python som tillater å ringe systemkommandoer fra sandkasseskript


Kilde: opennet.ru

Legg til en kommentar