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

Виконання атаки через root

Помилки кодування зазвичай є причиною переповнення buffer. Поширені помилки при розробці додатків, які можуть привести до нього, включають в себе нездатність виділити досить великі буфери і відсутність механізму перевірки цих проблем. Такі помилки особливо проблематичні в мовах C/C++, які не мають вбудованої захисту від переповнення і часто є об’єктами атак переповнювання буфера.

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

У наведеному прикладі програма надає користувачеві привілеї root, навіть якщо він ввів неправильний пароль. У цьому випадку зловмисник надає вхід, довжина якого більше, ніж може вмістити буфер, створюючи переповнення, перезаписывающего пам’ять цілого числа pass. Тому, незважаючи на невірний пароль, значення pass стає ненульовим, і зловмисник отримує права root.