Kwesbaarheid in Python wat die oproep van stelselopdragte vanaf sandboxed-skrifte moontlik maak

'n Metode is gepubliseer om geïsoleerde kode-uitvoeringstelsels in Python te omseil, gebaseer op die gebruik van 'n lang bekende fout wat in Python 2.7 verskyn het, is in 2012 geïdentifiseer en is nog nie in Python 3 reggestel nie. Die fout laat die gebruik van spesiaal gekoppelde Python-kode om toegang tot reeds vrygestelde geheue (Use-After-Free) in Python te begin. Aanvanklik is aanvaar dat die fout nie 'n sekuriteitsbedreiging inhou nie en slegs in baie seldsame gevalle, gewoonlik kunsmatig geskep, kan lei tot 'n abnormale beëindiging van die draaiboek.

'n Sekuriteitsnavorser onder die skuilnaam kn32 het in die probleem belang gestel en het daarin geslaag om 'n werkende uitbuiting voor te berei wat dit moontlik maak om enige stelselopdrag te roep sonder om direkte toegang tot metodes soos os.system te hê. Die ontginning word in suiwer Python geïmplementeer en werk sonder om eksterne biblioteke in te voer en sonder om die "code.__new__"-hanteerder te installeer. Van die hake word slegs "builtin.__id__" gebruik, wat gewoonlik nie verbode is nie. Op die praktiese kant kan die voorgestelde kode gebruik word om isolasiemeganismes in verskeie dienste en omgewings te omseil (byvoorbeeld in leeromgewings, aanlyn-skulpe, ingeboude hanteerders, ens.), Wat die uitvoering van Python-kode moontlik maak, maar die beskikbare oproepe en moenie oproepmetodes soos os.system toelaat nie.

Die voorgestelde kode is 'n analoog van die os.system-oproep, wat werk deur 'n kwesbaarheid in CPython te ontgin. Die ontginning werk met alle weergawes van Python 3 op stelsels met x86-64-argitektuur en demonstreer stabiele werking op Ubuntu 22.04, selfs wanneer PIE-, RELRO- en CET-beskermingsmodusse geaktiveer is. Die werk kom daarop neer om inligting van Python-kode te verkry oor die adres van een van die funksies in die uitvoerbare CPython-kode. Op grond van hierdie adres word die basisadres van CPython in die geheue en die adres van die stelsel()-funksie in die libc-instansie wat in die geheue gelaai is, bereken. Aan die einde word 'n direkte oorgang na 'n spesifieke stelseladres geïnisieer met die vervanging van die wyser van die eerste argument na die reël "/bin/sh".

Kwesbaarheid in Python wat die oproep van stelselopdragte vanaf sandboxed-skrifte moontlik maak


Bron: opennet.ru

Voeg 'n opmerking