Sårbarhet i Python som gör att systemkommandon kan anropas från isolerade skript

En metod har publicerats för att kringgå isolerade kodexekveringssystem i Python, baserad på användningen av en sedan länge känd bugg som dök upp i Python 2.7, identifierades 2012 och har ännu inte korrigerats i Python 3. Felet tillåter användning av speciellt länkade Python-kod för att initiera åtkomst till redan frigjort minne (Use-After-Free) i Python. Inledningsvis antogs att felet inte utgjorde något säkerhetshot och endast i mycket sällsynta fall, vanligtvis på konstgjord väg, kunde det leda till en onormal avslutning av skriptet.

En säkerhetsforskare under pseudonymen kn32 blev intresserad av problemet och lyckades förbereda en fungerande exploit som gör det möjligt att anropa vilket systemkommando som helst utan att ha direkt tillgång till metoder som os.system. Exploateringen är implementerad i ren Python och fungerar utan att importera externa bibliotek och utan att installera "code.__new__"-hanteraren. Av krokarna används endast "builtin.__id__", vilket vanligtvis inte är förbjudet. På den praktiska sidan kan den föreslagna koden användas för att kringgå isoleringsmekanismer i olika tjänster och miljöer (till exempel i inlärningsmiljöer, online-skal, inbyggda hanterare, etc.), som tillåter exekvering av Python-kod, men begränsar tillgängliga samtal och tillåter inte anropsmetoder som os.system.

Den föreslagna koden är en analog till os.system-anropet, som fungerar genom att utnyttja en sårbarhet i CPython. Exploateringen fungerar med alla versioner av Python 3 på system med x86-64-arkitektur och visar stabil drift på Ubuntu 22.04, även när PIE-, RELRO- och CET-skyddslägen är aktiverade. Arbetet handlar om att hämta information från Python-koden om adressen till en av funktionerna i den körbara CPython-koden. Baserat på denna adress beräknas basadressen för CPython i minnet och adressen till system()-funktionen i libc-instansen som laddats in i minnet. I slutet initieras en direkt övergång till en specifik systemadress med ersättning av pekaren för det första argumentet till raden "/bin/sh".

Sårbarhet i Python som gör att systemkommandon kan anropas från isolerade skript


Källa: opennet.ru

Lägg en kommentar