Специалисты нашей компании подготовили новый релиз AppChecker!
В новой версии реализован модуль Data Flow, или анализа потоков данных для проектов на языке PHP.
Применение синтаксического анализа позволяет выявить управляющие конструкции, такие как вызовы процедур/функций/методов, что в свою очередь позволяет строить “граф вызовов” (Call Graph), “граф потока управления” (Control Flow Graph), а так же управляющие конструкции, присваивания и прочее, что позволяет строить “граф потока данных” (Data Flow Graph).
Графы потока управления и данных применяются при анализе локальных блоков программы (в основе своей содержимого функций/процедур/методов). Граф потока управления позволяет анализировать поведение программ на более обобщённом уровне (на уровне файла/модуля/всей программы). Обобщённая схема взаимодействия глобального и локального анализа показана на рисунке ниже.
Алгоритмы анализа включают локальные и глобальные компоненты
Анализ потоков данных имеет большое практическое значение, т. к. позволяет качественно обнаруживать определённые типы дефектов (как правило эксплуатируемые) с минимальным числом ложных срабатываний. Среди таких дефектов:
- SQL-инъекция;
- command-инъекция;
- аутентификационные данные (логин/пароль), зашитые в код;
- XSS
- и др.
Можно заметить, что несмотря на различия в этих дефектах, большинство из них реализуют следующую схему эксплуатации дефекта:
- данные получены от пользователя (следовательно данные недоверенные);
- данные распространяются по программе в зависимости от выполнения или невыполнения условных конструкций и циклов;
- данные преобразуются/фильтруются, либо не изменяются;
- недоверенные данные попадают в уязвимую для того или иного дефекта функцию (функции переполнения буфера, выполнения SQL запросов и т. д.)
Механизмов анализа потоков данных, который позволяет не только обнаружить наличие дефекта, но и показать путь распространения данных, начиная от точки входа (ввод пользователем), через программу и до уязвимой функции называется “taint propagation” (распространение недоверенных данных).
Интересным применением такого механизма анализа потоков данных, как “constant propagation” (распространение констант) может является поиск жестко заданных в исходном коде ПО аутентификационных данных (логин/пароль/IP-адрес).
Рассмотрим синтетический пример:
Поиск подобного фрагмента кода может быть выполнен с использованием сигнатурного анализа (поиска по шаблонам), для этого достаточно сформировать правило вида:
Однако подобные фрагменты кода могут говорить о том, что либо подобный код был написан для отладки и попал в итоговый вариант ПО случайно, либо был добавлен намеренно, но при наличии уверенности, что инспекция кода выполняться не будет.
В том случае, если злонамеренный разработчик захочет спрятать бэкдор не только от глаз человека, проводящего ревью кода, но и от средств статического анализа, то код может быть написан, например, так:
Если разнести части этого фрагмента кода по различным модулям и файлам исходных текстов, обнаружить бэкдор будет практически невозможно даже при ручном анализе.
Механизм “распространение констант” анализа потоков данных способен определить значения переменных, их конкатенацию и перенос в другие переменные, а так же определить итоговое значение переменной. В итоге, возможно выявление и предотвращение несанкционированного доступа к функциональным возможностям ПО.
Теперь рассмотрим реальный пример уязвимого кода:
Несложно увидеть, что переменная id будет содержать непроверненные данные от пользователя, далее эти данные попадут в функцию getUserName, а уже в ней формируется и выполняется sql-запрос с непроверенными данными, что делает возможным проведение sql-инъекции.
Реализованный модуль анализа потоков данных позволяет обнаружить этот дефект кода и некоторые другие (CWE-78, CWE-79, CWE-89, CWE-95, CWE-98).