SAST unboxing

Kate

Administrator
Команда форума
Мы создаем множество сложных программных продуктов и требования безопасности кода становятся все актуальнее. Автоматизация везде, в том числе и в сфере безопасности: алгоритмы говорят нам, как писать код. Очень хочется иметь волшебный инструмент, который бы говорил, безопасен наш код или нет. Попробуем проверить, есть ли волшебная кнопка в мире DevSecOps. Для этого мы взяли несколько статический анализаторов кода (SAST), залили в них уязвимый код и посмотрели, что получилось на выходе. Как пелось в песне группы Технология, “Нажми на кнопку – получишь результат, и твоя мечта осуществится”.

О результатах эксперимента мы и поговорим далее.

Зачем это все?​

Практики DevSecOps стремительно развиваются, много разговоров о Shift left (смещение вопросов, связанных с безопасностью, как можно ближе к началу разработки), культуре безопасной разработки и инструментах: многие уже прошли этап внедрения практики управления уязвимостями в периметре безопасности и патч-менеджмент, но этого уже недостаточно. Поскольку наряду со стандартным софтом используются написанные специально под определённые задачи или кастомизированные приложения (вендорные решения или собственные разработки), такие программы стали часто использоваться злоумышленниками как точка входа, что делает необходимым поиск и устранение уязвимостей в собственном коде. Эту задачу решают инструменты анализа исходного кода на уязвимости.
Класс инструментов статического анализа активно развивается, в том числе и под давлением регуляторов. Многие компании уже внедрили средства анализа качества кода, которые контролируют избыточную цикломатическую сложность, дублирование кода, покрытия всех строк тестами, соблюдение стандартов кодирования и пр.. Некоторые из этих систем, например SonarQube, позволяют находить уязвимости, категоризировать их, предлагают варианты решения. Мы рассмотрим для примера SonarQube далее наравне с коммерческими решениями.
Дефицит внутренних ресурсов и высокая стоимость технологий анализа, часто приводят к значительному увеличению срока выхода релизов, что накладывает свои ограничения по применению этих инструментов «в бою». Поэтому, в идеале хотелось бы иметь «умный» инструмент, который обеспечит дополнительные точки проверки качества кода без драматического влияния на процесс выхода частых релизов в «прод». В этой статье мы сравним отчеты нескольких SASTов и оценим их базовые возможности.
f7cb8260ed97cfc6fdb79d69748e227c.png

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

Общая информация о продуктах​

Рынок инструментов безопасной разработки активно растет и развивается. В России сегмент SAST хорошо развит, на рынке присутствуют как отечественные вендоры, так и зарубежные. Среди российских участников рынка можно выделить: Positive Technologies; PVS-Studio; «Газинформсервис»; «Ростелеком-Солар»; ГК «Эшелон». Согласно отчету «Critical Capabilities for Application Security Testing» Gartner выделяет на мировом рынке следующих основных игроков: CAST; Checkmarx; Contrast Security; GitLab; HCL Software; Micro Focus; Onapsis; Rapid7; Synopsys; Veracode; WhiteHat Security.
Из отчета Gartner “Critical Capabilities for Application Security Testing”
Из отчета Gartner “Critical Capabilities for Application Security Testing”
Часть из иностранных решений не представлена на российском рынке и не имеют русскоязычной поддержки. Другая является чисто облачным решением, что не применимо в наших условиях. В итоге, по формальным критериям (наличие русскоязычной поддержки, поддержка необходимого стека технологий) было отобрано несколько продуктов:

Fortify​

Fortify неоднократно менял владельца, в данный момент поддерживается компанией Micro Focus. Представляет довольно мощный инструмент анализа кода. Fortify Static Code Analyzer входит в составе более крупного решения Fortify. Способен определять причины уязвимостей, приоритезировать и давать рекомендации по исправлению кода.
Основные особенности:
  • Снижение ложных срабатываний за счет использования алгоритмов машинного обучения
  • Поддержка большого числа языков (более 27 основных языков), в том числе ABAP / BSP, ASP.NET, Python, Ruby
  • Охват категорий уязвимостей, внесённых в OWASP Top 10 и SANS Top 25, соответствие стандартам DISA STIG, PCI DSS и другим.
  • Возможность подключения к системам управления непрерывной интеграцией

PT Application Inspector​

Продукт от широко известной отечественной компании способен анализировать исходный код или готовое приложение, позволяет выявлять уязвимости и признаки недокументированных возможностей комбинируя статические и динамические методы.
  • генерирует эксплойты — безопасные, но эффективные тестовые запросы, которые помогают подтвердить или опровергнуть наличие уязвимости
  • Отечественный, локализованный продукт
  • Широкий набор поддерживаемых государственных стандартов
  • Наличие сертификата ФСТЭК России
  • Использование базы уязвимостей веб-приложений WASC и классификатора CWE
  • Возможность визуализации программного кода

Solar AppScreener​

Solar appScreener (до версии 3.0 — Solar inCode) работает полностью автоматически, анализируя исходного кода программы и её исполняемых файлов. При отсутствии исходного кода можно загрузить рабочие файлы мобильного или веб-приложения. Для мобильных приложений можно скопировать в сканер ссылку на страницу в Google Play или App Store.
  • Декомпиляция приложений
  • Большое число поддерживаемых языков программирования (36 языков)
  • Легко интегрируется с Git и Subversion, VSC-хостингами GitLab GitHub и Bitbucket и другими
  • Исходный код может передаваться на анализ как простой загрузкой файлов в сканер, так и напрямую из репозитория.

Checkmarx​

Checkmarx CxSAST – чугунный эталон мира безопасности, позволяет в автоматическом режиме обнаруживать и идентифицировать уязвимости наиболее распространённых языков программирования. Кроме всего прочего позволяет визуализировать код в виде блок-схем маршрутов выполнения. По результатам сканирования выдаются рекомендации по исправлению проблем с привязкой к графической схеме, что очень удобно.
  • Поддерживает большое число языков программирования (более 20)
  • Интегрируется с различными средами разработки, серверами сборки, системами контроля версий и отслеживания ошибок
  • Небольшой процент ложных срабатываний
  • Визуализация кода

Методика тестирования​

Кому приходилось видеть отчеты, сделанные популярными на рынке продуктами, тот хорошо понимает, что получить отчет – это начало долгого пути. Неполные или слишком общие результаты не пригодны для исправления сканируемых приложений, но больше раздражают ложные срабатывания, а на их разбор тратится драгоценное время специалистов. Основным недостатком SAST является большое число ложноположительных результатов, что в итоге приводит к огромным затратам времени специалистов. Поэтому, качество сканирования выходит на первый план. Найти небезопасный код - это одна проблема, более сложная задача – понять возможность эксплуатации найденной уязвимости в данном конкретном случае, рассчитать возможные векторы атак и последствия. Поиск по шаблонам (сигнатурный или синтаксический анализ) с такой задачей не справляется.
Для проверки качества анализа «из коробки» мы выбрали два приложения на языке Java.
Данные приложения мы выбрали не случайно, они написаны на языке Java, который для нас является основным, также они содержат широкий спектр стандартных уязвимостей, с которыми должны справляться выбранные инструменты анализа кода.
Описание уязвимостей, присутствующих в выбранных приложениях

XSS​

Довольно распространенная уязвимость, которую можно обнаружить на множестве веб-приложений. Ее суть довольно проста, злоумышленнику удается внедрить на страницу JavaScript-код, который не был предусмотрен разработчиками. Подробнее можно почитать тут.
9361e34e6977741e1bbd18da482a4b79.png

Наличие известных уязвимых компонентов​

Тут все просто, в приложении используется версия библиотеки с известными уязвимостями
63d546972c2fc1b18e1996ebbef9670b.png

OGNL Expression Injection​

Инъекция кода OGNL. OGNL – язык, который позволяет манипулировать свойствам https://en.wikipedia.org/wiki/OGNL
cc4909da074463258102f1b10aa5e710.png

SQL Injection​

Всем знакомая SQL инъекция, подробнее https://ru.wikipedia.org/wiki/Внедрение_SQL-кода
abb46fa61067b5334f8aae01325230c1.png

Password in Configuration File​

Небезопасное задание пароля в конфигурационном файле
b10560648eba1f6fffea8756b3ebe60a.png

Privacy Violation​

Нарушение конфиденциальности, в данном случае запись в журнал логина и пароля
6298297a7c9b249b709c4f80d651880b.png

Log Forging​

Подделка записи журнала
01f389b4ab6fcfce4ec0da866bb0770b.png

Command Injection​

Инъекция в текст командной строки, подробнее тут.
6a2adce835151eb764ac3d1868b9e2d4.png

Open redirect​

Возможность перенаправить пользователя на новый сайт без проверки целевого сайта. Подробнее тут
b2630332a077ee1b45055fdf022b307f.png

Misconfiguraton​

Ошибки в конфигурации приложения
ea475dd0bdc77da4be646cb7e9939e77.png

XXE​

XXE-атака, основанная на недостаточной проверке входящего XML-файла. Если система способна принимать данные в этом формате, злоумышленник может включить в передаваемый документ ссылку на внешние объекты или локальные ресурсы целевой системы.
ad3e074f881c6737b85be927218e2536.png

Brocken Access control​

Нарушенный контроль доступа, это дает злоумышленникам возможность получить доступ к конфиденциальным данным.
8349508f94c09950870b4c48c8731973.png

Мы загрузили исходный код этих приложений в анализаторы с дефолтными настройками и сравнили результаты. Рассматривали только уязвимости, отмеченные анализаторами хотя бы в одном из инструментов. Если уязвимость не была найдена ни одним анализатором, то мы ее исключали из результатов сравнения (ибо не дошла еще техника до такого).
Итоговый рейтинг считали по следующей формуле:
96eb8d09f20ad605bce4c74078925c77.png

Сравнение результатов прогонов​

SonarQube не нашел ни одной уязвимости ни в одном проекте, что было ожидаемо. На сим закончим с ним и перейдем к коммерческим решениям.
Статистика анализа приложения dvja в SonarQube
Статистика анализа приложения dvja в SonarQube
Статистика анализа приложения vulnado в SonarQube
Статистика анализа приложения vulnado в SonarQube

Анализ приложения DVJA​

На данном приложении хорошо проявил себя Fortify, так как он единственный нашел опасную уязвимость OGNL Expression Injection.
Описание уязвимости OGNL injection, найденной Fortify
Описание уязвимости OGNL injection, найденной Fortify
По результатам анализа Fortify был найден 81 недостаток приложения dvja. В категории Critical и High не было ложноположительных срабатываний.
Статистика недостатков, найденных Fortify в приложении dvja
Статистика недостатков, найденных Fortify в приложении dvja
Все 11 критических недостатков несли серьезную угрозу безопасности:
Список критических уязвимостей найденных Fortify в приложении dvja
Список критических уязвимостей найденных Fortify в приложении dvja
Command Injection он занес в категорию High:
Список серьезных уязвимостей найденных Fortify в приложении dvja
Список серьезных уязвимостей найденных Fortify в приложении dvja
AppScreener в итоге нашел 88 недостатков, но среди них не было найденных Fortify серьезной уязвимости OGNL Expression Injection, а также Command Injection, XSS в списке отсутствовали как класс. Также смутил алгоритм оценки критичности. Например, тот же Checkmarx позволяет выбирать способы выставления Severity на основе нескольких заложенных шаблонов: OWASP, PCI, FISMA, NIST. В данном случае такой возможности мы не нашли.
Статистика недостатков, найденных AppScreener в приложении dvja
Статистика недостатков, найденных AppScreener в приложении dvja
Пароль в конфигурационном файле был главной проблемой приложения, по итогам анализа.
Список критических уязвимостей найденных AppScreener в приложении dvja
Список критических уязвимостей найденных AppScreener в приложении dvja
Список серьезных уязвимостей найденных AppScreener в приложении dvja
Список серьезных уязвимостей найденных AppScreener в приложении dvja
Список серьезных уязвимостей найденных AppScreener в приложении dvja
Список серьезных уязвимостей найденных AppScreener в приложении dvja
В отчете были и ложноположительные срабатывания. Анализатор ругался на Timing attack при сравнении пароля с его подтверждением:
cab098977a313c510fba67bdca92bf6f.png

PT Application Inspector выдал 56 недостатков. Он не нашел OGNL Expression Injection, но command injection успешно записал в критические. Он единственный обнаружил использование уязвимой версии JQuery, также нашел ненайденные другими анализаторами XSS. Ложноположительных срабатываний не было.
Статистика уязвимостей, найденных PT AI в приложении dvja
Статистика уязвимостей, найденных PT AI в приложении dvja
С Checkmarx оказалось не все так просто. В статистике мы увидели следующие цифры.
Статистика уязвимостей, найденных Checkmarx в приложении dvja
Статистика уязвимостей, найденных Checkmarx в приложении dvja
Дело в том, что он считает вектора атак и если у вас в коде есть одна SQL инъекция, но данная инъекция может быть использована из 8 разных мест, то он в итоги запишет 8. Вся эта информация представляется в виде графа, на котором отмечено. где вставить проверку будет наиболее эффективно. Это очень удобно и информативно.
Представление векторов атак Checkmarx
Представление векторов атак Checkmarx
Кроме того, есть возможность изменять ранжирование критичности уязвимостей на основе различных шаблонов, коих из коробки дают немало. Он также не нашел OGLN Injection.
Расстроило одно ложноположительное срабатывание. В SQL Injection он записал этот код:
Ложноположительное срабатывание Checkmarx в приложении dvja
Ложноположительное срабатывание Checkmarx в приложении dvja
После анализа отчетов всех анализаторов получилась следующая картина:
Fortify
PT AI
AppScreener
Checkmarx
Обнаружено уязвимостей
73%​
60%​
41%​
70%
Ложноположительные срабатывания
0​
0​
5​
1
Итог (R)
0,73
0,6
0,23
0,67

Анализ приложения Vulando​

Снова Fortify показал себя с лучшей стороны.
Статистика анализа Fortify  приложения vulnado
Статистика анализа Fortify приложения vulnado
Он нашел SQL Injection и Command Injection и записал их в критические
Список критических уязвимостей, найденных Fortify в приложении vulnado
Список критических уязвимостей, найденных Fortify в приложении vulnado
Остальные недочеты сводились к Unreleased Resource и Poor Error Handling:
Список серьезных уязвимостей, найденных Fortify в приложении vulnado
Список серьезных уязвимостей, найденных Fortify в приложении vulnado
AppScreener опять немного смутил расстановкой критичности, но две основные уязвимости он обнаружил, только записал Command Injection в Medium level. Не обошлось без ложных срабатываний, XSS в отчете не было.
Статистика уязвимостей, найденных AppScreener в приложении vulnado
Статистика уязвимостей, найденных AppScreener в приложении vulnado
Список уязвимостей, найденных AppScreener в приложении vulnado
Список уязвимостей, найденных AppScreener в приложении vulnado
Список уязвимостей, найденных AppScreener в приложении vulnado
Список уязвимостей, найденных AppScreener в приложении vulnado
PT Application Inspector также обнаружил две основные уязвимости (правда в отчете почему-то они были отображены как 4 разных), в остальном все свелось к Log Forging при выводе отладочной информации, XSS он не нашел.
Статистика уязвимостей, найденных PT AI  в приложении vulnado
Статистика уязвимостей, найденных PT AI в приложении vulnado
Checkmarx показал себя с лучшей стороны. Основные уязвимости были найдены, XSS была проставлена высокая критичность, нареканий к его работе не было. Он единственный нашел отсутствие соли в хешах, а также неверное формирование времени жизни JWT. На данном приложении Checkmarx выглядел убедительнее всех остальных.
Статистика уязвимостей, найденных Checkmarx в приложении vulnado
Статистика уязвимостей, найденных Checkmarx в приложении vulnado
В итоге получили следующие результаты:
FortifyPT AIAppScreenerCheckmarx
Обнаружено уязвимостей47%33%47%47%
Ложноположительные срабатывания0030
Итог (R)0,470,330,260,47

Заключение​

Внедрение инструментов анализа уязвимостей на больших проектах - нетривиальная задача, требующая точной настройки именно под ваш проект и команду. Но в начале долгого пути будет полезным посмотреть именно сырое сравнение «из коробки», чтобы получить представление о работе инструментов, понять основные особенности. Чуда не случилось, у всех инструментов есть свои сильные и слабые стороны, все требуют «доработки напильником».
Мы рассмотрели только один из параметров сравнения, но постоянная ежедневная работа с инструментом требует намного большего, чем чисто синтетический разовый прогон на простых приложениях. Мы прокатились пару кругов по Нюрбургрингу на четырех суперкарах мира статического анализа, в жизни может оказаться, что ездить каждый день на них по проселочной дороге не представляется возможным. Эффективность внедрения во многом зависит от культуры разработки на проекте и готовности DevOps. Без правильно выстроенного конвейера и процессов разработки любое внедренное средство будет стоять для галочки. Кто-то должен анализировать отчеты на постоянной основе, необходимо выделение роли security champion на проекте для разбора отчетов и постановки задач на исправления командам. Все рассмотренные средства позволяют проводить глубокую кастомизацию под свои нужды, а это также требует наличие специалистов. В любом случае, перед внедрением необходимо прежде всего набрать или обучить людей, которые будут работать над безопасностью кода. Можно обкатать процессы на open source решениях и только после того, как будет понимание потребностей и ограничений, смотреть в сторону коммерческих решений.
Если данная тема будет интересна читателям, мы проведем более детальный обзор каждого из инструментов, тем более что один из производителей изъявил готовность дать более глубокий анализ работы своего продукта. В следующей статье предлагается рассмотреть процесс онбординга (onboarding) для инструментов статического анализа, т.е. первичную настройку сканирования с указанием функций, принимающих данные от пользователя, и функций, производящих обработку этих данных. Показать взаимодействие специалиста ИБ с Security Champions из команды разработки при анализе отчетов. По задаче динамического анализа рассмотрим настройки процесса, покажем ввод данных по учеткам для тестирования сайта с использованием разных ролей. Опишем процесс настройки сканеров для проверки по веб-формам из сценария.


 
Сверху