Введение в переполнение буфера

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

Что такое буферная память?

Отличный вопрос. Буферная память, или буфер, - это просто последовательная часть ОЗУ, отведенная для временного хранения данных во время их передачи из одного места в другое - место, обычно являющееся устройством ввода или вывода. Это сделано для компенсации разницы в скоростях, на которых работают устройства.

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

Атака переполнения буфера

Теперь, когда уязвимость обнаружена на компьютерах, хакеры обязаны использовать ее и пытаться атаковать различные системы с помощью атак переполнения буфера. Теперь возникает вопрос, как хакер выполняет такую ​​атаку и каковы последствия?

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

Атака переполнения буфера может быть в основном классифицирована на два типа

  • На основе стека: когда атака направлена ​​на выделение памяти на основе стека. Это проще в использовании и поэтому более подвержено атакам.
  • На основе кучи: когда атака происходит на выделении памяти на основе кучи. Это не так легко эксплуатировать и, следовательно, гораздо реже.

Наиболее уязвимыми для атак переполнения буфера являются языки C, C ++, Fortran и Assembly, так как они используют методы выделения памяти на основе стека.

Лечение

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

Профилактика лучше, чем лечение

Как разработчики, мы несем ответственность за проверку переполнения буфера в нашем коде. Если переполнение буфера обрабатывается в самом коде, безопасность системы не нарушается атаками переполнения буфера.

Ниже приведены некоторые простые меры предосторожности, которые могут помочь предотвратить переполнение буфера.

  • Обработка исключений должна быть использована для обнаружения переполнения буфера и предотвращения выполнения кода в случае этого.
  • Выделите достаточно большой размер для буферизации, чтобы непреднамеренно обрабатывать большие объемы данных.
  • Избегайте использования библиотечных функций или сторонних методов, которые не проверяются на переполнение буфера. Типичными примерами таких функций, которых следует избегать, являются gets (), scanf (), strcpy () Они в основном на языке C / C ++.
  • Тестирование кода должно учитывать такие уязвимости, тщательно тестировать код и исправлять ошибки, которые могут привести к переполнению.
  • Современные языки программирования, операционные системы и компиляторы кода эволюционировали, чтобы остановить выполнение команды в случае переполнения буфера. Это стало наиболее надежным способом автоматического обнаружения переполнения буфера.

Попробуй сам…

Вы так много поняли о переполнении буфера и атаках на буферы, почему бы не попытаться написать что-то вредоносное самостоятельно?

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

Ниже приведена программа на C, которая может вызвать переполнение буфера. Почему выбор языка C? Это потому, что более продвинутые языки программирования были разработаны для борьбы с переполнением буфера только во время компиляции. Хотя в настоящее время компиляторы C также имеют определенные проверки, чтобы избежать обнаружения переполнения буфера. Таким образом, вы увидите только сообщение об ошибке, указывающее на обнаружение переполнения буфера.

#include
#include
#include
int main(int argc, char *argv())
(
char mybuffer(8);
// copy the user input to mybuffer, without any bound checking
printf("Storing user input to mybuffer…\n");
strcpy(mybuffer, argv(1));
printf("mybuffer content= %s\n", mybuffer);
return 0;
)

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

Еще один пример на языке C ++:

#include
using namespace std;
int main()
(
char buf(8);
cin>>buf;
return 0;
)

Ввод - 123456789

Выход -

Вывод - переполнение буфера

Итак, теперь я уверен, что вы бы поняли важность обработки буфера в вашей программе. Включите эту практику, чтобы проверить границы буфера при написании, а также тестировать свой код. Это поможет вам написать безопасный код.

Рекомендуемые статьи

Это руководство по переполнению буфера. Здесь мы обсудили определение, предотвращение, память, атаку в переполнении буфера. Вы также можете просмотреть наши другие предлагаемые статьи, чтобы узнать больше -

  1. Что такое JavaScript?
  2. Что такое Джанго?
  3. Что такое SQL Developer?
  4. Что такое лазурь?