Відмінності між версіями «Переповнення буфера»

м
Рядок 1: Рядок 1:
 
Змінити назву на Переповнення буферу у стеку.
 
Змінити назву на Переповнення буферу у стеку.
  
'''Переповнення буфера у стеку(Buffer Overflow/Overrun)''' – це таке явище, коли програма, під час запису даних в буфер у стеку, перезаписує дані за його межами. Ця вразливість являється частинним випадком [http://uk.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D0%BE%D0%B2%D0%BD%D0%B5%D0%BD%D0%BD%D1%8F_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0 Переповнення буферу].
+
'''Переповнення буфера у стеку (Buffer Overflow/Overrun)''' – це таке явище, коли програма, під час запису даних в буфер у стеку, перезаписує дані за його межами. Ця вразливість являється частинним випадком [http://uk.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D0%BE%D0%B2%D0%BD%D0%B5%D0%BD%D0%BD%D1%8F_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0 Переповнення буферу].
  
  
Рядок 23: Рядок 23:
 
1. Застосування безпечних бібліотек
 
1. Застосування безпечних бібліотек
  
 +
Високі мови програмування такі як C та С++ не виконуються контролю розміру даних, що заносяться в буфер. Для цього щоб уникнути даної вразливості необхідно використовувати спеціальні "безпечні" бібліотеки, які використовуються такі типи або класи що мають вбудовану перевірку довжини даних що заносяться в буфер.
  
 +
2. Захист від пошкодження стеку
  
 +
Цей тип захисту використовуються для виявлення пошкодження стеку. Після виконання функції перевіряється адреса повернення на зміни. Якщо зміни виявлена програма припиняє своє виконання з помилкою.
  
 +
3. Розіделення стеку
  
 +
Стек містить як і дані програми так і системні дані(адреса повернення, значення вказівників ітд). Стек даних програмно розділяєтсья на 2 стеки, в одному розміщується тільки програмні дані, в другому службові дані. Це дозволить уникнути зміни адреси повернення і виконання довільного коду.
 +
Недоліком такого методу є те що переповнення буферу стеку можна реалізувати в стеку з програмними даними.
 +
Існують дві системи
  
 
Слід відмітити що перевірка розміру вхідних даних, що заноситься в стек, є більш ресурсозатратною ніж просте занесення даних, і інколи не потрібне здійснювати перевірку вхідних даних.
 
Слід відмітити що перевірка розміру вхідних даних, що заноситься в стек, є більш ресурсозатратною ніж просте занесення даних, і інколи не потрібне здійснювати перевірку вхідних даних.

Версія за 12:16, 30 березня 2011

Змінити назву на Переповнення буферу у стеку.

Переповнення буфера у стеку (Buffer Overflow/Overrun) – це таке явище, коли програма, під час запису даних в буфер у стеку, перезаписує дані за його межами. Ця вразливість являється частинним випадком Переповнення буферу.


Причини вразливості

Причиною появи цієї вразливості є розміщення буферу у стеку процесу. Без належного контролю як програміста так і мови програмування за допомогою спеціальних маніпуляцій можна виконати цілеспрямовану зміну даних за межами буферу. Запис у стек здійснюється за принципом FIFO. Якщо не виконувати перевірку розміру вхідних даних, що заносяться в стек, можна перезаписати дані які перед тим знаходились у ньому. Це завжди приводить до втрати інформації, яка перезаписується. Ця вразливість поширена у програмах написаних на мові низького рівня - Assembler, та на мовах високого рівня С та С++, які не виконуються контролю розміру даних, що заносяться в буфер, а покладають відповідальність за виконання цих операцій на програміста. Цей тип вразливостей є одним із найстаріших і найефективніших методів злому програм.

Застосування переповнення буферу у стеку

Наведемо приклад практичної реалізації переповнення буферу у стеку на мові С++. Для цього розглянемо код програми що заносить до буферу дві змінні int intValue та char String[5]

Приклад реалізації////


Способи захисту

Є декілька способів захисту від цієї вразливості

1. Застосування безпечних бібліотек

Високі мови програмування такі як C та С++ не виконуються контролю розміру даних, що заносяться в буфер. Для цього щоб уникнути даної вразливості необхідно використовувати спеціальні "безпечні" бібліотеки, які використовуються такі типи або класи що мають вбудовану перевірку довжини даних що заносяться в буфер.

2. Захист від пошкодження стеку

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

3. Розіделення стеку

Стек містить як і дані програми так і системні дані(адреса повернення, значення вказівників ітд). Стек даних програмно розділяєтсья на 2 стеки, в одному розміщується тільки програмні дані, в другому службові дані. Це дозволить уникнути зміни адреси повернення і виконання довільного коду. Недоліком такого методу є те що переповнення буферу стеку можна реалізувати в стеку з програмними даними. Існують дві системи

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