У галузі комп'ютерної безпеки і програмування, переповнення буфера (англ. buffer overflow або англ. buffer overrun), це явище, при якому програма, під час запису даних в буфер, перезаписує дані за межами буфера. Це може викликати несподівану поведінку, включно з помилками доступу до даних, хибними результатами, збоєм програми або дірою в системі безпеки.
Переповнення буфера може бути викликане недостатньою перевіркою вхідних даних. Воно є базою для багатьох уразливостей в програмних продуктах і може бути використане зі злим наміром. Додаткова перевірка може запобігти переповненню буфера, хоча така перевірка вплине на швидкодію програми.
Мови програмування, зазвичай згадувані у зв'язку з переповненням буфера, це здебільшого C та . Вони не мають вбудованого механізму проти доступу або перезаписування даних у будь-якій частині пам'яті й не провадять автоматичної перевірки даних, які записують в масив, на вихід за межі масиву.
Технічний опис
Переповнення буфера відбувається тоді, коли дані, що записуються в буфер, через недостатню перевірку, пошкоджують дані, розташовані за сусідніми до буфера адресами. Часто це відбувається, коли копіюється рядок з одного буфера в інший.
Базовий приклад
В наступному прикладі програма визначила два суміжні об'єкти в пам'яті: рядок 8 байтів завдовжки, A, і двобайтове ціле, B. Початково А містить нульові байти, а В містить число 1979. Символи мають розмір один байт.
ім'я змінної | A | B | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
значення | [порожній рядок] | 1979 | ||||||||
шістнадцяткове значення | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 07 | BB |
Тепер, програма намагається зберегти нуль-термінований рядок excessive в буфер A. Через відсутність перевірки на допустиму довжину рядка, він затирає значення B:
ім'я змінної | A | B | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
значення | 'e' | 'x' | 'c' | 'e' | 's' | 's' | 'i' | 'v' | 25856 | |
шістнадцяткове значення | 65 | 78 | 63 | 65 | 73 | 73 | 69 | 76 | 65 | 00 |
Хоча програміст не збирався змінювати значення B, це значення було перезаписане і тепер містить число, утворене частиною рядка. В цьому випадку, на big-endian системі, що використовує ASCII, "e" і нульовий байт сформують число 25856. Якщо за B слідує недоступна для запису ділянка пам'яті, запис ще довшого рядка може призвести до помилки сегментації, що перерве процес.
Використання
Техніки використання уразливості через переповнення буфера залежать від архітектури, операційної системи і ділянки пам'яті. Наприклад, використання купи різниться від використання стека викликів.
Використання стека
Технічно освідомлений і злонамірений користувач може використати стекове переповнення буфера так:
- Для перезапису локальної змінної, змінивши тим самим перебіг програми на вигідніший для нападника.
- Для перезапису адреси повернення в стековому кадрі. Коли буде виконане повернення з функції, виконання програми відновиться за адресою, вказаною нападником (зазвичай це адреса буфера поля вводу). Такий спосіб найбільш розповсюджений в архітектурах, де стек росте донизу (наприклад в архітектурі x86).
- Для перезаписів вказівника на функцію, або обробника винятків, що будуть виконані згодом.
З методом «трамполайнінга» (англ. trampolining, буквально «стрибки на батуті»), якщо адреса даних, яку ввів користувач, невідома, але їх місцеперебування зберігається в реєстрі, тоді адреса повернення може бути перезаписана на адресу опкоду, який виконає перехід до даних, введених користувачем. Якщо їх месцезнаходження зберігається в реєстрі R, тоді потрібен стрибок до опкоду для стрибка R, це викличе виконання користувацьких даних. Розташування необхідних опкодів або байтів в пам'яті може бути знайдено в динамічних бібліотеках або самій програмі. Адреси опкодів можуть змінюватися між застосунками й версіями ОС. Metasploit Project - одна з баз даних потрібних опкодів для Windows.
Не варто плутати стекове переповнення буфера з переповненням стека.
Також зауважимо, що наявність таких вразливостей зазвичай перевіряється за допомогою .
Використання переповнення в купі
Переповнення буфера в купі використовується відмінно від переповнення в стеку. Пам'ять в купі динамічно розподіляється застосунком під час виконання і, зазвичай, містить дані програми. Використання відбувається через пошкодження даних особливим чином, що призводить до перезапису внутрішніх структур даних, таких як зв'язний список вказівників.
Уразливість Microsoft GDI+ при обробці JPEGів, приклад наскільки небезпечною може бути переповнення в купі.
Запобігання
Для зменшення імовірності переповнення буфера, використовуються наступні заходи.
Системи виявлення вторгнення
За допомогою систем виявлення вторгнення (СВВ) можна виявити й запобігти спробам віддаленого використання переповнення буфера. Через те, що в більшості випадків дані, призначені для переповнення буфера містять довгі масиви інструкцій No Operation (NOP
або NOOP
), СВВ просто блокує всі вхідні пакети, що містять велику кількість послідовних NOP-ів. Цей спосіб, загалом, не ефективний, бо такі масиви можуть бути записані за допомогою великого різноманіття інструкцій мови асемблера. Останнім часом зламувачі для оминання СВВ почали використовувати (шел-коди) з шифруванням, кодом, що змінює себе сам, поліморфним кодом і абетково-цифровим кодом, а також атаку з поверненням в бібліотеку libc.
Захист від пошкодження стека
Захист від пошкодження стека використовується для виявлення найбільш поширених помилок переповнення буфера. При цьому перевіряється, що стек викликів не був змінений перед виходом з функції. Якщо він був змінений, тоді програма завершує своє виконання з помилкою сегментації.
Існують три такі системи: Libsafe і з (стара назва — ProPolice), дві останні є розширеннями компілятора gcc. Починаючи з gcc-4.1-stage2, SSP був інтегрований в основний дистрибутив компілятора. Gentoo Linux і OpenBSD мають SSP в складі розповсюджуваного з ними gcc.
Майкрософтівська функція безпеки з запобігання виконанню даних не дозволяє виконувати код з області пам'яті з позначкою «тільки для даних»
Захист простору машинного коду для UNIX-подібних систем
Захист простору машинного коду може пом'якшити наслідки переповнення буфера, унеможливлюючи більшість дій зловмисника. Це досягається (ASLR — англ. Address space layout randomization) і/або забороною одночасного доступу до пам'яті на запис і виконання. Стек без виконання запобігає більшості вразливостей коду оболонки.
Існує два виправлення для ядра Linux, які забезпечують цей захист — PaX і exec-shield. Жоден з них не є частиною основного дистрибутиву ядра. OpenBSD починаючи з версії 3.3 включає систему під назвою W^X, котра також забезпечує контроль простору виконання[].
Зауважимо, що такий спосіб захисту не запобігає пошкодженню стека. З усім тим він часто запобігає успішне виконання «корисного вантажу» експлойта. Програма не в змозі вставити код оболонки в захищену від запису пам'ять, таку як існуючі сегменти коду виконання. Також буде неможливо виконання інструкцій в пам'яті не для виконання, наприклад в стеку або в купі.
ASLR утруднює для зламника визначення адрес функцій в коді програми, за допомогою яких він міг би здійснити успішну атаку, і робить атаки типу ret2libc дуже складним завданням, хоча вони все ще можливі в контрольованому середовищі, якщо нападник вгадає правильну адресу[].
Деякі процесори, як от Sparc від Sun, від Transmeta, найновіші 64-розрядні x86 процесори фірм AMD (починаючи з Opteron) та Intel (починаючи з версій Pentium 4 Prescott) запобігають виконанню коду, розташованого в областях пам'яті, які позначені особливим бітом NX. AMD називає своє рішення NX (від англ. No eXecute), а Intel своє — XD (від англ. eXecute Disabled).
Захист простору машинного коду для Windows
Зараз існує декілька різних рішень, призначених для захисту виконуваного коду в системах Windows, які пропонує компанія Майкрософт і сторонні компанії.
Майкрософт запропонувала своє рішення під назвою DEP (від англ. Data Execution Prevention — «запобігання виконанню даних»), включила його в пакети оновлень для Windows XP та Windows Server 2003. DEP використовує додаткові можливості нових процесорів Intel і AMD, для подолання обмеження в 4 ГіБ на можливість адресації пам'яті, розмір пам'яті, притаманне 32-розрядним процесорам. Для цих цілей службові структури були збільшені. Ці структури тепер містять зарезервований біт NX. DEP використовує цей біт для запобігання атакам, пов'язаним зі зміною адреси обробника винятків (так званий SEH-експлойт). DEP забезпечує тільки захист від SEH-експлойта, він не захищає сторінки пам'яті з виконуваним кодом.
До того, Майкрософт розробила механізм захисту стека, призначений для Windows Server 2003. Стек позначається за допомогою позначок (англ. canary), цілісність яких перевіряється. Якщо така позначка була змінена, значить, стек пошкоджено.
Існують також рішення від інших компаній, які запобігають виконанню кода, розташованого в областях пам'яті, призначених для даних або реалізуючих механізм ASLR.
Використання безпечних бібліотек
Проблема переповнення буфера характерна для мов програмування С та , бо вони не приховують деталі низькорівневого представлення буферів як контейнерів для типів даних. Таким чином, задля уникнення переповнення буфера, потрібно забезпечити високий рівень контролю за створенням і зміною програмного коду, який здійснює керування буферами. Використання бібліотек абстрактних типів даних, які виконують централізоване автоматичне керування буферами й містять в собі перевірку на переповнення — один з підходів для запобігання переповнення буфера.
Два основних типи даних, які дозволяють здійснити переповнення буфера в цих мовах — рядки і масиви. Таким чином, використання бібліотек для рядків і спискових структур даних, які були розроблені для запобігання і/або виявлення переповнень буфера, дозволить уникнути багатьох уразливостей.
Примітки
- CORE-2007-0219: OpenBSD's IPv6 mbufs remote kernel buffer overflow. Архів оригіналу за 8 липня 2013. Процитовано 15 травня 2007.
- . Архів оригіналу за 12 травня 2007. Процитовано 15 травня 2007.
- The Exploitant - Security info and tutorials. Архів оригіналу за 8 липня 2013. Процитовано 29 листопада 2009.
- Microsoft Technet Security Bulletin MS04-028. Архів оригіналу за 8 липня 2013. Процитовано 15 травня 2007.
Див. також
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U galuzi komp yuternoyi bezpeki i programuvannya perepovnennya bufera angl buffer overflow abo angl buffer overrun ce yavishe pri yakomu programa pid chas zapisu danih v bufer perezapisuye dani za mezhami bufera Ce mozhe viklikati nespodivanu povedinku vklyuchno z pomilkami dostupu do danih hibnimi rezultatami zboyem programi abo diroyu v sistemi bezpeki Perepovnennya bufera mozhe buti viklikane nedostatnoyu perevirkoyu vhidnih danih Vono ye bazoyu dlya bagatoh urazlivostej v programnih produktah i mozhe buti vikoristane zi zlim namirom Dodatkova perevirka mozhe zapobigti perepovnennyu bufera hocha taka perevirka vpline na shvidkodiyu programi Movi programuvannya zazvichaj zgaduvani u zv yazku z perepovnennyam bufera ce zdebilshogo C ta C Voni ne mayut vbudovanogo mehanizmu proti dostupu abo perezapisuvannya danih u bud yakij chastini pam yati j ne provadyat avtomatichnoyi perevirki danih yaki zapisuyut v masiv na vihid za mezhi masivu Tehnichnij opisPerepovnennya bufera vidbuvayetsya todi koli dani sho zapisuyutsya v bufer cherez nedostatnyu perevirku poshkodzhuyut dani roztashovani za susidnimi do bufera adresami Chasto ce vidbuvayetsya koli kopiyuyetsya ryadok z odnogo bufera v inshij Bazovij priklad V nastupnomu prikladi programa viznachila dva sumizhni ob yekti v pam yati ryadok 8 bajtiv zavdovzhki A i dvobajtove cile B Pochatkovo A mistit nulovi bajti a V mistit chislo 1979 Simvoli mayut rozmir odin bajt im ya zminnoyi A B znachennya porozhnij ryadok 1979 shistnadcyatkove znachennya 00 00 00 00 00 00 00 00 07 BB Teper programa namagayetsya zberegti nul terminovanij ryadok excessive v bufer A Cherez vidsutnist perevirki na dopustimu dovzhinu ryadka vin zatiraye znachennya B im ya zminnoyi A B znachennya e x c e s s i v 25856 shistnadcyatkove znachennya 65 78 63 65 73 73 69 76 65 00 Hocha programist ne zbiravsya zminyuvati znachennya B ce znachennya bulo perezapisane i teper mistit chislo utvorene chastinoyu ryadka V comu vipadku na big endian sistemi sho vikoristovuye ASCII e i nulovij bajt sformuyut chislo 25856 Yaksho za B sliduye nedostupna dlya zapisu dilyanka pam yati zapis she dovshogo ryadka mozhe prizvesti do pomilki segmentaciyi sho pererve proces VikoristannyaTehniki vikoristannya urazlivosti cherez perepovnennya bufera zalezhat vid arhitekturi operacijnoyi sistemi i dilyanki pam yati Napriklad vikoristannya kupi riznitsya vid vikoristannya steka viklikiv Vikoristannya steka Dokladnishe Perepovnennya stekovogo bufera Tehnichno osvidomlenij i zlonamirenij koristuvach mozhe vikoristati stekove perepovnennya bufera tak Dlya perezapisu lokalnoyi zminnoyi zminivshi tim samim perebig programi na vigidnishij dlya napadnika Dlya perezapisu adresi povernennya v stekovomu kadri Koli bude vikonane povernennya z funkciyi vikonannya programi vidnovitsya za adresoyu vkazanoyu napadnikom zazvichaj ce adresa bufera polya vvodu Takij sposib najbilsh rozpovsyudzhenij v arhitekturah de stek roste donizu napriklad v arhitekturi x86 Dlya perezapisiv vkazivnika na funkciyu abo obrobnika vinyatkiv sho budut vikonani zgodom Z metodom trampolajninga angl trampolining bukvalno stribki na batuti yaksho adresa danih yaku vviv koristuvach nevidoma ale yih misceperebuvannya zberigayetsya v reyestri todi adresa povernennya mozhe buti perezapisana na adresu opkodu yakij vikonaye perehid do danih vvedenih koristuvachem Yaksho yih mesceznahodzhennya zberigayetsya v reyestri R todi potriben stribok do opkodu dlya stribka R ce vikliche vikonannya koristuvackih danih Roztashuvannya neobhidnih opkodiv abo bajtiv v pam yati mozhe buti znajdeno v dinamichnih bibliotekah abo samij programi Adresi opkodiv mozhut zminyuvatisya mizh zastosunkami j versiyami OS Metasploit Project odna z baz danih potribnih opkodiv dlya Windows Ne varto plutati stekove perepovnennya bufera z perepovnennyam steka Takozh zauvazhimo sho nayavnist takih vrazlivostej zazvichaj pereviryayetsya za dopomogoyu Vikoristannya perepovnennya v kupi Perepovnennya bufera v kupi vikoristovuyetsya vidminno vid perepovnennya v steku Pam yat v kupi dinamichno rozpodilyayetsya zastosunkom pid chas vikonannya i zazvichaj mistit dani programi Vikoristannya vidbuvayetsya cherez poshkodzhennya danih osoblivim chinom sho prizvodit do perezapisu vnutrishnih struktur danih takih yak zv yaznij spisok vkazivnikiv Urazlivist Microsoft GDI pri obrobci JPEGiv priklad naskilki nebezpechnoyu mozhe buti perepovnennya v kupi ZapobigannyaDlya zmenshennya imovirnosti perepovnennya bufera vikoristovuyutsya nastupni zahodi Sistemi viyavlennya vtorgnennya Dokladnishe Sistema viyavlennya vtorgnen Za dopomogoyu sistem viyavlennya vtorgnennya SVV mozhna viyaviti j zapobigti sprobam viddalenogo vikoristannya perepovnennya bufera Cherez te sho v bilshosti vipadkiv dani priznacheni dlya perepovnennya bufera mistyat dovgi masivi instrukcij No Operation a href wiki NOP title NOP NOP a abo NOOP SVV prosto blokuye vsi vhidni paketi sho mistyat veliku kilkist poslidovnih NOP iv Cej sposib zagalom ne efektivnij bo taki masivi mozhut buti zapisani za dopomogoyu velikogo riznomanittya instrukcij movi asemblera Ostannim chasom zlamuvachi dlya ominannya SVV pochali vikoristovuvati shel kodi z shifruvannyam kodom sho zminyuye sebe sam polimorfnim kodom i abetkovo cifrovim kodom a takozh ataku z povernennyam v biblioteku libc Zahist vid poshkodzhennya steka Zahist vid poshkodzhennya steka vikoristovuyetsya dlya viyavlennya najbilsh poshirenih pomilok perepovnennya bufera Pri comu pereviryayetsya sho stek viklikiv ne buv zminenij pered vihodom z funkciyi Yaksho vin buv zminenij todi programa zavershuye svoye vikonannya z pomilkoyu segmentaciyi Isnuyut tri taki sistemi Libsafe i z stara nazva ProPolice dvi ostanni ye rozshirennyami kompilyatora gcc Pochinayuchi z gcc 4 1 stage2 SSP buv integrovanij v osnovnij distributiv kompilyatora Gentoo Linux i OpenBSD mayut SSP v skladi rozpovsyudzhuvanogo z nimi gcc Majkrosoftivska funkciya bezpeki z zapobigannya vikonannyu danih ne dozvolyaye vikonuvati kod z oblasti pam yati z poznachkoyu tilki dlya danih Zahist prostoru mashinnogo kodu dlya UNIX podibnih sistem Zahist prostoru mashinnogo kodu mozhe pom yakshiti naslidki perepovnennya bufera unemozhlivlyuyuchi bilshist dij zlovmisnika Ce dosyagayetsya ASLR angl Address space layout randomization i abo zaboronoyu odnochasnogo dostupu do pam yati na zapis i vikonannya Stek bez vikonannya zapobigaye bilshosti vrazlivostej kodu obolonki Isnuye dva vipravlennya dlya yadra Linux yaki zabezpechuyut cej zahist PaX i exec shield Zhoden z nih ne ye chastinoyu osnovnogo distributivu yadra OpenBSD pochinayuchi z versiyi 3 3 vklyuchaye sistemu pid nazvoyu W X kotra takozh zabezpechuye kontrol prostoru vikonannya dzherelo Zauvazhimo sho takij sposib zahistu ne zapobigaye poshkodzhennyu steka Z usim tim vin chasto zapobigaye uspishne vikonannya korisnogo vantazhu eksplojta Programa ne v zmozi vstaviti kod obolonki v zahishenu vid zapisu pam yat taku yak isnuyuchi segmenti kodu vikonannya Takozh bude nemozhlivo vikonannya instrukcij v pam yati ne dlya vikonannya napriklad v steku abo v kupi ASLR utrudnyuye dlya zlamnika viznachennya adres funkcij v kodi programi za dopomogoyu yakih vin mig bi zdijsniti uspishnu ataku i robit ataki tipu ret2libc duzhe skladnim zavdannyam hocha voni vse she mozhlivi v kontrolovanomu seredovishi yaksho napadnik vgadaye pravilnu adresu dzherelo Deyaki procesori yak ot Sparc vid Sun vid Transmeta najnovishi 64 rozryadni x86 procesori firm AMD pochinayuchi z Opteron ta Intel pochinayuchi z versij Pentium 4 Prescott zapobigayut vikonannyu kodu roztashovanogo v oblastyah pam yati yaki poznacheni osoblivim bitom NX AMD nazivaye svoye rishennya NX vid angl No eXecute a Intel svoye XD vid angl eXecute Disabled Zahist prostoru mashinnogo kodu dlya Windows Zaraz isnuye dekilka riznih rishen priznachenih dlya zahistu vikonuvanogo kodu v sistemah Windows yaki proponuye kompaniya Majkrosoft i storonni kompaniyi Majkrosoft zaproponuvala svoye rishennya pid nazvoyu DEP vid angl Data Execution Prevention zapobigannya vikonannyu danih vklyuchila jogo v paketi onovlen dlya Windows XP ta Windows Server 2003 DEP vikoristovuye dodatkovi mozhlivosti novih procesoriv Intel i AMD dlya podolannya obmezhennya v 4 GiB na mozhlivist adresaciyi pam yati rozmir pam yati pritamanne 32 rozryadnim procesoram Dlya cih cilej sluzhbovi strukturi buli zbilsheni Ci strukturi teper mistyat zarezervovanij bit NX DEP vikoristovuye cej bit dlya zapobigannya atakam pov yazanim zi zminoyu adresi obrobnika vinyatkiv tak zvanij SEH eksplojt DEP zabezpechuye tilki zahist vid SEH eksplojta vin ne zahishaye storinki pam yati z vikonuvanim kodom Do togo Majkrosoft rozrobila mehanizm zahistu steka priznachenij dlya Windows Server 2003 Stek poznachayetsya za dopomogoyu poznachok angl canary cilisnist yakih pereviryayetsya Yaksho taka poznachka bula zminena znachit stek poshkodzheno Isnuyut takozh rishennya vid inshih kompanij yaki zapobigayut vikonannyu koda roztashovanogo v oblastyah pam yati priznachenih dlya danih abo realizuyuchih mehanizm ASLR Vikoristannya bezpechnih bibliotek Problema perepovnennya bufera harakterna dlya mov programuvannya S ta C bo voni ne prihovuyut detali nizkorivnevogo predstavlennya buferiv yak kontejneriv dlya tipiv danih Takim chinom zadlya uniknennya perepovnennya bufera potribno zabezpechiti visokij riven kontrolyu za stvorennyam i zminoyu programnogo kodu yakij zdijsnyuye keruvannya buferami Vikoristannya bibliotek abstraktnih tipiv danih yaki vikonuyut centralizovane avtomatichne keruvannya buferami j mistyat v sobi perevirku na perepovnennya odin z pidhodiv dlya zapobigannya perepovnennya bufera Dva osnovnih tipi danih yaki dozvolyayut zdijsniti perepovnennya bufera v cih movah ryadki i masivi Takim chinom vikoristannya bibliotek dlya ryadkiv i spiskovih struktur danih yaki buli rozrobleni dlya zapobigannya i abo viyavlennya perepovnen bufera dozvolit uniknuti bagatoh urazlivostej PrimitkiCORE 2007 0219 OpenBSD s IPv6 mbufs remote kernel buffer overflow Arhiv originalu za 8 lipnya 2013 Procitovano 15 travnya 2007 Arhiv originalu za 12 travnya 2007 Procitovano 15 travnya 2007 The Exploitant Security info and tutorials Arhiv originalu za 8 lipnya 2013 Procitovano 29 listopada 2009 Microsoft Technet Security Bulletin MS04 028 Arhiv originalu za 8 lipnya 2013 Procitovano 15 travnya 2007 Div takozhPerepovnennya stekovogo bufera Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi