Kwetsbaarheid in Python waardoor systeemopdrachten kunnen worden aangeroepen vanuit scripts in een sandbox

Er is een methode gepubliceerd om geïsoleerde code-uitvoeringssystemen in Python te omzeilen, gebaseerd op het gebruik van een al lang bekende bug die in Python 2.7 verscheen, in 2012 werd geïdentificeerd en nog niet is gecorrigeerd in Python 3. De bug maakt het gebruik van speciaal gekoppelde Python-code om toegang te initiëren tot reeds vrijgemaakt geheugen (Use-After-Free) in Python. Aanvankelijk werd aangenomen dat de fout geen bedreiging voor de veiligheid vormde en slechts in zeer zeldzame gevallen, meestal kunstmatig gecreëerd, zou kunnen leiden tot een abnormale beëindiging van het script.

Een beveiligingsonderzoeker onder het pseudoniem kn32 raakte geïnteresseerd in het probleem en slaagde erin een werkende exploit voor te bereiden die het mogelijk maakt om elk systeemcommando aan te roepen zonder directe toegang te hebben tot methoden als os.system. De exploit is geïmplementeerd in pure Python en werkt zonder externe bibliotheken te importeren en zonder de handler “code.__new__” te installeren. Van de haken wordt alleen “builtin.__id__” gebruikt, wat meestal niet verboden is. Aan de praktische kant kan de voorgestelde code worden gebruikt om isolatiemechanismen in verschillende diensten en omgevingen (bijvoorbeeld in leeromgevingen, online shells, ingebouwde handlers, enz.) te omzeilen, waardoor de uitvoering van Python-code mogelijk wordt gemaakt, maar de beschikbare oproepen en staan ​​geen oproepmethoden zoals os.system toe.

De voorgestelde code is analoog aan de os.system-aanroep, die werkt door misbruik te maken van een kwetsbaarheid in CPython. De exploit werkt met alle versies van Python 3 op systemen met x86-64-architectuur en demonstreert een stabiele werking op Ubuntu 22.04, zelfs wanneer de PIE-, RELRO- en CET-beveiligingsmodi zijn ingeschakeld. Het werk komt neer op het verkrijgen van informatie uit Python-code over het adres van een van de functies in de uitvoerbare CPython-code. Op basis van dit adres worden het basisadres van CPython in het geheugen en het adres van de system()-functie in de in het geheugen geladen libc-instantie berekend. Aan het einde wordt een directe overgang naar een specifiek systeemadres geïnitieerd door de aanwijzer van het eerste argument te vervangen door de regel “/bin/sh”.

Kwetsbaarheid in Python waardoor systeemopdrachten kunnen worden aangeroepen vanuit scripts in een sandbox


Bron: opennet.ru

Voeg een reactie