Машинное обучение (ML) в сфере анализа безопасности приложений SAST (Static Application Security Testing) — это область, которая с каждым годом становится все более актуальной в мире разработки ПО. Многие компании активно исследуют ее, а некоторые уже внедряют машинное обучение в продукты для анализа кода. Наша компания разрабатывает собственную платформу по непрерывному анализу защищенности приложений и занимается внедрением моделей машинного обучения в качестве рекомендательной системы при поиске и верификации проблем безопасности. В серии статей, посвященной этой теме, планируем рассказать о потенциале внедрения машинного обучения в инструменты SAST и пошагово разработать модель анализа кода.
Навигация по статье:
SAST как один из элементов жизненного цикла разработки безопасных систем (SSDLC) используется для выявления потенциальных уязвимостей и различных ошибок в исходном коде. Рассмотрим основные принципы и методики, применяемые в инструментах статического анализа безопасности, обозначим существующие проблемы и рассмотрим потенциал внедрения машинного обучения.
Как работают инструменты SAST?
Основная цель тестирования безопасности приложений — выявление потенциальных уязвимостей в системе, которые могут быть использованы злоумышленниками для получения доступа к чувствительной информации или для выполнения атак. Тестирование безопасности приложений начиналось как ручной процесс, однако из-за растущей модульности ПО, обилия компонентов с открытым исходным кодом и разнообразия потенциальных векторов атак потребовались автоматические инструменты. Современные средства безопасности способны обнаруживать и анализировать более сотни видов уязвимостей. Их важным преимуществом является возможность интеграции с современными процессами разработки ПО, что позволяет выявлять потенциальные угрозы на более ранних этапах, обеспечивая тем самым непрерывный контроль над безопасностью цикла разработки.
Статический анализ кода — способ проверки программного кода, не требующий его реального выполнения. Он помогает обнаружить возможные ошибки, уязвимости и другие проблемы в работе приложения.
После обнаружения небезопасного фрагмента кода необходимо выяснить:
Может ли этот фрагмент использовать злоумышленник?
Существуют ли механизмы или элементы инфраструктуры, которые могут предотвратить использование уязвимости?
Рассмотрим некоторые из техник, лежащих в основе инструментов SAST, и как они помогают ответить на поставленные вопросы.
Найти опасный шаблон кода
Сопоставление шаблонов — подход к анализу, при котором происходит сравнение выражений из исходного кода с конкретным шаблоном, структурой или правилом. Этот процесс позволяет выявлять схожесть с известными типами уязвимостей.
Данное правило взято из open source инструмента semgrep, но будет ли оно универсальным?
Алгоритм сопоставления шаблонов не учитывает контекст выполнения кода и каждый раз будет находить подобные проблемы, создавая сотни задач по ручной верификации для инженера по безопасности. Есть ли выход?
Определить поток данных внутри кода
Применение различных правил и паттернов для поиска потенциально уязвимых строк кода позволяет найти большое количество потенциальных проблем в коде, но само по себе не является эффективным методом оценки безопасности приложения. Качественный анализ кода должен учитывать потоки входных и выходных данных, чтобы выявить уязвимости, которые несут реальную угрозу системе.
Почему это важно?
Согласно статистике OWASP (Open Web Application Security Project), уязвимости класса «инъекция» входят в список наиболее распространенных уязвимостей в веб-приложениях.
Эти уязвимости проявляются при внедрении внешних данных в команды или запросы, которые выполняются веб-приложением. Однако, на первый взгляд, небезопасная обработка входных данных на практике может не содержать в себе угрозу безопасности.
SAST-инструменты исследуют исходный код программы, сканируя его структуры, выражения и операции. Это позволяет инструментам построить модель потока данных, идущего через код. Затем формируется граф потока данных, который отображает, как данные передаются и обрабатываются между различными участками кода. Граф состоит из узлов, представляющих различные данные и операции, и связей, представляющих передачу данных между ними. Компания по кибербезопасности Snyk выделяет пять основных методов анализа данных:
Анализ потока управления позволяет определить, какие пути выполнения могут быть использованы приложением в течение его работы. В процессе анализа инструмент разделяет исходный код на логические блоки, такие как функции, классы и методы. Затем анализатор проходит по коду, исследуя все возможные пути выполнения. Таким образом, выявляются различные варианты условных ветвлений, циклов и операторов выбора, чтобы определить, какие части кода могут быть выполнены в зависимости от параметров. Например, анализ потока управления может помочь обнаружить уязвимости, связанные с несанкционированным доступом к определенным функциям или данным.
Структурный анализ используется для исследования архитектуры кода и идентификации возможных уязвимостей. Инструмент осуществляет анализ основных компонентов программы с целью выявления потенциальных уязвимостей, таких как небезопасное хранение и передача данных.
Один из ключевых аспектов структурного анализа заключается в выявлении некорректного использования переменных. Например, использование переменных без инициализации или попытка чтения из переменной, которая не была предварительно определена. Такие ошибки могут привести к непредсказуемому поведению программы, а также стать причиной возникновения уязвимостей.
Другой аспект анализа структуры кода — обнаружение уязвимостей, связанных с проблемами памяти устройства. Данный метод позволяет искать потенциально опасные фрагменты кода, связанные с динамическим выделением, неявным освобождением, переполнением буфера или утечкой памяти. Такие уязвимости могут быть использованы потенциальным нарушителем для выполнения атаки на ПО или получения несанкционированного доступа к системе.
В продвинутом анализе кода используют Taint Analysis — метод, который отслеживает, как входные данные распространяются по приложению, определяя точки, где они взаимодействуют с критическими операциями или конфиденциальными данными. Если во время анализа исследуемые данные достигают приемника — функции или операции, безопасность которых имеет критическое значение (например, запрос к базе данных или выполнение команд), это подтверждает угрозу безопасности.
Анализ конфигураций
Конфигурации инфраструктуры, описываемые в рамках подхода IaC (Infrastructure as Code), демонстрируют определенное сходство с программным кодом. Они представляют собой набор инструкций, которые определяют состояние системы, обеспечивая нормальное функционирование всего приложения. Такой подход в инструментах SAST используется для контроля соблюдения стандартов безопасной конфигурации ПО.
При выполнении анализа происходит сканирование конфигурационных файлов приложения, баз данных, сервисов и других компонентов на наличие несоответствия настроек известным шаблонам безопасности. Например, анализ конфигураций может определить, что настройки базы данных установлены таким образом, при котором возникает возможность для несанкционированного доступа к данным. Также анализ может обнаружить, что сервер приложения настроен с нарушениями стандартов безопасности, и это может привести к эксплуатации уязвимостей и компрометации системы.
На рисунке представлен пример конфигурации сервиса, где отсутствует необходимый параметр безопасности read_only. Из-за этого служба работает из корневой файловой системы доступной для записи. Это может позволить вредоносным приложениям загружать и запускать дополнительные полезные нагрузки или изменять файлы-контейнеры. Также служба postgres позволяет повышать привилегии через двоичные файлы setuid или setgid.
Определение методов очистки и валидации данных
Инструменты статического анализа кода определяют наличие проверок входных данных, основываясь на анализе исходного кода программы. Они способны идентифицировать места, где ввод передается в функции, или методы, которые производят проверки, и анализировать весь путь выполнения программы, чтобы убедиться, что входные данные подвергаются необходимым проверкам.
Реализация проверки ввода может принимать различные формы, и важно выбрать подходящий метод в зависимости от контекста. Например, возможность встраивания проверки ввода непосредственно в класс кода, отвечающий за обработку данных, позволяет разместить проверку в непосредственной близости к месту передачи данных. Это повышает наглядность обеспечения безопасности, но ухудшает читаемость кода и создает дополнительные задачи для разработчика.
Еще одним способом сделать код безопасным является использование библиотек и фреймворков, специально разработанных для защиты от уязвимостей. Веб-фреймворки могут содержать защиту от таких атак, как SQL-инъекции, межсайтовый скриптинг, межсайтовая подделка запросов и другие. Эти библиотеки и фреймворки обычно имеют встроенные функции и методы, которые обеспечивают безопасное взаимодействие с данными и пользовательским вводом. Например, библиотека OWASP ESAPI и проверка переменной для защиты от SQLi.
Все перечисленные подходы имеют свои преимущества и недостатки, и выбор конкретного метода зависит от контекста и требований приложения.
Итак, подведем промежуточные итоги:
Преимущества SAST
Обнаружение уязвимостей на ранней стадии. Инструменты SAST позволяют разработчикам находить потенциальные проблемы безопасности еще до компиляции или развертывания программного обеспечения. Интеграция с CI/CD позволяет автоматически запускать сканирования на каждом этапе разработки приложения.
Высокая степень покрытия. Поскольку SAST анализирует исходный код на наличие уязвимостей, он предоставляет более широкий охват проверки безопасности, включая слабые места всей кодовой базы, потенциальные проблемы с конфигурацией и другие уязвимости, которые могут быть пропущены при использовании DAST (Dynamic application security testing) и IAST (Interactive application security testing).
Легко использовать. Большинство инструментов SAST не требуют сложной настройки перед запуском сканирования. Автоматизация и скорость инструментов SAST предлагают готовые процессы сканирования, что позволяет разработчикам быстро находить и исправлять уязвимости.
Безопасное использование. Поскольку инструменты SAST не выполняют обрабатываемый код, можно запускать их без риска навредить работе приложения.
Недостатки SAST
Ложные срабатывания. Страшный сон инженера по безопасности. Многие инструменты стремятся минимизировать количество ложных уязвимостей, но статистика OWASP benchmark показывает, что даже лучшие анализаторы имеют от 15% ошибочных срабатываний.
Зависимость от языка. Разработка приложения — это бесконечный процесс, который требует постоянных изменений и обновлений, чтобы удовлетворить потребности пользователей. Технологии сменяют друг друга, появляются новые языки, фреймворки, стандарты, модели взаимодействий и т.д. Добавление нового языка в инструмент SAST — это почти создание нового продукта.
Уязвимые зависимости. Большинство инструментов SAST работают с исходным кодом приложения и не обнаруживают уязвимости или ошибки в сторонних компонентах или библиотеках, используемых в приложении (для этих целей существуют SCA инструменты). Это означает, что приложение может иметь уязвимость в сторонних компонентах, которые SAST инструмент не смог обнаружить.
Отсутствие анализа бизнес-логики. Инструменты SAST не способны в полной мере проанализировать бизнес-логику всего приложения. Бизнес-логика включает в себя набор правил, процессов и процедур, которые определяют, как приложение должно функционировать в конкретном бизнес-сценарии. Отсутствие анализа бизнес-логики в SAST- инструментах означает, что даже если код написан безопасно и не содержит уязвимостей, это не гарантирует, что приложение полностью соответствует ожиданиям бизнеса.
Нас спасет Machine learning?
Внедрение машинного обучения в инструменты статического анализа кода позволяет решить некоторые из указанных проблем и улучшить эффективность процесса обнаружения уязвимостей. Давайте рассмотрим, какие из этих проблем может решить внедрение машинного обучения в SAST.
Одной из основных проблем, которую может решить внедрение машинного обучения в SAST, является снижение количества ложных срабатываний. Использование SAST может приводить к большому количеству ложных срабатываний, когда инструмент обнаруживает потенциальную уязвимость, которая фактически не существует или которая не представляет серьезной угрозы. Машинное обучение в SAST увеличивает точность обнаружения уязвимостей и уменьшает количество ложных срабатываний путем использования обучающих данных и алгоритмов, которые помогают отличать реальные уязвимости от ложноположительных результатов.
Другой проблемой, которую потенциально может решить внедрение машинного обучения в SAST, является обнаружение новых и неизвестных уязвимостей. Методы SAST ограничены только поиском известных уязвимостей, основанных на паттернах и сигнатурах. Машинное обучение может быть использовано для нахождения скрытых паттернов и признаков, которые могут указывать на новые и ранее неизвестные уязвимости. Это помогает расширить возможности анализа кода и улучшить общую безопасность ПО.
Также преимуществом внедрения машинного обучения является более гибкая работа с различными языками программирования. Модель, обученная на конкретном языке, может быть адаптирована к другим языкам с помощью методов машинного перевода и мультиязычного обучения. Это позволяет расширить возможности инструмента SAST и увеличить его универсальность для различных стеков технологий.
Внедрение машинного обучения в SAST может помочь улучшить скорость и эффективность анализа кода. Процесс статического анализа может быть долгим и требует значительных ресурсов системы, особенно при анализе больших и сложных проектов. Машинное обучение может помочь автоматизировать и оптимизировать процесс анализа, позволяя распределять вычислительные мощности, выделяя более важные участки кода для более глубокого и точного анализа.
Какие методы и модели уже существуют?
Использование методов машинного обучения в инструментах статического анализа безопасности кода представляет значительный потенциал для улучшения процесса обнаружения уязвимостей. Например, интеграция методов машинного обучения на более поздних этапах работы инструментов SAST способствует улучшению качества верификации. Применение предварительно обученных моделей позволяет распознавать сложные паттерны и аномалии, а обучение моделей на общедоступных шаблонах и правилах способствует автоматизации процесса написания правил для новых уязвимостей или даже целых языков.
Один из основных методов машинного обучения, который может быть применен в инструментах SAST, — классификация кода. С помощью алгоритмов классификации, например, метода опорных векторов (SVM), можно разделить код на два класса: безопасный и подозрительный. Это позволяет быстро выявлять потенциально опасный код, тем самым сокращая объем анализируемого кода при использовании более точных техник в инструментах SAST.
Обнаружение аномалий — один из наиболее распространенных вариантов использования машинного обучения. В инструментах SAST данный метод способен обнаружить отклонение исследуемого кода от стандартов безопасного программирования (например, при анализе конфигураций).
Supervised (контролируемый). В этом методе для обучения модели требуется набор данных, в котором каждый пример имеет метку, указывающую, является ли он нормальным или аномальным. Модель обучается на этих данных и затем может классифицировать новые примеры как нормальные или аномальные на основе обучения. Unsupervised (неконтролируемый). Модель обучается без явных меток для аномалий. Она стремится найти образцы или группы, которые отличаются от основной массы данных. Этот подход особенно полезен, когда аномалии представляют собой небольшую долю общих данных и не могут быть явно помечены.
Semi-supervised (полуконтролируемый). В этом случае модель обучается на части данных с метками (нормальные и аномальные примеры), а затем использует эту информацию для дальнейшего определения аномалий в немаркированных данных.
Анализ контекста —процесс использования алгоритмов машинного обучения для анализа и понимания контекстуальной информации из различных источников. Подобный метод позволяет более точно идентифицировать потенциальные проблемы безопасности, которые могут быть пропущены при использовании традиционных подходов.
Давайте немного заглянем в мир современных моделей машинного обучения и оценим их применимость в инструментах SAST.
Использование Predictive Model Markup Language дает возможность создать универсальную прогнозную модель, которая может быть интегрирована в SAST-инструменты. Она способна анализировать тенденции и повторяющиеся элементы в коде, что может быть использовано для предсказания уязвимых участков.
Ensemble Models, такие как Random Forest (вариация метода «случайного леса»), объединяют прогнозы из множества различных моделей для получения более точного результата. В контексте SAST они могут улучшить точность обнаружения уязвимостей за счет комбинирования выводов разных алгоритмов.
Transfer Learning позволяет перенести знания, приобретенные моделью при решении одной задачи, на решение схожей, но другой. В SAST это может быть применено для быстрой адаптации модели под новый язык программирования или фреймворк, учитывая уже известные уязвимости в схожих средах.
Deep Learning. Модели на основе глубокого обучения, такие как сверточные нейронные сети (CNN) и рекуррентные нейронные сети (RNN), могут анализировать и обучаться на больших объемах данных, включая исходный код. Они способны обнаруживать сложные и неочевидные зависимости между частями кода, что позволяет им эффективно решать задачи анализа программного обеспечения, поиска ошибок, автоматического исправления и т.д.
Начинаем массовое внедрение?
Не все так просто, могут возникнуть следующие проблемы:
Недостаточное количество данных. Нехватка данных для обучения моделей ML может привести к низкой точности и ненадежным результатам.
Предсказуемость процесса обучения. Многократное обучение моделей на схожих данных может привести к потере их обобщающей способности, что снизит эффективность применения в реальных кейсах.
Сложность интеграции. Внедрение ML в инструменты SAST может потребовать сложной адаптации и тесной интеграции с существующими системами и процессами разработки.
Проблемы интерпретации результатов. Сложность интерпретации результатов работы алгоритмов может затруднять понимание причин обнаруженных проблем и снизить доверие к инструменту.
Заключение
Итак, инструменты SAST позволяют оценить безопасность исходного кода приложения. В основе анализа лежит набор разнообразных техник, которые позволяют расширить поверхность анализа и снизить вероятность ложных и пропущенных уязвимостей. Однако, стоит отметить, что инструменты все еще дают большое количество ложных срабатываний, а также пропускают редкие и специфические типы угроз.
Для решения этих проблем эффективным способом является применение методов машинного обучения. Внедрение машинного обучения в инструменты статического анализа кода может значительно улучшить процесс выявления уязвимостей, помочь снизить количество ложноположительных срабатываний, обнаружить новые типы ошибок и позволить эффективно расширить количество анализируемых языков.
Автор: Виктор Тимашков, специалист направления безопасной разработки УЦСБ