Поделиться через


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

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

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

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

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

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

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

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

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

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

  • Maguire, Стив [1993], Написание надежного кода, ISBN 1-55615-551-4, Microsoft Press, Редмонд, Вашингтон.
  • Говард, Майкл и ЛеБлан, Дэвид [2003], Написание Безопасного Кода, 2-е изд., ISBN 0-7356-1722-8, Microsoft Press, Рэдмонд, Вашингтон, США.

Заметка

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

 

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