Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Применение проверок целостности блоков данных




Применение проверок выхода за границы буфера

 

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

Следует отметить, что реализованные проверки ограничены только точными ссылками на элементы массивов, но не производятся для указателей. Однако у такого решения есть существенный недостаток – значительное (до 30 раз) снижение производительности программы.

Другие системы осуществляют проверки при доступе к памяти, выполняя вставки дополнительного объектного кода проверок во все места программы, где есть обращения к памяти. Вставки могут производиться как до сборки объектных файлов (Purify), так и после (Pixie). Такие проверки сказываются на производительности с ее уменьшением от 2 до 5 раз и скорее подходят для отладки.

 

 

Решение, основанное на данном способе, получено благодаря проекту Synthetix. При таком подходе вводится понятие так называемого квази-постоянства (Quasi-invariant), т. е. состояния среды, которое неизменно в определенных рамках. Такое квази-постоянство позволяет устранить некоторый избыточный код проверки выполнения различных условий. В рамках проекта реализован набор утилит, в т. ч. обеспечивающих контроль и защиту квази-постоянных состояний среды. К их числу относятся StackGuard и PointGuard.

StackGuard предназначен для защиты от всех атак по переполнению буфера с изменением адреса возврата из функции и реализован в виде дополнения к компилятору gcc. Данное дополнение изменяет пролог и эпилог всех функций с целью проверки целостности адреса возврата из функции при помощи " canary word " (рис. 2.7).

 

Рис. 2.7. Состояние стека при вызове некоторой функции

с использованием " canary word "

Измененный пролог каждой функции выполняет занесение в стек " canary word ", а эпилог – проверку содержимого стека, занесенного ранее, и, в случае нарушения, останавливает программу с предупреждающим сообщением.

При атаке с искажением адреса возврата неизбежно произойдет искажение " canary word ", что и будет признаком нарушения целостности. Таким образом, целостность адреса возврата определяется целостностью " canary word ".

В терминологии Synthetix нарушение целостности является нарушением квази-постоянства среды. При известном значении " canary word " атакующий может организовать подмену адреса возврата без нарушения целостности. Поэтому " canary word " формируется StackGuard особым образом:

1) имеет значения 0, CR, LF, EOF, что не позволит провести атаку при переполнении буфера в библиотечных функциях С++, так как данные значения являются признаками конца строки;

2) имеет псевдослучайное значение, генерируемое при каждом запуске программы.

Продукт PointGuard предназначен для защиты от атак на указатели функций. Он также реализован в виде дополнения к компилятору gcc и осуществляет защиту путем помещения " canary word " перед каждым указателем функции и таблицей переходов.

Существует ряд трудностей с реализацией данного алгоритма защиты:

1) размещение " canary word " должно выполняться одновременно с выделением памяти под переменную;

2) инициализация одновременно с инициализацией переменной;

3) проверка целостности должна производиться при каждом обращении к защищаемой переменной.

Поэтому PointGuard ограничивается лишь статическими указателями на функции, которые не являются агрегативными.

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

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

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

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

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

Аналогичное решение по защите программного обеспечения от атак переполнения буфера реализовано в компиляторе Visual Studio.NET. При компиляции с ключом / GS компилятор добавляет в код security cookie – так в терминологии Microsoft называется случайный 32-битный canary word, хранящийся во writable -памяти и инспектируемый функцией check_canary при выходе из функции.

 

 




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 500; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.