Предотвращение переполнения буфера

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

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

Переполнение статического буфера

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

Переполнение кучи

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

Ошибки индексирования массивов

Ошибки индексирования массивов также являются источником переполнения памяти. Тщательная проверка границ и управление индексами помогут предотвратить переполнение памяти такого типа.

Предотвращение переполнения буфера в первую очередь связано с написанием хорошего кода. Всегда проверяйте все входные данные и при необходимости завершайте ошибку. Дополнительные сведения о написании безопасного кода см. в следующих ресурсах:

  • Maguire, Steve [1993], Writing Solid Code, ISBN 1-55615-551-4, Microsoft Press, Redmond, Washington.
  • Говард, Майкл и Леблан, Дэвид [2003], Написание защищенного кода, 2d ed., ISBN 0-7356-1722-8, Microsoft Press, Редмонд, Вашингтон.

Примечание

Эти ресурсы могут быть недоступны на некоторых языках и в некоторых странах.

 

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