Python-ում խոցելիություն, որը թույլ է տալիս համակարգի հրամանները կանչել մեկուսացված սցենարներից

Հրապարակվել է Python-ում մեկուսացված կոդերի կատարման համակարգերը շրջանցելու մեթոդ, որը հիմնված է վաղուց հայտնի սխալի օգտագործման վրա, որը հայտնվել է Python 2.7-ում, որը հայտնաբերվել է 2012 թվականին և դեռ չի ուղղվել Python 3-ում: Սխալը թույլ է տալիս օգտագործել հատուկ կապակցված: կոդ Python-ում, որպեսզի զանգ սկսի դեպի արդեն ազատված հիշողությունը (Use-After-Free) Python-ում: Ի սկզբանե ենթադրվում էր, որ սխալը անվտանգության սպառնալիք չի ներկայացնում և միայն շատ հազվադեպ դեպքերում, սովորաբար արհեստականորեն ստեղծված, կարող է հանգեցնել սցենարի աննորմալ դադարեցման։

Անվտանգության հետազոտողը՝ kn32 կեղծանունով, հետաքրքրվել է խնդրով և կարողացել է պատրաստել աշխատանքային շահագործում, որը թույլ է տալիս կանչել համակարգի ցանկացած հրաման՝ առանց ուղղակի մուտք ունենալու այնպիսի մեթոդների, ինչպիսին os.system-ն է: Exploit-ն իրականացվում է մաքուր Python-ում և աշխատում է առանց արտաքին գրադարաններ ներմուծելու և առանց «code.__new__» մշակողի տեղադրման: Կեռիկներից օգտագործվում է միայն «builtin.__id__», որը սովորաբար արգելված չէ։ Գործնական առումով, առաջարկվող կոդը կարող է օգտագործվել տարբեր ծառայությունների և միջավայրերում մեկուսացման մեխանիզմները շրջանցելու համար (օրինակ՝ ուսումնական միջավայրերում, առցանց կեղևներում, ներկառուցված մշակիչներում և այլն), որոնք թույլ են տալիս կատարել Python կոդը, բայց սահմանափակում են հասանելի զանգեր և թույլ չեն տալիս զանգերի մեթոդներ, ինչպիսիք են os.system-ը:

Առաջարկվող կոդը os.system զանգի անալոգն է, որն աշխատում է CPython-ում խոցելիության օգտագործման միջոցով: Exploit-ը աշխատում է Python 3-ի բոլոր տարբերակների հետ x86-64 ճարտարապետությամբ համակարգերի վրա և ցուցադրում է կայուն գործողություն Ubuntu 22.04-ում, նույնիսկ երբ միացված են PIE, RELRO և CET պաշտպանության ռեժիմները: Աշխատանքը հանգում է նրան, որ Python կոդից տեղեկատվություն ստանալը գործարկվող CPython կոդի ֆունկցիաներից մեկի հասցեի վերաբերյալ։ Այս հասցեի հիման վրա հաշվարկվում է CPython-ի բազային հասցեն հիշողության մեջ և system() ֆունկցիայի հասցեն հիշողության մեջ բեռնված libc օրինակում։ Վերջում սկսվում է ուղիղ անցում կոնկրետ համակարգի հասցեին՝ առաջին արգումենտի ցուցիչը «/bin/sh» տողին փոխարինելով։

Python-ում խոցելիություն, որը թույլ է տալիս համակարգի հրամանները կանչել մեկուսացված սցենարներից


Source: opennet.ru

Добавить комментарий