Содержание к диссертации
Введение
1. Современное состояние проблемы уязвимостей компьютерных систем 15
1.1 Особенности современного этапа развития информационных сие- 15
тем с точки зрения их безопасности
1.2. Программные средства автоматического обнаружения и блокирования уязвимостей
1.2.1 Статические и динамические сканеры уязвимостей 24
1.2.2. Надстройки к компилятору 27
1.2.3. Надстройки к ядру 29
1.3. Аппаратные средства блокирования уязвимостей 31
Выводы к главе 1 33
2. Исследование уязвимостей программного кода, создающих предпосылки для проведения атак на компьютерные системы
2.1. Переполнение буфера 42
2.1.1. Структура памяти процесса 42
2.1.2. Переполнение буфера, размещенного в стеке 47
2.1.3. Переполнение произвольного буфера 55
2.1.4. Переполнение буфера, размещенного в куче
2.2. Уязвимость форматной строки 61
2.3. Переполнение целого
2.3.1. Переполнение разрядной сетки 66
2.3.2. Арифметическое переполнение 69
2.3.3. Ошибки в знаке
2.4. Состязания условий 76
2.5. Уязвимости интерпретируемых языков 85
2.6. Методика безопасного программирования
2.6.1. Правила безопасного программирования 90
2.6.2. Метод оценки количества уязвимостей в программе 92
2.6.3. Оценка повышения защищённости программ при использо вании предлагаемой методики
Выводы к главе 2 100
3. Использование рандомизации элементов архитектуры процессора для повышения его защищённости
3.1. Рандомизация системы команд 104
3.1.1. Изменения, вносимые в архитектуру процессора 104
3.1.2. Описание функционирования системы 108
3 1.3. Особенности обработки команд переходов 112
3.1.4. Оценка накладных расходов
3.2. Противодействие атакам, построенным по схеме «ret to libc» 124
3.3. Противодействие уязвимостям переполнения целого 128
3.4. Критерии эффективности системы рандомизации 129
3.4.1. Выявление наиболее важных критериев 130
3.5. Исследование вопросов реализации ГПСЧ для формирования таб лицы замен 135
3.5.1. Регистр сдвига со стохастической обратной связью (RFSR) 139
3.5.2. Выбор рандомизационного генератора ПСЧ 140
Выводы к главе 3 141
4. Внедрение разработанных методов и средств противодействия уязви- мостям компьютерных систем
4.1. Исследование уязвимостей ВК «Эльбрус-ЗМ1» 144
4.2. Исследование двоичного транслятора ВК «Эльбрус-ЗМ1» 147
4.3. Разработка методики обучения безопасному программированию
4.3.1. Особенности обучения безопасному программированию 159
4.3.2. Программные средства для обучения безопасному программированию 168
Выводы к главе 4 174
Заключение 176
Список использованных источников 179
- Программные средства автоматического обнаружения и блокирования уязвимостей
- Переполнение буфера, размещенного в стеке
- Описание функционирования системы
- Исследование двоичного транслятора ВК «Эльбрус-ЗМ1»
Введение к работе
Актуальность темы
В настоящее время информатизация проникла практически во все сферы человеческой деятельности. Однако, уделяя большое внимание новым функциональным возможностям средств хранения и обработки информации, разработчики часто упускают из виду вопросы защищённости своих продуктов. Уязвимость программного кода, умышленно или чаще случайно оставленная разработчиком, может стать причиной глобальных электронных «эпидемий», наносящих ощутимый финансовый ущерб, а при определённых обстоятельствах способна даже привести к разрушению материальных объектов и гибели людей. Понятие уязвимости (vulnerability) можно определить как свойство компьютерной системы, наличие которого может позволить злоумышленнику нанести ущерб интересам владельца системы, иначе говоря, привести к реализации угрозы информационной безопасности (ИБ). Уязвимость программного кода -это особенность написания исходного кода программы, в результате наличия которой злоумышленник, используя специальным образом подготовленные входные данные или другие параметры программного окружения, может заставить уязвимую программу работать по алгоритму, отличному от заложенного программистом. Имеющиеся в настоящее время средства противодействия вредоносным программам не всегда могут справиться с решением своей задачи, главным образом потому, что нацелены на обнаружение и устранение последствий функционирования уже известных вредоносных программ и блокирование предварительно обнаруженных уязвимостей. Для повышения защищённости приложений требуется одновременно идти несколькими путями: искать универсальные признаки групп уязвимостей с целью их эффективного обнаружения, разрабатывать превентивные меры противодействия вредоносным программам, а также развивать системный подход к обучению новых разработчиков, способных уже на этапе написания программы обнаруживать и устранять содержащиеся в ней уязвимости.
Работы, посвященные исследованию уязвимостей, содержат, в основном, перечисление существующих проблем, но не дают рекомендаций по повышению защищённости программного обеспечения (ПО). Разделение уязвимостей по классам могло бы дать программистам мощный инструмент выявления уязвимостей и предотвращения их использования. Однако в настоящее время комплексных работ по всем видам уязвимостей проведено не было.
Отчасти задача повышения защищённости приложений решается за счёт использования сканеров уязвимостей и безопасных компиляторов, которые в автоматическом режиме помогают обнаружить многие из из-
вестных уязвимостеи и уменьшить риск их возникновения за счёт замены опасных функций на их безопасные аналоги. Однако использование таких инструментов возможно только при наличии исходного кода защищаемого приложения, а кроме того при этом увеличивается объём приложения и снижается его производительность. Эффективных инструментов защиты приложений, доступных только в виде исполнимых файлов в настоящее время не предложено.
Безопасность приложения должна закладываться на этапе написания исходного кода. Для этого необходима подготовка новых разработчиков, обладающих не только навыками программирования, но и хорошо знакомых с вопросами разработки защищенного ПО.
О необходимости подготовки таких специалистов говорится в Федеральной целевой программе развития образования на 2011 - 2015 гг., где ставится задача подготовки кадров по приоритетным направлениям модернизации и технологического развития экономики России, в числе которых выделяются стратегические компьютерные технологии и программное обеспечение. Также в Доктрине информационной безопасности среди основных задач выделяется создание единой системы подготовки кадров в области информационной безопасности и информационных технологий.
Таким образом, актуальность работы определяется возрастающими угрозами информационной безопасности, связанными с уязвимостями ПО, а также отсутствием эффективных методов противодействия уязвимостям программных систем, для которых не доступен исходный код.
При этом исследование механизмов появления наиболее опасных уязвимостеи, принципов их использования при проведении атак на компьютерные системы и разработка программно-аппаратных методов противодействия им, а также разработка методики подготовки специалистов в области защиты от разрушающих программных воздействий (РПВ) является актуальной научной задачей.
Значительный вклад в исследование вопросов безопасного программирования, методов выявления уязвимостеи внесли такие ученые как Н. Данжани (Nitesh Dhanjani), Дж. Кларк (Justin Clarke), Дж. С. Фостер (James foster), М. Мейсер (Matt Messier), Дж. Вега (John Viega), М. Ховард (Michael Howard), Д. Лебланк (David LeBlanc), Дж. Эриксон (Jon Erickson), Мэтт Бишоп (Matt Bishop), а также специалисты фирм Лаборатория Касперского, Symantec и других.
Цель исследования. Целью представленной работы является повышение защищённости компьютерных систем за счёт противодействия атакам, основанным на использовании уязвимостеи, вносимых на этапе программирования.
Для достижения данной цели были решены следующие задачи:
проведён анализ и разработана классификация существующих уязвимостей ПО;
исследованы наиболее распространённые уязвимости ПО типа Buffer overflow (Stack smashing и Heap overflow), Race condition, Integer overflow (Widthness overflow, Arithmetic overflow, Signedness errors), Format string error, создающие предпосылки для проведения атак, в том числе основанных на внедрении вредоносного кода;
исследованы существующие и разработаны оригинальные методы выявления и устранения уязвимостей программного кода, противодействия атакам, использующих известные уязвимости;
разработана методика безопасного программирования, иначе говоря, создания программ, свободных от типичных уязвимостей, создающих предпосылки для проведения атак на компьютерные системы;
разработаны методы противодействия уязвимостям прикладного ПО в случае, если исходный код приложения недоступен.
Объектом исследования является системное и прикладное ПО компьютерных систем.
Предмет исследования - уязвимости программного кода, создающие предпосылки для проведения атак на компьютерные системы, методы противодействия атакам на компьютерные системы.
Методы исследования. При решении поставленных задач использовались методы теории вероятностей и математической статистики, методы имитационного моделирования, методы модульного и объектно-ориентированного программирования, теория надёжности ПО, методы принятия решений.
Работа соответствует пунктам 1, 6, 14, 15 специальности 05.13.11 и пунктам 3, 8 специальности 05.13.19.
Научная новизна результатов работы заключается в следующем.
Разработана классификация уязвимостей ПО, создающая предпосылки для создания наиболее эффективных методов противодействия выявленным типам уязвимостей.
Разработаны модель нарушителя и модель атаки на компьютерную систему, основанной на использовании уязвимостей программного кода;
Предложен метод оценки повышения защищённости программы при использовании методики безопасного программирования, основанный на применения модели надежности ПО Миллса. Показано, что преимуществом применения этой модели по сравнению с классическим ее использованием является возможность учета выявленных на этапе классификации чётких признаков вносимых уязвимостей.
Предложен аппаратный метод защиты от эксплойтов, основанных на вставке вредоносного кода в программу; разработана модель рандоми-зационного генератора псевдослучайных чисел (ГПСЧ);
Впервые предложены методы повышения защищённости вычислительных систем, работающих в режиме виртуальной машины, эмулирующей аппаратные ресурсы вычислительной системы.
Практическая значимость результатов работы заключается в следующем.
Разработана методика безопасного программирования, позволяющая создавать ПО, свободное от появления типичных уязвимостей.
Разработана методика обучения безопасному программированию, поддержанная учебно-методическим пособием, электронными средствами обучения и системой тестирования знаний.
Впервые проведен анализ защищенности отечественного высокопроизводительного ВК «Эльбрус-ЗМ1».
На защиту выносятся:
классификация уязвимостей ПО;
методика безопасного программирования, позволяющая создавать программы, свободные от известных уязвимостей программного кода;
аппаратный метод повышения защищённости вычислительной системы от атак, основанных на внедрении вредоносного кода и разрушении стека;
метод оценки количества уязвимостей, остающихся в программе после этапа её тестирования на предмет наличия уязвимостей;
результаты исследования защищенности отечественного высокопроизводительного ВК «Эльбрус-ЗМ1»;
методы повышения защищённости вычислительных систем, работающих в режиме двоичного транслятора.
Достоверность основных положений диссертации обеспечивается корректностью применения математического аппарата, доказанностью выводов, совпадением теоретических результатов с экспериментальными, успешной практической реализацией результатов в образовательной деятельности, апробацией на научно-технических конференциях и семинарах, а также внедрением результатов в практическую деятельность ряда организаций.
Апробация работы. Основные результаты работы докладывались и обсуждались на Научных сессиях МИФИ 2003, 2004, 2008 гг. и НИЯУ МИФИ 2010 г., выставках-конференциях «Телекоммуникации и новые информационные технологии в образовании» (МИФИ, 2004 и 2006 гг.), международных телекоммуникационных конференциях студентов и молодых ученых "МОЛОДЕЖЬ И НАУКА" (МИФИ, 2005, 2010, 2012 гг.), Международном симпозиуме «Образование через науку», посвященную 175-
летию МГТУ им. Н.Э. Баумана (2005 г.), Первой Международной научно-практической конференции «Современные информационные технологии и ИТ-образование» (МГУ, 2005 г.), Международном научно-техническом семинаре «Современные технологии и задачи управления, автоматики и обработки информации» (Алушта, 2006 г.), Всероссийской научно-практической конференции с международным участием «Информационные технологии в обеспечении нового качества высшего образования» (Москва, 2010 г.), 54-й научной конференции МФТИ - Всероссийской молодёжной научной конференции с международным участием «Проблемы фундаментальных и прикладных, естественных и технических наук в современном информационном обществе» (2011 г.), XIX Всероссийской научной конференции "Проблемы информационной безопасности в системе высшей школы" (НИЯУ МИФИ, 2012 г.), научном семинаре ЗАО МЦСТ (2010 г.). Система тестирования «Исток» экспонировалась на Всероссийской выставке научно-технического творчества молодежи НТТМ-2006.
Реализация результатов работы.
Разработанная классификация уязвимостей была использована при анализе защищённости ВК «Эльбрус-ЗМ1» (ЗАО МЦСТ). Разработанная методика обучения безопасному программированию внедрена на кафедре «Компьютерные системы и технологии» НИЯУ МИФИ.
Результаты диссертационной работы в части, касающейся общих принципов построения компьютерных обучающих программ и систем тестирования и реализованных на их основе программных средств, внедрены в учебный процесс НИЯУ МИФИ (факультет Кибернетики и информационной безопасности, факультет Очно-заочного (вечернего) обучения, Институт инновационного менеджмента).
Основные научные результаты работы были получены в процессе выполнения НИР в рамках Федеральной целевой программы «Научные и научно-педагогические кадры инновационной России» на 2009-2012 гг.
За работы в области создания средств учебного назначения автор в составе коллектива разработчиков награжден Дипломом Всероссийской выставки научно-технического творчества молодежи НТТМ-2006 и тремя Грамотами выставок-конференций «Телекоммуникации и новые технологии в образовании», проводимых в рамках ежегодных Научных сессий НИЯУ МИФИ.
Практическое использование результатов диссертации подтверждено тремя актами о внедрении.
Публикации.
Результаты диссертации опубликованы в 22-х печатных работах, в том числе трёх статьях в журналах, входящих в Перечень ведущих рецензируемых научных журналов и изданий, рекомендованных ВАК. 7 работ
опубликованы без соавторов. Результаты, изложенные в остальных работах, получены при определяющем личном участии автора. На разработанные обучающие программные средства получено два Свидетельства об официальной регистрации программ для ЭВМ.
Структура и объем работы. Работа состоит из введения, четырех глав, заключения, списка использованных источников из 135 наименований и приложения. Общий объем работы составляет 189 страниц и включает 36 рисунков и 22 таблицы.
Программные средства автоматического обнаружения и блокирования уязвимостей
Пример эксплойта, атакующего уязвимую программу П.1, приведён в П.З. Данный эксплойт запускается в системе простым, непривилегированным пользователем, вызывает уязвимую программу, владельцем которой является root, переполняет в ней буфер, передает управление на shell-код и, фактически, получает права root в системе.
Механизм работы эксплойта следующий. Сначала злоумышленник формирует в эксплойте последовательность данных, которые и переполнят буфер. Для этого выделяемая в строке 10 программного кода память сначала заполняется произвольными данными (строки 13, 14), а потом дописывается shell-кодом (строки 15, 16). После того, как к атаке все готово, вызывается уязвимая программа (строка 18). В рассматриваемом примере уязвимая программа называется vl. На вход программе передается как раз сформированная последовательность данных для переполнения буфера и выполнения shell-кода (строка 17).
В зависимости от того, где находится исполнимый вредоносный код, на который передаётся управление при переполнении буфера, можно выделить несколько способов атаки уязвимой программы. Помимо описанного здесь кода, вставляемого непосредственно в область стека (когда пользовательские данные одновременно содержат и новый адрес возврата, и shell-код, на который будет передано управление), наибольший интерес представляют программы по так называемой схеме «ret to libc». Здесь ret обозначает команду ассемб лера, a libc - это библиотека языка С, содержащая основные системные функции, используемые программистом (ввод-вывод, системные вызовы, печать и т.д.). Суть атаки по данной схеме заключается в том, что при переполнении в стек перед адресом возврата помещаются параметры системного вызова (параметрами, как правило, являются адреса областей памяти, где хранятся их непосредственные значения), а вместо адреса возврата записывается адрес, по которому размещается точка входа в ту или иную функцию из системной библиотеки libc. В этом случае при выполнении RET из атакованной функции в качестве адреса вместо адреса возврата будет считан адрес системной функции (как правило, злоумышленники используют функцию system), после чего ей будет передано управление. Функция будет считывать необходимые ей параметры - а они уже приготовлены злоумышленником и лежат в стеке. Как правило, это строка «sh /bin/sh», исполнение которой приведёт к передаче управления в консоль с правами вызывавшей программы.
Способы защиты от уязвимости Для того чтобы данный эксплойт стал бесполезным, можно использовать сразу несколько путей. Рассмотрим некоторые из них. Использование безопасных функций. Разобранный выше пример уязвимости показывает, насколько опасно может быть использование небезопасных функций, работающих с буферами.
Существуют безопасные функции, в которых имеются необходимые проверки, но не все программисты о них знают и еще меньшее число ими пользуется. Выше упоминались наиболее часто используемые небезопасные функции. Следует отметить, что для них существуют и безопасные аналоги, которые рекомендуется использовать. Среди них можно упомянуть функции из стандартной библиотеки С обработки строк strncpy (), strncat () и другие.
Неисполняемый стек. Современные процессоры поддерживают флаг NX, который запрещает исполнение кода в сегменте, на котором установлен данный флаг. Соответственно, установив этот флаг на сегмент стека, можно запретить выполнение в нём shell-кода. Существуют патчи [66] для ядра, позволяющие включить использование этого флага, но при этом теряется обратная совместимость с программным обеспечением, написанным ранее и исполняющим код в стеке.
Проверки выхода за границы. Существует патч [67] для компилятора, который вставляет в код проверки выхода за границы при всех обращениях к массивам и указателям. Недостатком такого решения является сильное падение производительности (в несколько десятков раз) и необходимость перекомпиляции программы.
Проверка целостности. Данный алгоритм основан на размещении перед адресом возврата псевдослучайного кода проверки целостности (StackShield) [68] или сохранение адреса возврата в альтернативном стеке и использования технологии сторожевых байтов (StackGuard). При выходе из функции проводится проверка адреса возврата, и при обнаружении его искажения - аварийное завершение. Достоинство этого метода в том, что он не сильно сказывается на скорости выполнения программы. StackShield и StackGuard реализованы в виде патчей к компилятору gcc.
В П.4 и П.5 приведены примеры безопасного кода для уязвимой программы, рассматриваемой в данном разделе. Прежде всего, к хорошему тону в программировании относится наличие проверок на длину данных, вводимых пользователем. Также просто необходимо использовать функции, которые осуществляют запись в буфер только такого объема данных, на который этот буфер рассчитан (П.4), либо динамически выделять память в соответствии с фактическим размером переменной, из которой будет произведено копирование (П.5).
Переполнение буфера, размещенного в стеке
Однако гарантировать, что использование этих правил приведёт к составлению программы, полностью свободной от уязвимостей, нельзя. Это напоминает ситуацию с наличием функциональных ошибок в программе. Как наличие ошибок в программе может привести к её неправильной работе на некоторых наборах входных данных, так и наличие определённых уязвимостей в программном коде создаёт предпосылки для НСД. В ГОСТ даются следующие определения надёжности и защищённости:
Надежность - набор атрибутов, относящихся к способности программного обеспечения сохранять свой уровень качества функционирования при установленных условиях за установленный период времени [80].
Защищенность - это совокупность свойств программного средства, характеризующая его способность предотвращать НСД как случайный, так и умышленный, к программам и данным, а также степень удобства и полноты обнаружения результатов такого доступа или действий по разрушению программ и данных [81].
Таким образом, понятия защищённости и надёжности во многом близки. При этом одной из основных составных частей надёжности является устойчивость к ошибке, то есть способность поддерживать определенный уровень качества функционирования в случаях программных ошибок или нарушения определенного интерфейса. Существует большой набор моделей и методик, предназначенных для решения задач обеспечения надёжности ПО и её оценки. В то же время для решения задач обеспечения и оценки защищённости ПО такого математического аппарата нет. Поэтому рассмотрим возможность использования моделей надёжности ПО применительно к анализу его защищённости.
Отладка ПО проводится до тех пор, пока интенсивность появления потока ошибок не снизится до приемлемой для данного применения величины, то есть среднее время наработки на отказ будет достаточно большим. Поэтому многие модели надёжности ориентируются на анализ времён появления очередной ошибки (модель Джелинского-Моранды, Шика-Уолвертона и т.д.) [82].
В то же время можно утверждать, что если программа попадёт в руки злоумышленника на достаточно продолжительное время, то она будет взломана. Поэтому оценка её защищённости может проводиться по степени её стойкости, то есть по длительности периода, на протяжении которого она противостоит атакам. А этот показатель определяется количеством уязвимостей, оставшихся в программе после этапа её тестирования. Следовательно, использовать модели надёжности ПО, основанные на анализе временных характеристик проявления ошибок в программах, в рассматриваемой ситуации нецелесообразно. Для этого следует использовать другие модели, например, модель Мил-лса [82].
Эта модель строится на статистическом фундаменте. Сначала программа «засоряется» некоторым количеством известных ошибок. Эти ошибки вносятся в программу случайным образом, а затем делается предположение, что для её собственных и внесённых ошибок вероятность обнаружения при последующем тестировании одинакова и зависит только от их количества. Тестируя программу в течение некоторого времени и отсортировывая собственные и внесенные ошибки, можно оценить N - первоначальное число ошибок в программе, а также установить доверительный уровень прогноза.
Предположим, что в программу было внесено S ошибок, после чего началось тестирование. Пусть при тестировании обнаружено п собственных ошибок и v ошибок из числа внесённых. Тогда оценка для N по методу максимального правдоподобия будет равна:
Процесс внесения ошибок в настоящее время является самым слабым местом данной модели, поскольку предполагается, что для собственных и внесённых ошибок вероятность обнаружения одинакова (но неизвестна). Из этого следует, что внесённые ошибки должны быть «типичными» образцами ошибок. Это обеспечить довольно сложно, так как стиль программирования, квалификация и другие индивидуальные особенности разработчиков программы и специалистов, которые вносят в неё заведомо известные ошибки, обычно не совпадают.
Однако применение данного подхода к анализу защищённости ПО оказывается более плодотворным по сравнению с его классическим использованием, поскольку для обычных ошибок сведения об их свойствах не достаточно строго детерминированы, а при этом построенная автором в [7] классификация уязвимостеи позволяет выделить типовые ситуации, характеризующие тот или иной класс уязвимостеи, и внести определённое количество уязвимостеи каждого класса в исходный текст программы.
Применительно к оценке защищённости использование модели Миллса будет выглядеть следующим образом. Внесём в программу S уязвимостеи, в том числе St уязвимостеи г -го типа (S - sy), где т - число типов уязвимо ;=1 стей. Распределение количества вносимых уязвимостеи по типам может проводиться на основе вероятностей появления уязвимостеи того или иного типа, представленных, например, в [36]. Тогда если в процессе тестирования обнаружено N собственных уязвимостеи, в том числе п{ уязвимостеи /-го типа
Эту величину можно использовать для решения второго вопроса — оценки меры доверия к модели. Предположим, что в программе имеется не более к собственных уязвимостей, и внесём в нее еще S уязвимостей. Будем тестировать программу до тех пор, пока не будут обнаружены все внесённые уязвимости. По окончании тестирования подсчитаем число п обнаруженных собственных уязвимостей, содержавшихся в программе. Уровень значимости С, определяющий меру доверия к модели и определяющий вероятность того, что модель будет правильно предсказывать количество собственных уязвимостей в программе, вычисляется по следующей формуле [82]:
Так, если мы предполагаем, что после первоначального этапа тестирования в программе осталось не более 2 уязвимостей (к = 2), то для получения уровня значимости С - 0,9 в неё необходимо внести 27 уязвимостей и найти их все.
Однако это представляется достаточно сложной задачей. В случае, когда на этапе тестирования не удалось выявить все внесённые уязвимости, можно воспользоваться другой формулой, полученной в работе [83], когда найденоу внесённых ошибок, где у S:
С помощью полученной зависимости можно определить, например, количество уязвимостей, которые необходимо внести для получения требуемой достоверности либо другие необходимые для анализа параметры. Например, на рис. 2.11 представлена зависимость достоверности модели от количества найденных уязвимостей при различных параметрах модели.
Описание функционирования системы
Использование уязвимости переполнения буфера по схеме «ret to libc» (как и другие типы переполнения буфера) возможно вследствие того, что злоумышленник может предсказуемым образом перезаписать адрес возврата. Однако в том случае, если злоумышленник не сможет записать заранее известный ему адрес возврата, он не сможет передать управление по нужному ему адресу.
Чтобы злоумышленник не смог записать корректный адрес возврата, будем рандомизировать те системные данные, которые помещаются системой в стек при переключении задачи - адрес возврата (регистр EIP), значение сегментного регистра (регистра CS) и регистр кадра стека (регистр ЕВР). При извлечении данные будут восстанавливаться к исходным значениям, соответственно, сама процедура в результате будет прозрачна для всех устройств процессора. В результате попытка корректно перезаписать адрес возврата будет равноценна попытке передать в стек при переполнении случайное число в надежде, что оно будет преобразовано в нужный адрес.
Далее рассмотрим основные принципы стохастического преобразования данных при их помещении в стек. Поскольку длина каждого из регистров, сохраняемых в стек, равна четырем байтам, то для экономии памяти для таблицы замен рандомизация производится для каждого байта в отдельности, после чего преобразованные байты подаются на запись так же, как подаются данные в исходном виде в классическом процессоре. При выполнении команды PUSH в стек помещается модифицированное значение, при этом при выполнении команды POP для этого адреса в регистр - приёмник результата будет записано корректное значение. Для того чтобы это было возможно, используется схема, показанная на рис. 3.8.
Схема рандомизации данных при помещении их в стек На рисунке в качестве примера рассматривается помещение в стек байта ОхЗС. При этом текущее значение младшего байта регистра указателя стека для примера, изображённого на рис. 3.9, равно 0x45. На рисунке показаны только младшие байты, поскольку все операции выполняются по модулю 256.
Как видно из рисунка, блок стохастического преобразования состоит из двух таблиц и сумматора по модулю 256. Заполнение обеих таблиц является случайным. Перемешивание основной таблицы осуществляется по схеме, аналогичной показанной на рис. 3.5. Содержимое адресной таблицы однозначно определяется содержимым основной. После этого подготовительного этапа можно осуществлять запись данных в стек, попутно выполняя процесс рандомизации.
При переключении контекста происходит неявный вызов команды PUSH, и значение её операнда выставляется не сразу на шину адреса для помещения в память, а на вход блока рандомизации при операции со стеком. Также на вход блока подаётся значение указателя стека (регистра ESP, рис. 3.9). Непосредственный операнд, который должен быть помещён в стек, обрабатывается побайтно. Одновременно задействуется 4 одинаковых блока рандомизации (каждый - для своего байта преобразуемого регистра). Выделенный байт операнда подаётся на вход адресной таблицы и используется в ней в качестве индекса строки. Извлечённое значение подаётся на сумматор по модулю 256, где складывается с младшим байтом регистра ESP и полученная сумма используется в качестве адреса в основной таблице замен. Наконец, считанное по данному адресу значение выставляется на шину адреса для помещения в стек. Как уже говорилось, параллельно преобразуются 4 байта (в соответствии с размером операнда). Использование именно двух таблиц (адресной и основной) при стохастическом преобразовании информации даёт ускорение работы и независимость времени рандомизации от порядка записей в основной таблицы [93].
Аналогично осуществляется извлечение данных (и попутное их восстановление) при неявном выполнении команды POP. В этом случае вместо сложения по модулю 256 используется обратная операция вычитания по модулю 256, а адресная и ключевая таблицы берутся без изменений [66].
Такая схема выполнения команд PUSH и POP позволит защитить программу, потенциально уязвимую к переполнению буфера, от атак по схеме «ret to libc», да и в целом обеспечит защиту адреса возврата от вмешательства и злонамеренной перезаписи. Кроме того, замещение адреса возврата в результате использования уязвимости форматной строки со спецификатором «%п» также станет невозможным, так как адрес возврата и другие сохранённые в стеке значения регистров рандомизированы и недоступны для непосредственного изменения. Таким образом, можно считать, что уязвимость переполнения буфера полностью закрывается.
Обе рассмотренные схемы рандомизации элементов архитектуры процессора можно отключить, загрузив таблицы замен таким образом, что в каждой ячейке будет записан её собственный адрес. В результате такого заполнения стохастическое преобразование производиться не будет, и это фактически означает поддержку обратной совместимости - функционирование модифицированного процессора с отключенной рандомизацией аналогично функционированию классического процессора. Поддержка обратной совместимости (отключение стохастического заполнения таблиц замен) может осуществляться добавлением настройки в BIOS.
Исследование двоичного транслятора ВК «Эльбрус-ЗМ1»
В результате проведённых исследований решены важные задачи, связанные с повышением защищённости вычислительных систем. Основные результаты работы заключаются в следующем:
Предложена классификация уязвимостеи. В качестве параметров классификации выбраны: - синтаксические признаки; - модифицируемая сущность; - последствия атаки с использованием уязвимости; - размещение вредоносной сущности; - эффективный метод обнаружения.
Разработаны модель нарушителя и модель атаки на компьютерную систему, основанной на использовании уязвимости программного кода. Проведено исследование уязвимостеи, создающих предпосылки для проведения атак на компьютерные системы. Проанализированы причины появления уязвимостеи и механизмы их использования злоумышленниками. Предложены надёжные методы защиты приложений от эксплойтов, использующих конкретные уязвимости. Разработана методика безопасного программирования, включающая в себя правила составления программ, свободных от уязвимостеи, примеры фрагментов уязвимого и безопасного кода, перечни опасных и безопасных функций.
Предложено применение модели Миллса для оценки количества уязвимостеи, оставшихся в программе после завершение этапа тестирования. Произведена оценка повышения защищённости приложений при использовании методики безопасного программирования по сравнению с классическим вариантом разработки прикладного ПО.
Предложен аппаратный метод защиты от эксплойтов, основанных на вставке вредоносного кода в программу. Метод реализован посредством стохастического преобразования кодов операций программы во время её нахождения в оперативной памяти. Проведена оценка временных и аппаратных затрат, связанных с реализацией предложенного метода. Проведена оценка тру 176 доемкости реализации вариантов компрометации системы, построенной с применением предлагаемых аппаратных модификаций процессора. Проведена оценка степени перемешивания системы команд в зависимости от шага перемешивания в соответствии с предложенным алгоритмом.
Предложен аппаратный метод противодействия эксплойтам, построенным по схеме "ret to libc". Метод основан на преобразовании байтов системной информации, сохраняемой в стек при передаче управления в вызываемую функцию.
Выделены критерии эффективности разработанной системы, определены наиболее важные критерии, проведено сравнение выделенных критериев в предложенной системе и в других подобных системах. Показаны преимущества предложенного метода рандомизации по сравнению с другими системами.
Рассмотрены вопросы реализации рандомизационного генератора ПСЧ на основе трех блоков стохастического преобразования (7?-блоков). Предложена модель генератора ПСЧ, соответствующего двум двоичным примитивным многочленам, определяющим вид функции обратных связей. Обоснован выбор функции выхода генератора ПСЧ.
Предложенная классификация уязвимостей позволила провести исследование защищённости вычислительного комплекса «Эльбрус-ЗМ1». Исследование показало, что ВК «Эльбрус-ЗМ1» устойчив к атакам, основанным на разрушении стека, вследствие особенности своей архитектуры, однако уязвим ко всем другим атакам, основанным на других классифицированных уяз-вимостях. Анализ защищённости ВК «Эльбрус-ЗМ1» выполнен в рамках проведения НИР по заказу ЗАО МЦСТ.
Рассмотрены возможности повышения защищённости ВК «Эльбрус-ЗМ1», работающего в режиме двоичного транслятора с эмуляцией аппаратных ресурсов процессора. Предложенные меры повышения безопасности таких систем при наличии в их исходном коде уязвимости заключаются в использовании контрольных байтов по границам выделенных буферов, кэшировании свойств файла при открытии, эмуляции расширенной разрядной сетки при работе с целыми числами.
Разработана методика обучения безопасному программированию, поддержанная учебно-методическим пособием, комплексом компьютерных обучающих программ и системой тестирования. Методика внедрена на кафедре «Компьютерные системы и технологии» НИЯУ МИФИ.
Основные научные результаты работы были получены в процессе выполнения НИР в рамках Федеральной целевой программы «Научные и научно-педагогические кадры инновационной России» на 2009-2012 гг.
Результаты диссертационной работы опубликованы в 22 печатных трудах, из которых 3 - в журналах, входящих в Перечень ВАК. На разработанные обучающие программные средства получены два свидетельства об официальной регистрации программы для ЭВМ.