
- •Томский государственный университет систем управления и радиоэлектроники (тусур)
- •Обзор уязвимостей программной части. Способы их обнаружения и устранения
- •Содержание
- •1 Введение
- •2 Классификация уязвимостей
- •3 Методы обнаружения уязвимостей
- •3.1 Ручной поиск
- •3.2 Поиск по шаблонам
- •3.3 Фазинг
- •4 Способы устранения уязвимостей
- •4.1 Корректировка исходных кодов программ
- •4.2 Использование неисполняемых буферов
- •4.3 Применение проверок выхода за границы
- •4.4 Решение проблемы неинициализированных данных
- •4.5 Защита от sql-инъекций
- •4.6 Защита от xss-инъекций
- •4.7 Шифрование паролей
- •Заключение
- •Список использованных источников
3 Методы обнаружения уязвимостей
Программное обеспечение часто содержит разнообразные уязвимости из-за ошибок в коде программ. Ошибки, допущенные при разработке программ, в некоторых ситуациях приводят к сбою программы, а следовательно, нарушается нормальная работа программы. Большинство уязвимостей связано с неправильной обработкой данных, получаемых извне, или недостаточно строгой их проверкой. Для выявления уязвимостей существует несколько методов поиска уязвимостей в ПО, которые представлены ниже.
3.1 Ручной поиск
Данный метод является самым точным. Однако для его использования от кандидата, использующего этот метод, требуется опыт в алгоритмизации, программировании. Полезно знать шаблонные уязвимости, уметь читать дизассемблированный код, писать код, для проверки предположений.
Алгоритмы данного вида поиска сейчас мало где встретишь, и единственный алгоритм ручного поиска был описан в книге «Взлом программного обеспечения» Грега Хогланда и Гари Мак-Гроу [1].
Существуют ключевые места, присутствие уязвимостей в которых более вероятно, чем в остальном коде. К таким местам относится, например вызов небезопасных функций работы со строками.
Но даже если найдено подобное ключевое место, то нет гарантии, что удастся произвести на него атаку через внешние данные. Для нахождения путей, через которые вредоносные данные могут достичь уязвимого места, могут быть использованы методы обратной трассировки (возврат к предыдущим вызовам по адресам возврата хранящимся в стеке).
Если исследование ключевого места показало, что оно подвержено уязвимости, то первым делом следует выяснить, какие данные приводят к ее возникновению. Так же на этом этапе следует получить как можно больший диапазон таких данных. Эта информация понадобится на следующем этапе.
Далее следует несколько отдалиться от места уязвимости («переместиться в другой раздел») и попытаться внедрить уязвимые данные в исследуемом месте с помощью изменения содержимого памяти или регистров. Такой эксперимент покажет, есть ли возможность распространить данные из текущего места к уязвимому.
У эксперимента может быть два исхода: данные удалось переместить в необходимый раздел или же нет. Так определяется проходимость раздела.
На рисунке 3.1.1 приведен пример, когда данные из одного раздела могут блокироваться фильтром, так и не достигнув уязвимого места.
Рисунок 3.1.1 – Перемещение вредоносных данных по разделам программы
Далее движение продолжается итеративно от уязвимого места к функции, принимающей пользовательский ввод. Если найдена нужная цепочка разделов, то это гарантирует, что удастся организовать атаку.
3.2 Поиск по шаблонам
Поиск уязвимости по шаблону – автоматизированный метод, основанный на сравнении некоторых характеристик исследуемого ПО с заранее подготовленными описаниями (сигнатурами) уязвимых мест. Данный метод эффективен при поиске несложных уязвимостей и немаскируемых закладок, таких как переполнение буфера, парольные константы и т.д.
Поиск уязвимостей по шаблонам проводится статически. При статическом анализе исследуется код программы без его запуска. Код программного обеспечения (в большинстве случаев исходный) сравнивается с сигнатурами из базы методом побайтового сравнения или по более сложному алгоритму. При обнаружении сходств, сообщается о найденной уязвимости. Иногда сигнатура дополняется некоторым набором эвристических правил.
Современные сканеры кода позволяют хорошо справляться с автоматизацией шаблонного поиска следующих типов уязвимостей [2]:
- внедрение произвольных команд;
- SQL-инъекции;
- XSS-запрсоы (межсайтовый скриптинг);
- ошибки входных и выходных значений;
- уязвимости переполнения буфера.