КАТЕГОРИИ: Архитектура-(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; Просмотров: 532; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |