Статический анализ программного обеспечения на наличие уязвимостей

1.

Статический анализ программного
обеспечения на наличие
уязвимостей
Выбирал шрифт:
Контиевский Фёдор

2.

Что такое анализ программного обеспечения?
Зачем это нужно?
Во время разработки ПО необходимо выявлять ошибки и недочеты в
исходном коде программ. Анализ ПО может быть статическим и
динамическим.
Статический анализ кода — анализ программного обеспечения,
производимый без реального выполнения исследуемых программ. В
большинстве случаев анализ производится над какой-либо
версией исходного кода.
Динамический анализ кода - анализ программного обеспечения,
производящийся при помощи выполнения программ на реальном или
виртуальном процессоре.

3.

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

4.

2)Синтаксический анализатор
1)Лексический анализ

5.

Что ищет
статический
анализатор кода?
Условно дефекты, которые так
или иначе интересуют
злоумышленников, а
следовательно, и аудиторов,
можно разделить на следующие
группы:
ошибки валидирования,
ошибки утечки информации,
ошибки аутентификации.

6.

Ошибки валидирования возникают в
результате того, что входные данные
недостаточно полно проверяются на
корректность. Злоумышленник может
подсунуть в качестве входных данных совсем
не то, чего ожидает программа, и тем самым
получить несанкционированный доступ к
управлению.
Ошибки валидирования
Наиболее известные ошибки валидирования
данных — это injections и XSS. Вместо
валидных данных злоумышленник подает на
вход программе специальным образом
подготовленные данные, которые несут в
себе небольшую программу. Это программа,
попадая на обработку, выполняется.
Результатом ее выполнения может быть
передача управления другой программе,
порча данных и многое, многое другое.
Также в результате ошибок валидирования
может выполняться подмена сайта, с
которым работает пользователь. Ошибки
валидирования качественно можно
обнаруживать статическими методами
анализа кода.

7.

Это ошибки, связанные с тем, что
информация от пользователя в
результате обработки была
перехвачена и передана
злоумышленнику. Может быть и
наоборот: информация, которая
хранится в системе, в процессе ее
движения к пользователю
перехватывается и передается
злоумышленнику.
Ошибки утечки
информации
Такие уязвимости так же сложно
обнаруживать, как и ошибки
валидирования. Обнаружения такого
рода ошибок требует отслеживания в
статике продвижения и преобразования
данных по всему коду программы. Для
этого необходима реализация таких
методов, как taint
analysis и межпроцедурный анализ
данных. От того, насколько качественно
эти методы разработаны, во многом
зависит точность выполнения анализа, а
именно, минимизация ложных
срабатываний и пропущенных ошибок.

8.

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

9.

Многие производители статических
анализаторов заявляют, что используют
универсальное внутреннее представление для
всех поддерживаемых анализатором языков
программирования. Таким образом они могут
анализировать программный код,
разработанный на нескольких языках, как
единое целое, а не как отдельные
компоненты. «Целостный подход» к анализу
позволяет избежать пропуска дефектов,
которые возникают на границе
взаимодействия отдельных составляющих
программного продукта.
В теории это действительно так, но на
практике универсальное внутреннее
представление для всех языков
программирования сложно и неэффективно.
Каждый язык программирования особенный.
Внутреннее представление — это обычно
дерево, вершины которого хранят атрибуты.
Выполняя обход такого дерева, анализатор
собирает и преобразовывает информацию.
Следовательно, каждая вершина дерева
должна содержать однородный набор
атрибутов. Так как каждый язык уникален,
однородность атрибутов можно
поддерживать только избыточностью
составляющих. Чем более разнородны языки
программирования, тем больше разнородных
составляющих в характеристике каждой
вершины, а значит, внутреннее представление
неэффективно по памяти. Большое количество
разнородных характеристик также влияет на
сложность обходчиков дерева, а значит,
влечет за собой неэффективность по
производительности.
Pychecker
Pylint

10.

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