Python-da tizim buyruqlarini izolyatsiya qilingan skriptlardan chaqirish imkonini beruvchi zaiflik

Python 2.7 da paydo bo'lgan, 2012 yilda aniqlangan va hali Python 3 da tuzatilmagan, uzoq vaqtdan beri ma'lum bo'lgan xatolikdan foydalanishga asoslangan Python'da izolyatsiya qilingan kodni bajarish tizimlarini chetlab o'tish usuli nashr etildi. Xato maxsus bog'langanlardan foydalanishga imkon beradi. Python-da bo'shatilgan xotiraga (Use-After-Free) qo'ng'iroqni boshlash uchun Python-dagi kod. Dastlab, xato xavfsizlikka tahdid solmaydi va faqat juda kam hollarda, odatda sun'iy ravishda yaratilgan, skriptning g'ayritabiiy tugatilishiga olib kelishi mumkin deb taxmin qilingan.

Kn32 taxallusi ostidagi xavfsizlik tadqiqotchisi muammo bilan qiziqib qoldi va os.system kabi usullarga to'g'ridan-to'g'ri kirish imkoniga ega bo'lmasdan istalgan tizim buyrug'ini chaqirish imkonini beruvchi ishchi ekspluatatsiyani tayyorlashga muvaffaq bo'ldi. Ekspluatatsiya sof Python-da amalga oshiriladi va tashqi kutubxonalarni import qilmasdan va "code.__new__" ishlov beruvchisini o'rnatmasdan ishlaydi. Kancalardan faqat "builtin.__id__" ishlatiladi, bu odatda taqiqlanmaydi. Amaliy tomondan, taklif qilingan kod turli xil xizmatlar va muhitlarda (masalan, o'quv muhitlarida, onlayn qobiqlarda, o'rnatilgan ishlovchilar va boshqalarda) izolyatsiya mexanizmlarini chetlab o'tish uchun ishlatilishi mumkin, bu Python kodini bajarishga imkon beradi, lekin uni cheklaydi. mavjud qo'ng'iroqlar va os.system kabi qo'ng'iroq usullariga ruxsat bermang.

Taklif etilayotgan kod os.system chaqiruvining analogidir, u CPython’dagi zaiflikdan foydalanish orqali ishlaydi. Exploit x3-86 arxitekturali tizimlarda Python 64 ning barcha versiyalari bilan ishlaydi va PIE, RELRO va CET himoya rejimlari yoqilganda ham Ubuntu 22.04 da barqaror ishlashni namoyish etadi. Ish Python kodidan bajariladigan CPython kodidagi funksiyalardan birining manzili haqida ma'lumot olish bilan bog'liq. Ushbu manzilga asoslanib, xotiradagi CPython ning asosiy manzili va xotiraga yuklangan libc misolidagi system() funksiyasining manzili hisoblanadi. Oxirida ma'lum bir tizim manziliga to'g'ridan-to'g'ri o'tish birinchi argumentning ko'rsatgichini "/bin / sh" qatoriga almashtirish bilan boshlanadi.

Python-da tizim buyruqlarini izolyatsiya qilingan skriptlardan chaqirish imkonini beruvchi zaiflik


Manba: opennet.ru

a Izoh qo'shish