Зворотно-орієнтоване програмування (англ. return oriented programming, ROP) — метод експлуатації вразливостей в програмному забезпеченні, використовуючи який атакуючий може виконати необхідний йому код за наявності в системі захисних технологій, наприклад технології, що забороняє виконання коду з певних сторінок пам'яті. Метод полягає в тому, що атакуючий може отримати контроль над стеком викликів, знайти в коді послідовності інструкцій, які виконують потрібні дії і звані «гаджетами», виконати «гаджети» в потрібній послідовності. «Гаджет», як правило, закінчується інструкцією повернення і розташовується в оперативній пам'яті в існуючому коді (в коді програми або в коді використовуваної бібліотеки). Атакуючий домагається послідовного виконання гаджетів за допомогою інструкцій повернення, складає послідовність гаджетів так, щоб виконати потрібні операції. Атака реалізувати навіть на системах, що мають механізми для запобігання більш простих атак.
Історія
Атака на переповнення буфера
Зворотно-орієнтоване програмування — це вдосконалена версія атаки на переповнення буфера. При цій атаці атакувальник використовує помилку в програмі, коли функція не перевіряє (або неправильно перевіряє) межі при запису в буфер даних, отриманих від користувача. Якщо користувач передає більше даних, ніж розмір буфера, то зайві дані потрапляють в область пам'яті, призначену для інших локальних змінних, а також можуть перезаписати адреси повернення. Якщо адреса повернення виявляється перезаписаною, то при поверненні з функції керування буде передано знову записаній адресі.
У найпростішій версії атаки на переповнення буферу, атакувальник поміщає код(«корисне навантаження») у стек, а потім перезаписує адресу повернення адресою тільки що записаних ним інструкцій. До кінця 90-х років більшість операційних систем не надавало ніякого захисту від цих атак. У системах Windows не було захисту від атак переповнювання буфера до 2004 року. Врешті решт, операційні системи стали боротися з експлуатацією вразливостей переповнення буфера, позначаючи певні сторінки пам'яті як невиконувані (технологія, яка отримала назву «Запобігання виконання даних»). При включеному запобіганні виконання даних машина відмовиться виконувати код у сторінках пам'яті, позначені «тільки для даних», включаючи сторінки, що містять стек. Це не дозволяє помістити корисне навантаження в стек, а потім перейти на нього, перезаписавши адреси повернення. Пізніше для посилення захисту з'явилася апаратна підтримка запобігання виконання даних.
Атака повернення в бібліотеку
Запобігання виконання даних не дозволяє провести атаку методом, описаним вище. Атакуючий обмежений кодом, вже наявними в атакуючій програмі і подключених бібліотеках. Проте колективні бібліотеки, зокрема libc, часто містять функції для здійснення системних викликів та інші корисні для атакуючого функції, що дозволяє використовувати ці функції при атаці.
При атаці повернення до бібліотеки також експлуатується переповнення буфера. Адреса повернення буде точкою входу потрібної бібліотечної функції. Також перезаписуються комірки над адресою повернення, щоб передати функції параметри або зв'язати в ланцюжок кілька викликів. Ця техніка була вперше представлена Олександром Песляком (відомим як Solar Designer) у 1997 році, а потім була розширена, дозволяючи зробити необмежений ланцюжок викликів функцій.
Запозичення шматків коду
З поширенням 64-розрядного обладнання і операційних систем стало складніше проводити атаку повернення в бібліотеку: у використовуваних в 64-розрядних системах угодах про виклик перші параметри передаються функції не в стеку, а в регістрах. Це ускладнює підготовку параметрів для виклику в процесі атаки. Крім того, розробники поділюваних бібліотек стали прибирати з бібліотек або обмежувати «небезпечні» функції, такі як обгортки системних викликів.
Наступним витком розвитку атаки стало використання частин бібліотечних функцій замість функцій цілком. У цій техніці шукаються частини функцій, які передають дані з стека в регістри. Ретельний підбір цих частин дозволяє підготувати потрібні параметри в регістрах для виклику функції за новою угодою. Далі атака проводиться так само, як атака повернення до бібліотеки.
Атака методом зворотно-орієнтованого програмування
Зворотно-орієнтоване програмування розширює підхід запозичення шматків коду, надаючи атакувальнику повну за Тюрингом функціональність, включаючи цикли і розгалуження. Іншими словами, зворотно-орієнтоване програмування надає атакувальнику можливість виконати будь-яку операцію. Ховав Шахам опублікував опис методу у 2007 році і продемонстрував його на програмі, що використовує стандартну бібліотеку мови Сі і містить вразливість переповнення буфера. Зворотно-орієнтоване програмування перевершує інші описані вище типи атак і з виразною потужністю, і по стійкості до захисних заходів. Жоден з вищеописаних методів протидії атакам, включаючи видалення небезпечних функцій з поділюваних бібліотек, не є ефективним проти зворотно-орієнтованого програмування.
На відміну від атаки повернення в бібліотеку, в якій використовуються функції цілком, у зворотно-орієнтованому програмуванні використовуються невеликі послідовності інструкцій, що закінчуються інструкцією повернення, так звані «гаджети». Гаджетами є, наприклад, закінчення наявних функцій. Однак на деяких платформах, зокрема x86, гаджети можуть виникати «між рядків», тобто при декодуванні з середини наявної інструкції. Наприклад, наступна послідовність інструкцій:
test edi, 7 ; f7 c7 07 00 00 00 setnz byte[ebp-61] ; 0f 95 45 c3
при початку декодування на один байт пізніше, дає
mov dword[edi], 0f000000h ; c7 07 00 00 00 0f xchg ebp, eax ; 95 inc ebp ; 45 ret ; c3
Також гаджети можуть перебувати в даних, які з тих чи інших причин знаходяться в секції коду. Це пов'язано з тим, що набір інструкцій архітектури x86 досить щільний, тобто велика ймовірність того, що довільний потік байтів буде інтерпретований як потік дійсних інструкцій. З іншого боку, в архітектурі MIPS всі інструкції мають довжину 4 байти, а можна виконувати тільки інструкції, вирівняні за адресами, кратним 4-м байтам. Тому там не можна отримати нову послідовність «читанням між рядків».
При атаці експлуатується вразливість переповнення буфера. Адреса повернення з поточної функції перезаписується адресою першого гаджета. На наступні позиції в стеку записуються адреси таких гаджетів і дані, використовувані гаджетами.
Приклади
Розширення
У своєму первісному варіанті для платформи x86, гаджети являють собою ланцюжки послідовно розташованих інструкцій без переходів, які завершуються інструкцією близького повернення. В розширених варіантах атаки інструкції ланцюжки можуть не обов'язково бути послідовно розташовані, а пов'язані інструкціями прямого переходу. Також роль завершальної інструкції може виконувати інша інструкція повернення (x86 є ще інструкція далекого повернення, інструкції близького і далекого повернення з очищенням стека), інструкція непрямого переходу або навіть непрямого виклику. Це ускладнює боротьбу з даним методом атаки.
Автоматична генерація
Існують інструменти для автоматичного знаходження гаджетів і конструювання атаки. Прикладом такого інструменту може служити ROPgadget.
Захист від зворотно-орієнтованого програмування
Існує кілька методів захисту від зворотно-орієнтованого програмування. Більшість покладаються на розташування коду програми і бібліотек за відносно безпідставного адресою, так що атакуючий не може точно передбачити розташування інструкцій, що можуть бути корисними в гаджетах, а значить не може побудувати ланцюжок гаджетів для атаки. Одна з реалізацій цього методу, ASLR, завантажує колективні бібліотеки за адресою, різною при кожному запуску програми. Однак, хоча ця технологія широко застосовується в сучасних операційних системах, вона є вразливою до атак витоку інформації та інших атак, що дозволяє визначити положення відомої бібліотечної функції. Якщо атакуючий може визначити розташування однієї функції, він може визначити розташування всіх інструкцій бібліотеки і провести атаку методом зворотно-орієнтованого програмування.
Можна переставляти не лише бібліотеки цілком, а й окремі інструкції програм і бібліотек. Однак це вимагає великої підтримки під час виконання, наприклад, динамічної трансляції, щоб повернути переставлені інструкції у правильний порядок для їх виконання. Цей метод ускладнює знаходження і використання гаджетів, однак має великі накладні витрати.
Підхід, що застосовується в kBouncer, полягає в перевірці того, що інструкція повернення передає управління на інструкцію, безпосередньо наступну за інструкцією виклику. Це сильно скорочує кількість можливих гаджетів, але також викликає значне зниження продуктивності. Крім того в розширеному варіанті зворотно-орієнтованого програмування гаджети можна пов'язувати не тільки інструкцією повернення, але і інструкцією непрямого переходу або виклику. Проти такої розширеної атаки kBouncer буде неефективний.
Примітки
- Shacham, Hovav; Buchanan, Erik; Roemer, Ryan; Savage, Stefan. . Архів оригіналу за 1 червня 2010. Процитовано 12 серпня 2009.
- Erik Buchanan, Ryan Roemer, Hovav Shacham and Stefan Savage; When Good Instructions Go Bad: Generalizing Return-Oriented Programming to RISC [ 11 серпня 2017 у Wayback Machine.], in Proceedings of CCS 2008, ACM Press, October 2008.
- (англ.). Microsoft. Архів оригіналу за 14 квітня 2018. Процитовано 19 квітня 2018.
- Solar Designer, Return-into-lib(c) exploits [ 23 лютого 2018 у Wayback Machine.], Bugtraq
- Nergal, Phrack 58 Article 4, return-into-lib(c) exploits [ 25 квітня 2013 у Wayback Machine.]
- Sebastian Krahmer, x86-64 buffer overflow exploits and the borrowed code chunks exploitation technique [ 22 грудня 2018 у Wayback Machine.], September 28, 2005
- Abadi, Martín; Budiu, Mihai; Erlingsson, Úlfar; Ligatti, Jay (November 2005). Catherine Meadows and Ari Juels (ред.). Control-Flow Integrity: Principles, Implementations, and Applications. Proceedings of CCS 2005 (англ.). ACM.
- Hovav Shacham. The geometry of innocent flesh on the bone: return-into-libc without function calls (on the x86). In Proceedings of the 14th ACM conference on Computer and communications security (CCS '07). ACM 2007
- Salwan, Jonathan; Wirth, Allan. (англ.). Архів оригіналу за 15 квітня 2018. Процитовано 19 квітня 2018.
- Richard Skowyra, Kelly Casteel, Hamed Okhravi and William Streilein; Systematic Analysis of Defenses Against Return-Oriented Programming [ 22 лютого 2014 у Wayback Machine.], In Proceedings of RAID 2013, Lecture Notes in Computer Science (LNCS), Vol. 8145, pp. 82-102, 2013.
- Jason Hiser, Anh Nguyen-Tuong, Michele Co, Matthew Hall, JackW. Davidson, ILR: Where’d My Gadgets Go? Proceedings of the IEEE Symposium on Security and Privacy, May 2012, San Francisco, CA
- Vasilis Pappas. kBouncer: Efficient and Transparent ROP Mitigation [ 30 серпня 2017 у Wayback Machine.]. April 2012.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Zvorotno oriyentovane programuvannya angl return oriented programming ROP metod ekspluataciyi vrazlivostej v programnomu zabezpechenni vikoristovuyuchi yakij atakuyuchij mozhe vikonati neobhidnij jomu kod za nayavnosti v sistemi zahisnih tehnologij napriklad tehnologiyi sho zaboronyaye vikonannya kodu z pevnih storinok pam yati Metod polyagaye v tomu sho atakuyuchij mozhe otrimati kontrol nad stekom viklikiv znajti v kodi poslidovnosti instrukcij yaki vikonuyut potribni diyi i zvani gadzhetami vikonati gadzheti v potribnij poslidovnosti Gadzhet yak pravilo zakinchuyetsya instrukciyeyu povernennya i roztashovuyetsya v operativnij pam yati v isnuyuchomu kodi v kodi programi abo v kodi vikoristovuvanoyi biblioteki Atakuyuchij domagayetsya poslidovnogo vikonannya gadzhetiv za dopomogoyu instrukcij povernennya skladaye poslidovnist gadzhetiv tak shob vikonati potribni operaciyi Ataka realizuvati navit na sistemah sho mayut mehanizmi dlya zapobigannya bilsh prostih atak IstoriyaAtaka na perepovnennya bufera Zvorotno oriyentovane programuvannya ce vdoskonalena versiya ataki na perepovnennya bufera Pri cij ataci atakuvalnik vikoristovuye pomilku v programi koli funkciya ne pereviryaye abo nepravilno pereviryaye mezhi pri zapisu v bufer danih otrimanih vid koristuvacha Yaksho koristuvach peredaye bilshe danih nizh rozmir bufera to zajvi dani potraplyayut v oblast pam yati priznachenu dlya inshih lokalnih zminnih a takozh mozhut perezapisati adresi povernennya Yaksho adresa povernennya viyavlyayetsya perezapisanoyu to pri povernenni z funkciyi keruvannya bude peredano znovu zapisanij adresi U najprostishij versiyi ataki na perepovnennya buferu atakuvalnik pomishaye kod korisne navantazhennya u stek a potim perezapisuye adresu povernennya adresoyu tilki sho zapisanih nim instrukcij Do kincya 90 h rokiv bilshist operacijnih sistem ne nadavalo niyakogo zahistu vid cih atak U sistemah Windows ne bulo zahistu vid atak perepovnyuvannya bufera do 2004 roku Vreshti resht operacijni sistemi stali borotisya z ekspluataciyeyu vrazlivostej perepovnennya bufera poznachayuchi pevni storinki pam yati yak nevikonuvani tehnologiya yaka otrimala nazvu Zapobigannya vikonannya danih Pri vklyuchenomu zapobiganni vikonannya danih mashina vidmovitsya vikonuvati kod u storinkah pam yati poznacheni tilki dlya danih vklyuchayuchi storinki sho mistyat stek Ce ne dozvolyaye pomistiti korisne navantazhennya v stek a potim perejti na nogo perezapisavshi adresi povernennya Piznishe dlya posilennya zahistu z yavilasya aparatna pidtrimka zapobigannya vikonannya danih Ataka povernennya v biblioteku Zapobigannya vikonannya danih ne dozvolyaye provesti ataku metodom opisanim vishe Atakuyuchij obmezhenij kodom vzhe nayavnimi v atakuyuchij programi i podklyuchenih bibliotekah Prote kolektivni biblioteki zokrema libc chasto mistyat funkciyi dlya zdijsnennya sistemnih viklikiv ta inshi korisni dlya atakuyuchogo funkciyi sho dozvolyaye vikoristovuvati ci funkciyi pri ataci Pri ataci povernennya do biblioteki takozh ekspluatuyetsya perepovnennya bufera Adresa povernennya bude tochkoyu vhodu potribnoyi bibliotechnoyi funkciyi Takozh perezapisuyutsya komirki nad adresoyu povernennya shob peredati funkciyi parametri abo zv yazati v lancyuzhok kilka viklikiv Cya tehnika bula vpershe predstavlena Oleksandrom Peslyakom vidomim yak Solar Designer u 1997 roci a potim bula rozshirena dozvolyayuchi zrobiti neobmezhenij lancyuzhok viklikiv funkcij Zapozichennya shmatkiv kodu Z poshirennyam 64 rozryadnogo obladnannya i operacijnih sistem stalo skladnishe provoditi ataku povernennya v biblioteku u vikoristovuvanih v 64 rozryadnih sistemah ugodah pro viklik pershi parametri peredayutsya funkciyi ne v steku a v registrah Ce uskladnyuye pidgotovku parametriv dlya vikliku v procesi ataki Krim togo rozrobniki podilyuvanih bibliotek stali pribirati z bibliotek abo obmezhuvati nebezpechni funkciyi taki yak obgortki sistemnih viklikiv Nastupnim vitkom rozvitku ataki stalo vikoristannya chastin bibliotechnih funkcij zamist funkcij cilkom U cij tehnici shukayutsya chastini funkcij yaki peredayut dani z steka v registri Retelnij pidbir cih chastin dozvolyaye pidgotuvati potribni parametri v registrah dlya vikliku funkciyi za novoyu ugodoyu Dali ataka provoditsya tak samo yak ataka povernennya do biblioteki Ataka metodom zvorotno oriyentovanogo programuvannyaZvorotno oriyentovane programuvannya rozshiryuye pidhid zapozichennya shmatkiv kodu nadayuchi atakuvalniku povnu za Tyuringom funkcionalnist vklyuchayuchi cikli i rozgaluzhennya Inshimi slovami zvorotno oriyentovane programuvannya nadaye atakuvalniku mozhlivist vikonati bud yaku operaciyu Hovav Shaham opublikuvav opis metodu u 2007 roci i prodemonstruvav jogo na programi sho vikoristovuye standartnu biblioteku movi Si i mistit vrazlivist perepovnennya bufera Zvorotno oriyentovane programuvannya perevershuye inshi opisani vishe tipi atak i z viraznoyu potuzhnistyu i po stijkosti do zahisnih zahodiv Zhoden z visheopisanih metodiv protidiyi atakam vklyuchayuchi vidalennya nebezpechnih funkcij z podilyuvanih bibliotek ne ye efektivnim proti zvorotno oriyentovanogo programuvannya Na vidminu vid ataki povernennya v biblioteku v yakij vikoristovuyutsya funkciyi cilkom u zvorotno oriyentovanomu programuvanni vikoristovuyutsya neveliki poslidovnosti instrukcij sho zakinchuyutsya instrukciyeyu povernennya tak zvani gadzheti Gadzhetami ye napriklad zakinchennya nayavnih funkcij Odnak na deyakih platformah zokrema x86 gadzheti mozhut vinikati mizh ryadkiv tobto pri dekoduvanni z seredini nayavnoyi instrukciyi Napriklad nastupna poslidovnist instrukcij test edi 7 f7 c7 07 00 00 00 setnz byte ebp 61 0f 95 45 c3 pri pochatku dekoduvannya na odin bajt piznishe daye mov dword edi 0 f000000h c7 07 00 00 00 0f xchg ebp eax 95 inc ebp 45 ret c3 Takozh gadzheti mozhut perebuvati v danih yaki z tih chi inshih prichin znahodyatsya v sekciyi kodu Ce pov yazano z tim sho nabir instrukcij arhitekturi x86 dosit shilnij tobto velika jmovirnist togo sho dovilnij potik bajtiv bude interpretovanij yak potik dijsnih instrukcij Z inshogo boku v arhitekturi MIPS vsi instrukciyi mayut dovzhinu 4 bajti a mozhna vikonuvati tilki instrukciyi virivnyani za adresami kratnim 4 m bajtam Tomu tam ne mozhna otrimati novu poslidovnist chitannyam mizh ryadkiv Pri ataci ekspluatuyetsya vrazlivist perepovnennya bufera Adresa povernennya z potochnoyi funkciyi perezapisuyetsya adresoyu pershogo gadzheta Na nastupni poziciyi v steku zapisuyutsya adresi takih gadzhetiv i dani vikoristovuvani gadzhetami Prikladi Rozshirennya U svoyemu pervisnomu varianti dlya platformi x86 gadzheti yavlyayut soboyu lancyuzhki poslidovno roztashovanih instrukcij bez perehodiv yaki zavershuyutsya instrukciyeyu blizkogo povernennya V rozshirenih variantah ataki instrukciyi lancyuzhki mozhut ne obov yazkovo buti poslidovno roztashovani a pov yazani instrukciyami pryamogo perehodu Takozh rol zavershalnoyi instrukciyi mozhe vikonuvati insha instrukciya povernennya x86 ye she instrukciya dalekogo povernennya instrukciyi blizkogo i dalekogo povernennya z ochishennyam steka instrukciya nepryamogo perehodu abo navit nepryamogo vikliku Ce uskladnyuye borotbu z danim metodom ataki Avtomatichna generaciya Isnuyut instrumenti dlya avtomatichnogo znahodzhennya gadzhetiv i konstruyuvannya ataki Prikladom takogo instrumentu mozhe sluzhiti ROPgadget Zahist vid zvorotno oriyentovanogo programuvannyaIsnuye kilka metodiv zahistu vid zvorotno oriyentovanogo programuvannya Bilshist pokladayutsya na roztashuvannya kodu programi i bibliotek za vidnosno bezpidstavnogo adresoyu tak sho atakuyuchij ne mozhe tochno peredbachiti roztashuvannya instrukcij sho mozhut buti korisnimi v gadzhetah a znachit ne mozhe pobuduvati lancyuzhok gadzhetiv dlya ataki Odna z realizacij cogo metodu ASLR zavantazhuye kolektivni biblioteki za adresoyu riznoyu pri kozhnomu zapusku programi Odnak hocha cya tehnologiya shiroko zastosovuyetsya v suchasnih operacijnih sistemah vona ye vrazlivoyu do atak vitoku informaciyi ta inshih atak sho dozvolyaye viznachiti polozhennya vidomoyi bibliotechnoyi funkciyi Yaksho atakuyuchij mozhe viznachiti roztashuvannya odniyeyi funkciyi vin mozhe viznachiti roztashuvannya vsih instrukcij biblioteki i provesti ataku metodom zvorotno oriyentovanogo programuvannya Mozhna perestavlyati ne lishe biblioteki cilkom a j okremi instrukciyi program i bibliotek Odnak ce vimagaye velikoyi pidtrimki pid chas vikonannya napriklad dinamichnoyi translyaciyi shob povernuti perestavleni instrukciyi u pravilnij poryadok dlya yih vikonannya Cej metod uskladnyuye znahodzhennya i vikoristannya gadzhetiv odnak maye veliki nakladni vitrati Pidhid sho zastosovuyetsya v kBouncer polyagaye v perevirci togo sho instrukciya povernennya peredaye upravlinnya na instrukciyu bezposeredno nastupnu za instrukciyeyu vikliku Ce silno skorochuye kilkist mozhlivih gadzhetiv ale takozh viklikaye znachne znizhennya produktivnosti Krim togo v rozshirenomu varianti zvorotno oriyentovanogo programuvannya gadzheti mozhna pov yazuvati ne tilki instrukciyeyu povernennya ale i instrukciyeyu nepryamogo perehodu abo vikliku Proti takoyi rozshirenoyi ataki kBouncer bude neefektivnij PrimitkiShacham Hovav Buchanan Erik Roemer Ryan Savage Stefan Arhiv originalu za 1 chervnya 2010 Procitovano 12 serpnya 2009 Erik Buchanan Ryan Roemer Hovav Shacham and Stefan Savage When Good Instructions Go Bad Generalizing Return Oriented Programming to RISC 11 serpnya 2017 u Wayback Machine in Proceedings of CCS 2008 ACM Press October 2008 angl Microsoft Arhiv originalu za 14 kvitnya 2018 Procitovano 19 kvitnya 2018 Solar Designer Return into lib c exploits 23 lyutogo 2018 u Wayback Machine Bugtraq Nergal Phrack 58 Article 4 return into lib c exploits 25 kvitnya 2013 u Wayback Machine Sebastian Krahmer x86 64 buffer overflow exploits and the borrowed code chunks exploitation technique 22 grudnya 2018 u Wayback Machine September 28 2005 Abadi Martin Budiu Mihai Erlingsson Ulfar Ligatti Jay November 2005 Catherine Meadows and Ari Juels red Control Flow Integrity Principles Implementations and Applications Proceedings of CCS 2005 angl ACM Hovav Shacham The geometry of innocent flesh on the bone return into libc without function calls on the x86 In Proceedings of the 14th ACM conference on Computer and communications security CCS 07 ACM 2007 Salwan Jonathan Wirth Allan angl Arhiv originalu za 15 kvitnya 2018 Procitovano 19 kvitnya 2018 Richard Skowyra Kelly Casteel Hamed Okhravi and William Streilein Systematic Analysis of Defenses Against Return Oriented Programming 22 lyutogo 2014 u Wayback Machine In Proceedings of RAID 2013 Lecture Notes in Computer Science LNCS Vol 8145 pp 82 102 2013 Jason Hiser Anh Nguyen Tuong Michele Co Matthew Hall JackW Davidson ILR Where d My Gadgets Go Proceedings of the IEEE Symposium on Security and Privacy May 2012 San Francisco CA Vasilis Pappas kBouncer Efficient and Transparent ROP Mitigation 30 serpnya 2017 u Wayback Machine April 2012