Уразлівасць у Python, якая дазваляе выклікаць сістэмныя каманды з ізаляваных скрыптоў

Апублікаваны метад абыходу сістэм ізаляванага выканання кода на мове Python, заснаваны на выкарыстанні даўно вядомай памылкі, якая з'явілася ў Python 2.7, выяўленай у 2012 годзе і да гэтага часу не выпраўленай у Python 3. Памылка дазваляе пры дапамозе спецыяльна скампанаванага кода на мове Python ужо вызваленай памяці (Use-After-Free) у СPython. Першапачаткова меркавалася, што памылка не ўяўляе пагрозы бяспецы і толькі ў вельмі рэдкіх выпадках, як правіла штучна створаных, можа прывесці да аварыйнага завяршэння скрыпту.

Даследчык бяспекі пад псеўданімам kn32 зацікавіўся праблемай і здолеў падрыхтаваць працоўны эксплоіт, які дае магчымасць выклікаць любую сістэмную каманду, не маючы прамога доступу да метадаў выгляду os.system. Эксплоіт рэалізаваны на чыстай мове Python і працуе без імпарту знешніх бібліятэк і без усталёўкі апрацоўшчыка «code.__new__». З hook-ов выкарыстоўваецца толькі "builtin.__id__", які звычайна не забаронены. З практычнага боку прапанаваны код можа прымяняцца для абыходу механізмаў ізаляцыі ў розных сэрвісах і асяроддзі (напрыклад, у навучальных асяроддзях, online-абалонках, убудаваных апрацоўшчыках і да т.п.), якія дапускаюць выкананне кода на мове Python, але абмяжоўваюць даступныя выклікі і не дазваляюць звяртацца да такіх метадаў, як os.system.

Прапанаваны код уяўляе сабой аналаг выкліку os.system, які працуе праз эксплуатацыю ўразлівасці ў CPython. Эксплоіт працуе са ўсімі версіямі Python 3 на сістэмах з архітэктурай x86-64 і дэманструе стабільную працу ў Ubuntu 22.04, нават пры ўключэнні рэжымаў абароны PIE, RELRO і CET. Праца зводзіцца да атрымання з кода на мове Python звестак аб адрасе адной з функцый у выкананым кодзе CPython. На падставе гэтага адраса вылічаецца базавы адрас CPython у памяці і адрас функцыі system() у загружаным у памяць асобніку libc. У завяршэнні ініцыюецца прамы пераход па вызначаным адрасе system c падстаноўкай паказальніка першага аргументу на радок "/bin/sh".

Уразлівасць у Python, якая дазваляе выклікаць сістэмныя каманды з ізаляваных скрыптоў


Крыніца: opennet.ru

Дадаць каментар