Решетневские чтения. 2018
УДК 004.056.53
ПРЕОБРАЗОВАТЕЛЬ PYTHON-КОДА В AST, СОВМЕСТИМЫЙ С PT.PM
Н. А. Субботин
Сибирский государственный университет науки и технологий имени академика М. Ф. Решетнева Российская Федерация, 660037, г. Красноярск, просп. им. газ. «Красноярский рабочий», 31
Е-mail: sub.nik.and@gmail.com
Описан принцип работы разработанного преобразователя Python-кода в абстрактное синтаксическое дерево, совместимое с интерфейсом средства поиска шаблонов PT.PM.
Ключевые слова: AST, ANTLR, статический анализ кода, парсер.
PYTHON CODE TO AST CONVERTER, COMPATIBLE WITH PT.PM
N. A. Subbotin
Reshetnev Siberian State University of Science and Technology 31, Krasnoyarsky Rabochy Av., Krasnoyarsk, 660037, Russian Federation Е-mail: sub.nik.and@gmail.com
The article describes the working principles of developed Python code converter to abstract syntax tree, compatible with the interface of pattern matching engine PT.PM.
Keywords: AST, ANTLR, static code analysis, parser.
В настоящее время процесс статического анализа исходного кода стал повсеместным явлением при разработке ПО. Статический анализ является обязательным условием работы многих систем непрерывной интеграции (например, TeamCity, Jenkins), он встраивается в различные интерактивные среды разработки (например, среды разработки компании JetBrains, Visual Studio, XCode) и системы управления проектами (например, GitLab). Более его, его также используют для поиска недостатков безопасности ПО (например, CWE), которые потенциально могут стать уязвимо-стями рассматриваемого ПО.
Такой анализ называется статическим тестированием безопасности системы (Static Application Security Testing - SAST) и является частью жизненного цикла безопасной разработки (Secure Software Development Life Cycle - SDLC). При этом его необходимо отличать от анализа бинарного кода [1]. Классическими примерами моделей SDLC являются: MS Security Development Lifecycle (MS SDL) [2], NIST 800-64 [3], OWASP CLASP [4]. Каждая из перечисленных выше моделей содержит в себе SAST. Это может быть обосновано тем фактом, что по данным Национального института стандартов и технологий (NIST) 64 % уязвимостей в программах связаны с ошибками в коде [5]. При этом, использование SAST позволяет найти ошибку ещё на этапе кода, что существенно сокращает стоимость исправления такой ошибки.
В процессе проведения SAST можно выделить несколько техник анализа, упорядоченных по возрастанию сложности реализации:
1) анализ регулярных выражений;
2) анализ по шаблонам токенов;
3) анализ абстрактного синтаксического дерева (Abstract Syntax Tree - AST);
4) анализ графа потока данных (Data Flow Graph -DFG) и графа потока управления (Control Flow Graph -CFG), а также графа свойств кода (Code Property Graph - CPG), построенного на их основе;
5) бинарный анализ.
Если не брать во внимание последнюю технику анализа, то каждая последующая оперирует всё более абстрактными понятиями при описании программного кода. В частности, существуют инструменты для парсинга исходного кода, написанного на различных языках программирования, и последующего его представления в виде AST. Наиболее распространенным таким инструментом является ANTRL [6].
Инструмент проведения SAST - это анализатор исходного кода (Source Code Analyzer - SCA). На момент написания статьи число таких анализаторов исчисляется сотнями. Подавляющее большинство этих анализаторов специализированы на каком-либо одном языке программирования. Также, часть анализаторов проприетарны, и их алгоритмы работы неизвестны. Из оставшихся средств анализа кода выделяется только одно средство, позволяющее выполнять анализ AST - средство анализа PT.PM (является частью проприетарного средства анализа PT Application Inspector). Его работа базируется на создании универсального AST (Universal AST - UAST), единого для всех императивных языков программирования, и поиска в нём участков, удовлетворяющих заранее заданным шаблонам на языке их описания.
В момент написания статьи PT.PM поддерживает работу со следующими языками программирования: C#, Java, PHP, PL/SQL, T-SQL и JavaScript. Для того,
Информационная безопасность
чтобы расширить функционал PT.PM путём добавления в него поддержки языка Python, разработать функциональность парсинга исходных кодов Python и функциональность преобразования получившегося AST в UAST.
Целью данной работы является создание программного модуля, реализующего преобразование исходных текстов, написанных на Python, в AST, совместимый с интерфейсом PT.PM.
В процессе работы были проанализированы существующие инструменты парсинга Python-кода [7] и было принято решение об использовании ANTRL с генерацией кода на языке C#. В официальном репо-зитории [8] присутствует несколько грамматик, написанных на языке ANTLR4 и предназначенных для генерации парсера языка Python версии 3.6. Это обусловлено тем, что некоторые грамматические конструкции не могут быть обработаны с помощью одного лишь описания грамматики и необходимо использовать прямые вставки кода на целевом языке программирования, которые будут обрабатывать такие грамматические конструкции.
В данном случае такой грамматической конструкцией является система отступов. В рамках работы была разработана грамматика, при обработке которой ANTRL4 генерирует исходный код на языке C#. Получившийся сгенерированный код был протестирован на исходных кодах модуля asyncio и на файле, содержащем всевозможные варианты грамматических конструкций [9]. Стоит отметить, что для работы парсера использовался нестандартный (но более популярный) runtime-пакет ANTRL4 от Tunnel Vision Laboratories.
Результатами работы являются: адаптированная ANTRL4-грамматика языка Python версии 3.6, предназначенная для генерации парсера на C#; объекты тестирования на Python и С#-код, выполняющий запуск тестов; pull-request в официальный репозиторий грамматик ANTLR4, содержащий результаты работы с описанием.
Библиографические ссылки
1. Шудрак М. О., Лубкин И. А., Золотарев В. В. Статический анализ бинарного кода в сфере информационной безопасности // Известия ЮФУ. Технические науки. 2012. № 12 (137). С. 54-60.
2. Microsoft Security Development Lifecycle [Электронный ресурс]. URL: https://www.microsoft.com/en-us/sdl/default.aspx (дата обращения: 09.09.2018).
3. SP 800-64 Rev. 2, Security Considerations in the System Development Life Cycle [Электронный ресурс]. URL: https://csrc.nist.gov/publications/detail/sp/800-64/ rev-2/final (дата обращения: 09.09.2018).
4. CLASP Concepts - OWASP [Электронный ресурс]. URL: https://www.owasp.org/index.php/ CLASP_ Concepts (дата обращения: 09.09.2018).
5. PVS-Studio как средство статического тестирования защищенности приложений (SAST) [Электронный ресурс]. URL: https://www.viva64.com/ru/sast/ (дата обращения: 09.09.2018).
6. ANTLR [Электронный ресурс]. URL: http:// www.antlr.org/ (дата обращения: 09.09.2018).
7. Python Parsing Tools [Электронный ресурс]. URL: https://github.com/webmaven/python-parsing-tools (дата обращения: 09.09.2018).
8. Grammars-v4 [Электронный ресурс]. URL: https://github.com/antlr/grammars-v4/ (дата обращения: 09.09.2018).
9. Grammars-v4/test_grammar.py at master. antl4/ grammars-v4 [Электронный ресурс]. URL: https:// github.com/antlr/grammars-v4/blob/master/python3-py/ examples/test_grammar.py (дата обращения: 09.09.2018).
References
1. Shudrak M. O., Lubkin I. A., Zolotarev V. V. Staticheskij analiz binarnogo koda v sfere informacionnoj bezopasnosti [Binary static analysis in the information security] // Izvestiya UFU. Tekhnicheskie nauki. 2012. No. 12 (137). P. 54-60.
2. Microsoft Security Development Lifecycle. Available at: https://www.microsoft.com/en-us/sdl/default.aspx (accessed: 09.09.2018).
3. SP 800-64 Rev. 2, Security Considerations in the System Development Life Cycle. Available at: https://csrc.nist.gov/publications/detail/sp/800-64/rev-2/final (accessed: 09.09.2018).
4. CLASP Concepts - OWASP. Available at: https://www.owasp.org/index.php/CLASP_Concepts (accessed: 09.09.2018).
5. PVS-Studio as static a static application security testing tool (SAST). Available at: https://www.viva64. com/ru/sast/ (accessed: 09.09.2018).
6. ANTLR. Available at: http://www.antlr.org/ (accessed: 09.09.2018).
7. Python Parsing Tools. Available at: https://github. com/webmaven/python-parsing-tools (accessed: 09.09.2018).
8. Grammars-v4. Available at: https://github.com/ antlr/grammars-v4/ (accessed: 09.09.2018).
9. Grammars-v4/test_grammar.py at master. antl4/ grammars-v4. Available at: https://github.com/antlr/ grammars-v4/blob/master/python3-py/examples/test_gram-mar.py (accessed: 09.09.2018).
© Субботин Н. А., 2018