В нашем проекте [PT Application Inspector][1] реализовано несколько подходов к анализу исходного кода на различных языках программирования:
* поиск по сигнатурам;
* исследование свойств математических моделей, полученных в результате статической абстрактной интерпретации кода;
* динамический анализ развернутого приложения и верификация на нем результатов статического анализа.
Наш цикл статей посвящен структуре и принципам работы модуля сигнатурного поиска (PM, pattern matching). Преимущества такого анализатора — скорость работы, простота описания шаблонов и масштабируемость на другие языки. Среди недостатков можно выделить то, что модуль не в состоянии анализировать сложные уязвимости, требующие построения высокоуровневых моделей выполнения кода. [![][2]][3] К разрабатываемому модулю были, в числе прочих, сформулированы следующие требования:
* поддержка нескольких языков программирования и простое добавление новых;
* поддержка анализа кода, содержащего синтаксические и семантические ошибки;
* возможность описания шаблонов на универсальном языке (DSL, domain specific language).
В нашем случае все шаблоны описывают какие-либо уязвимости или недостатки в исходном коде. Весь процесс анализа кода может быть разбит на следующие этапы:
1. парсинг в зависимое от языка представление (abstract syntax tree, AST);
2. преобразование AST в независимый от языка унифицированный формат;
3. непосредственное сопоставление с шаблонами, описанными на DSL.
Данная статья посвящена первому этапу, а именно: парсингу, сравнению функциональных возможностей и особенностей различных парсеров, применению теории на практике на примере грамматик Java, PHP, PLSQL, TSQL и даже C#. Остальные этапы будут рассмотрены в следующих публикациях. [Читать дальше →][4]
[1]:
http://www.ptsecurity.ru/appsecurity/application-inspector/
[2]:
https://habrastorage.org/files/879/56c/123/87956c123b5248f58393586831153cd4.png
[3]:
https://habrahabr.ru/post/210772/
[4]:
https://habrahabr.ru/post/210772/#habracut