Защита от переполнения буфера памяти


Большинство атак по переполнению буфера проводят простые «сценаристы», которые не понимают, как происходит атака. Они просто сканируют определенную сеть с помощью автоматизированного инструмента, выявляют слабые места в системе, загружают код взлома, написанный кем-то другим, и направляют инструмент взлома против выбранной сети. Скорее всего, код взлома был разработан человеком, лучше разбирающимся в уязвимых программах и преуспевшим в создании успешных программ взлома.

Как же создатель программ по переполнению стековой памяти находит программы, уязвимые с данной точки зрения? Этот человек тщательно проанализирует программы, где содержатся функции, не проверяющие границы локальных переменных. Если у атакующего есть исходный код программы, он может поискать часто применяемые функции, которые не проверяют локальные переменные.

Рассмотренная ранее strcpy - как раз такая функция, которой программисты часто неправильно пользуются, в результате данная функция становится уязвимой при переполнении стековой памяти.


Как защититься от переполнения буфера памяти



Создатель программы взлома станет искать исходный код или воспользуется отладчиком, чтобы узнать, какие из этих функций применяются в выбранной программе. Если у атакующего будет исходный код, с помощью автоматизированных инструментов он без труда обнаружит недостатки программы.

При отсутствии исходного кода создатель программы взлома прибегнет к более грубому способу, чтобы выявить уязвимые программы. Он запустит программу в своей лаборатории и с помощью специального инструмента станет вводить туда огромные объемы информации. Пространство, отведенное для записи данных локальных пользователей, а также для ввода данных в сети, будет заполнено этой информацией. При загрузке большого объема информации в программу атакующий должен убедиться, что данные периодически повторяются, например символ «А» включен тысячи раз.

Хакер будет искать программу, которая в таких условиях откажется работать, причем стремится обнаружить подобные приложения не просто так, а для своей выгоды. Атакующие хотят, чтобы введенные данные (например, символ «А», шестнадцатеричный код которого 0x41) заменили указатель возврата, когда произойдет аварийный отказ программы от работы.

Рассмотрим пример знаменитой программы взлома переполнением буфера, которая широко рекламировалась командой еЕуе в середине 1999 года. Эта команда искала слабые места в Internet Information Server от Microsoft, отправляя ему огромный объем информации с помощью своего продукта Retina.

После часа загрузки данных информационный сервер оказался в аварийном состоянии, а в журналах процессора остались следующие записи:

ЕАХ = 00F7FCC8 ЕВХ = 00F41130

ЕСХ - 41414141 EDX - 77F9485A

ESI - 00F7FCC0 EDI - 00F7FCC0

EIP - 41414141 ESP - 00F4106C

EBP = 00F4108C EFL = 00000246

Не смотрите на разные значения, обратите внимание на указатель команды (EIP). Атакующие просто обожают этот указатель. Введенные в программу данные (повторяющийся набор 0x41) каким-то образом заменили указатель команды. Скорее всего, вписанная пользователем информация переполнила буфер, заменила указатель возврата, а затем перешла и в указатель команды.

Основываясь на полученных результатах, команда еЕуе разработала программу взлома, которая позволяла атакующему получить доступ к системам Windows NT.

Когда создатели программ взлома находят уязвимый вызов функции (либо исследуя исходный код, либо с помощью отладчика, либо путем ввода огромного объема информации), они тщательно анализируют, как функция получает данные от пользователя. Затем пишется специальный код, который введет подобные данные в программу, чтобы заменить указатель команды и указатель возврата.

И опять же, правильное создание кода и присвоение указателю возврата правильного значения - трудоемкий процесс. Кроме того, в командах, помещенных в стек, не должно быть таких символов, которые фильтруются программой. При нарушении работы уязвимой символьной функции в коде и указателе возврата нуль-символы, которые останавливают выполнение многих функций, должны отсутствовать.


Автор: pimka21

Еще советуем:
  • Безопасность компьютера: обман IDS
  • Что такое переполнение буфера памяти
  • Стековая память: как защитить ее от переполнения
  • Атаки переполнения стековой памяти
  • Безопасность компьютера: атаки на приложения и операционные системы