Введение 3
Постановка задачи 5
1. Обзор предметной области 6
1.1. Термины 6
1.2. Абстрактная интерпретация 8
1.3. Числовой анализ 9
1.4. Числовые абстрактные домены 11
1.5. Интервальный анализ 12
1.6. Мотивирующий пример 14
2. Реализация интервального анализа 16
2.1. Существующие подходы 16
2.2. Интервальный домен 18
2.3. Оператор расширения 20
2.4. Обработка ограничивающих условий 21
2.5. Детали реализации 23
2.5.1 Приведение к Int32, Uint32 23
2.5.2 NaN как результат арифметической операции 24
2.5.3 Обновление абстрактных значений при обработке операторов сравнения 24
2.6. Применения для поиска уязвимостей 25
3. Результаты 27
3.1. Результаты на интеграционных тестах 27
3.2. Результаты на реальных данных 27
Заключение 29
Список литературы 30
Анализ кода - это процесс изучения и оценки программного кода с целью выявления ошибок, уязвимостей, участков неэффективного кода, а также обнаружения потенциальных проблем, которые могут возникнуть во время выполнения программы. Существует два основных подхода к анализу кода: статический анализ, который проводится без фактического выполнения программы, и динамический анализ, при котором код анализируется непосредственно во время выполнения.
Есть несколько популярных методов статического анализа кода. Одним из них является абстрактная интерпретация, которая позволяет анализировать программу, моделируя её поведение не на уровне конкретных значений, а на более абстрактном уровне, что позволяет выявить потенциальные проблемы на более широком спектре сценариев выполнения кода. В данном подходе во время анализа для каждой точки программы строится абстрактное состояние, которое является аппроксимацией возможных конкретных состояний в этой точке.
Основными преимуществами абстрактной интерпретации являются возможность автоматизации анализа, выявление ошибок до выполнения программы и возможность анализа больших и сложных программ. Однако этот метод также имеет свои недостатки, которые связаны с использованием аппроксимаций значений переменных и состояний программы. Из-за этого анализ может быть недостаточно точным, а также есть вероятность ложных срабатываний.
Во время анализа каждой переменной сопоставляется значение из абстрактного домена, представляющего собой специализированную математическую структуру. Эти абстрактные значения используются для аппроксимации множеств возможных значений переменных программы. Каждый абстрактный домен предоставляет определённые операции и свойства, которые помогают анализатору интерпретировать и анализировать код программы. Выделяют отдельные абстрактные домены для чисел, строк, булевых значений, которые позволяют аппроксимировать возможные значения для переменных соответствующих типов.
Одним из методов работы с числовым абстрактным доменом является интервальный анализ, который позволяет анализировать программный код, сопоставляя переменной интервал возможных значений в каждой точке выполнения программы. Этот подход позволяет обнаруживать переполнения переменных, неявные привидения типов и другие проблемы, связанные с диапазонами значений переменных.
Научная ценность данной работы заключается в проектировании и разработке абстрактного домена для интервального анализа путём абстрактной интерпретации. Результаты исследования будут полезны для разработчиков инструментов статического анализа проектов на языке JavaScript, а также для научного сообщества, занимающегося абстрактной интерпретацией и интервальным анализом.
В рамках данной работы были успешно выполнены следующие задачи:
• Проведён анализ существующих числовых абстрактных доменов, подходящих для интервального анализа
• Спроектирован абстрактный интервальный домен, который удовлетворяет поставленным требованиям
• Реализованы необходимые операторы и арифметика над спроектированным доменом
• Реализована поддержка ограничений, накладываемых при анализе операторов ветвления и циклов
• Проведены замеры производительности и точности разработанного интервального анализа на реальных проектах
• Проведено сравнение полученных результатов с анализом распространения констант
[1] P. Cousot and R. Cousot, “Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints,” in Proceedings of the 4th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages, POPL ’77, (New York, NY, USA), p. 238-252, Association for Computing Machinery, 1977.
[2] A. Mine, “The octagon abstract domain,” Higher Order Symbol. Comput., vol. 19, p. 31-100, mar 2006.
[3] A. Simon, A. King, and J. M. Howe, “Two variables per linear inequality as an abstract domain,” in Proceedings of the 12th International Conference on Logic Based Program Synthesis and Transformation, LOPSTR’02, (Berlin, Heidelberg), p. 71-89, Springer-Verlag, 2002.
[4] R. Clariso and J. Cortadella, “The octahedron abstract domain,” Sci. Comput. Program., vol. 64, p. 115-139, jan 2007.
[5] P. Cousot and N. Halbwachs, “Automatic discovery of linear restraints among variables of a program,” in Proceedings of the 5th ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages, POPL ’78, (New York, NY, USA), p. 84-96, Association for Computing Machinery, 1978.
[6] F. Nielson, H. Nielson, and C. Hankin, Principles of Program Analysis. 01 1999.
[7] S. Guarnieri, M. Pistoia, O. Tripp, J. Dolby, S. Teilhet, and R. Berg, “Saving the world wide web from vulnerable javascript,” pp. 177-187, 07 2011.
[8] V. Kashyap, K. Dewey, E. Kuefner, J. Wagner, K. Gibbons, J. Sarracino, B. Wiedermann, and B. Hardekopf, “Jsai: a static analysis platform for javascript,” pp. 121-132, 11 2014.
[9] S. H. Jensen, A. Mpller, and P. Thiemann, “Type analysis for javascript,” in Proceedings of the 16th International Symposium on Static Analysis, SAS ’09, (Berlin, Heidelberg), p. 238-255, Springer-Verlag, 2009.
[10] P. Cousot and R. Cousot, “Static determination of dynamic properties of programs,” 01 1976.
[11] F. Logozzo and H. Venter, “Rata: Rapid atomic type analysis by abstract interpretation - application to javascript optimization,” in Compiler Construction (R. Gupta, ed.), (Berlin, Heidelberg), pp. 66-83, Springer Berlin Heidelberg, 2010.
[12] A. Younang and L. Lu, “Improving precision of java script program analysis with an extended domain of intervals,” in 2015 IEEE 39th Annual Computer Software and Applications Conference, vol. 3, pp. 441-446, 2015.
[13] A. Ermedahl and M. Sjodin, “Interval analysis of c-variables using abstract interpretation,” in Citeseer, 1996.
Содержание бакалаврской работы - Реализация интервального анализа путём абстрактной интерпретации для поиска уязвимостей в проектах на языке JavaScript
Выдержки из бакалаврской работы - Реализация интервального анализа путём абстрактной интерпретации для поиска уязвимостей в проектах на языке JavaScript