Переповнення буфера: причини, ефективні методи вирішення проблеми і необхідний захист

Всі програмісти знають про потенційну загрозу переповнення буфера (buffer) в своїх програмах. Існує багато загроз, пов’язаних з ним, як у новому, так і в старому, незалежно від кількості виконаних виправлень. Зловмисники можуть скористатися такою помилкою, впровадивши код, спеціально призначений для того, щоб викликати переповнення початкової частини набору даних, а потім записати залишилися на адресу пам’яті, суміжний з переповненим.

Дані можуть містити виконуваний код, який дозволить зловмисникам запускати більш великі і складні програми або надавати їм доступ до системи. Помилки дуже важко знайти та виправити, тому що ПО коду складається з мільйонів рядків. Виправлення цих помилок досить складні і, в свою чергу, також схильні до помилок, що ускладнює процес усунення.

Визначення переповнення буфера

Перш ніж шукати переповнення, потрібно знати, що вона собою являє. Як випливає з назви, ці уразливості пов’язані з буферами або виділенням пам’яті в мовах, які забезпечують прямий низькорівневий доступ до читання і запису.

При застосуванні мов C і Assembler читання або запис таких розподілів не тягне за собою автоматичної перевірки кордонів. У зв’язку з чим, якщо виявлено переповнення стека буфера в даному додатку, не існує перевірки на можливість приміщення числа байтів у розглянутий буфер. В таких випадках програма може «переповнити» його ємність. Це призводить до того, що дані, записувані після наповнення, переписують вміст наступних адрес стеку і зчитують додаткові. Переповнення може статися ненавмисно через помилки користувача.

Буває, що воно викликане тим, що зловмисний суб’єкт надсилає ретельно створений шкідливий введення в програму, яка потім намагається зберегти його в недостатній буфер. Якщо при цьому буде виявлено переповнення стека буфера в даному додатку, надлишкові дані записуються в сусідній, де замінюють будь-які наявні дані.

Зазвичай вони містять покажчик повернення експлуатованої функції – адреса, за якою процес повинен перейти далі. Зловмисник може встановити нові значення, щоб вони вказували на адресу за вибором. Атакуючий зазвичай встановлює нові значення, щоб позначити місце, де розташована корисне навантаження. Це змінює шлях виконання процесу і миттєво передає управління шкідливого коду.

Використання переповнення буфера дозволяє зловмисникові контролювати або завершити роботу процесу або змінювати його внутрішні змінні. Це порушення займає місце в топ-25 найбільш небезпечних програмних помилок світу (2009 CWE/SANS Top 25 Most Dangerous Programming Errors) і визначається як CWE-120 в словнику перерахувань слабких системних місць. Незважаючи на те, що вони добре вивчені, вони продовжують завдавати шкоди популярних програм.