Специалисты нашей компании подготовили новый релиз AppChecker!




В новой версии реализован модуль Data Flow, или анализа потоков данных для проектов на языке PHP.

Применение синтаксического анализа позволяет выявить управляющие конструкции, такие как вызовы процедур/функций/методов, что в свою очередь позволяет строить “граф вызовов” (Call Graph), “граф потока управления” (Control Flow Graph), а так же управляющие конструкции, присваивания и прочее, что позволяет строить “граф потока данных” (Data Flow Graph).

Графы потока управления и данных применяются при анализе локальных блоков программы (в основе своей содержимого функций/процедур/методов). Граф потока управления позволяет анализировать поведение программ на более обобщённом уровне (на уровне файла/модуля/всей программы). Обобщённая схема взаимодействия глобального и локального анализа показана на рисунке ниже.

Analysis algorithm

Алгоритмы анализа включают локальные и глобальные компоненты

Анализ потоков данных имеет большое практическое значение, т. к. позволяет качественно обнаруживать определённые типы дефектов (как правило эксплуатируемые) с минимальным числом ложных срабатываний. Среди таких дефектов:

  • SQL-инъекция;
  • command-инъекция;
  • аутентификационные данные (логин/пароль), зашитые в код;
  • XSS
  • и др.

Можно заметить, что несмотря на различия в этих дефектах, большинство из них реализуют следующую схему эксплуатации дефекта:

  1. данные получены от пользователя (следовательно данные недоверенные);
  2. данные распространяются по программе в зависимости от выполнения или невыполнения условных конструкций и циклов;
  3. данные преобразуются/фильтруются, либо не изменяются;
  4. недоверенные данные попадают в уязвимую для того или иного дефекта функцию (функции переполнения буфера, выполнения SQL запросов и т. д.)

Механизмов анализа потоков данных, который позволяет не только обнаружить наличие дефекта, но и показать путь распространения данных, начиная от точки входа (ввод пользователем), через программу и до уязвимой функции называется “taint propagation” (распространение недоверенных данных).

Интересным применением такого механизма анализа потоков данных, как “constant propagation” (распространение констант) может является поиск жестко заданных в исходном коде ПО аутентификационных данных (логин/пароль/IP-адрес).

Рассмотрим синтетический пример:



Поиск подобного фрагмента кода может быть выполнен с использованием сигнатурного анализа (поиска по шаблонам), для этого достаточно сформировать правило вида:


Однако подобные фрагменты кода могут говорить о том, что либо подобный код был написан для отладки и попал в итоговый вариант ПО случайно, либо был добавлен намеренно, но при наличии уверенности, что инспекция кода выполняться не будет.

В том случае, если злонамеренный разработчик захочет спрятать бэкдор не только от глаз человека, проводящего ревью кода, но и от средств статического анализа, то код может быть написан, например, так:


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

Механизм “распространение констант” анализа потоков данных способен определить значения переменных, их конкатенацию и перенос в другие переменные, а так же определить итоговое значение переменной. В итоге, возможно выявление и предотвращение несанкционированного доступа к функциональным возможностям ПО.

Теперь рассмотрим реальный пример уязвимого кода:


Несложно увидеть, что переменная id будет содержать непроверненные данные от пользователя, далее эти данные попадут в функцию getUserName, а уже в ней формируется и выполняется sql-запрос с непроверенными данными, что делает возможным проведение sql-инъекции.

Реализованный модуль анализа потоков данных позволяет обнаружить этот дефект кода и некоторые другие (CWE-78CWE-79CWE-89CWE-95CWE-98).