Vundebleco en Python kiu permesas al sistemaj komandoj esti vokataj de izolitaj skriptoj

Metodo estis publikigita por preteriri izolitajn kodajn ekzekutsistemojn en Python, surbaze de la uzo de longe konata cimo, kiu aperis en Python 2.7, estis identigita en 2012 kaj ankoraŭ ne estis korektita en Python 3. La cimo permesas uzi speciale ligitajn. Python-kodo por komenci aliron al jam liberigita memoro (Uzu-Post-Libera) en Python. Komence, oni supozis, ke la eraro ne prezentis sekurecan minacon kaj nur en tre maloftaj kazoj, kutime artefarite kreitaj, povus konduki al nenormala fino de la skripto.

Sekureca esploristo sub la pseŭdonimo kn32 interesiĝis pri la problemo kaj sukcesis prepari funkciantan ekspluatadon, kiu ebligas voki ajnan sisteman komandon sen havi rektan aliron al metodoj kiel os.system. La ekspluato estas efektivigita en pura Python kaj funkcias sen importi eksterajn bibliotekojn kaj sen instali la pritraktilon "code.__new__". El la hokoj oni uzas nur "builtin.__id__", kio kutime ne estas malpermesita. En la praktika flanko, la proponita kodo povas esti uzata por preteriri izoligajn mekanismojn en diversaj servoj kaj medioj (ekzemple en lernmedioj, interretaj ŝeloj, enkonstruitaj pritraktiloj, ktp.), kiuj ebligas ekzekuton de Python-kodo, sed limigas la disponeblaj vokoj kaj ne permesas alvokaj metodoj kiel os.system.

La proponita kodo estas analogo de la os.system-voko, kiu funkcias per ekspluatado de vundebleco en CPython. La ekspluato funkcias kun ĉiuj versioj de Python 3 en sistemoj kun x86-64-arkitekturo kaj montras stabilan funkciadon en Ubuntu 22.04, eĉ kiam PIE, RELRO kaj CET-protektreĝimoj estas ebligitaj. La laboro estas akiri informojn de Python-kodo pri la adreso de unu el la funkcioj en la plenumebla CPython-kodo. Surbaze de ĉi tiu adreso, la baza adreso de CPython en memoro kaj la adreso de la system() funkcio en la libc-instanco ŝarĝita en memoro estas kalkulitaj. Ĉe la fino, rekta transiro al specifa sistema adreso estas komencita kun la anstataŭigo de la montrilo de la unua argumento al la linio "/bin/sh".

Vundebleco en Python kiu permesas al sistemaj komandoj esti vokataj de izolitaj skriptoj


fonto: opennet.ru

Aldoni komenton