Переполнение буфера и централизованная обработка ошибок

Я читаю Code Complete 2 и наткнулся на этот оператор в разделе "Обработка ошибок":

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

И позже он говорит:

Этот подход имеет важное значение для безопасности. Если ваш код столкнулся с переполнением буфера, возможно, злоумышленник скомпрометировал адрес подпрограммы или объекта обработчика. Таким образом, если во время работы приложения произошло переполнение буфера, использовать этот подход уже небезопасно.

Но я не мог понять утверждение выше. Как переполнение буфера может привести к компрометации адреса?


person Tarik    schedule 18.08.2014    source источник


Ответы (1)


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

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

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

http://www.primalsecurity.net/0x3-exploit-tutorial-buffer-overflow-seh-bypass/

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

person GOTO 0    schedule 16.09.2014