Snyk
Официальный сайт: snyk.io
Стоимость: есть бесплатная Open Source версия, а также несколько платных тарифов. Более подробно ознакомиться с тарифными планами можно по ссылке.
Поддерживаемые языки программирования и фреймворки: .NET, C/C++, GO, Java, Kotlin, JavaScript, PHP, Python, Ruby, Swift, Objective-C. Полный список есть на сайте.
Интеграция со сторонними сервисами: GitHub, GitLab, Bitbucket, Jira, Slack, Docker и некоторые другие.
Snyk представляет собой инструмент с открытым исходным кодом, который ищет в зависимостях возможные проблемы безопасности. Одна из главных особенностей Snyk — инструмент можно запускать тремя разными способами: в командной строке, Docker-контейнере и веб-интерфейсе.
Для поиска Snyk использует собственную базу данных. Помимо уязвимостей для многочисленных языков программирования, в базе также имеются уязвимости для Kubernetes, AWS, Google Cloud Platform, Microsoft Azure, Ubuntu, Alpine Linux, Oracle Linux.
В веб-интерфейсе Snyk можно подключать свои репозитории с исходным кодом.
Snyk поддерживает репозитории с артефактами, например реестры Docker Hub, Artifactory, Harbor, Nexus.
У Snyk есть свой плагин для различных IDE-систем: Visual Studio Code, Eclipse, Android Studio.
Разберем функциональность поиска уязвимостей на примере подключенного GitHub-репозитория с проектом на языке Python. После добавления репозитория начнется процесс сканирования, а по завершении будет отображен отчет с найденными уязвимостями.
Snyk ищет уязвимости в сторонних компонентах, поэтому сканирует именно тот файл, в котором эти библиотеки перечислены. Для программ, написанных на языке программирования Python, сторонние уязвимости указываются в текстовом файле с именем requirements.txt.
Все уязвимости в Snyk подразделяются на следующие степени критичности:
- критические (Critical) обозначаются бордовым цветом;
- высокие (High) — красным;
- средние (Medium) — оранжевым;
- низкие (Low) — серым.
Чем больше степень критичности у найденной уязвимости, тем большую угрозу безопасности она представляет и тем большее внимание необходимо на нее обратить в первую очередь.
Так выглядит отчет с найденными уязвимостями:
Для каждой найденной уязвимости есть подробное описание.
Для исправления конкретной уязвимости можно создать Pull Request, в котором автоматически будет сгенерирована вся необходимая информация.
OWASP Dependency-Check
Официальный сайт: OWASP Dependency-Check
Стоимость: бесплатная версия Open Source.
Поддерживаемые языки программирования и фреймворки: .NET, Java, JavaScript, Ruby, Python. С полным списком поддерживаемых языков программирования можно ознакомиться по ссылке.
Интеграция со сторонними сервисами: поддерживаются следующие интеграции при помощи плагина — Jenkins, Scala, SonarQube, Circle CI.
OWASP Dependency-Check представляет собой бесплатную утилиту с открытым исходным кодом для поиска и обнаружения уязвимостей в используемых библиотеках разрабатываемого приложения.
Проект разработан некоммерческой организацией OWASP (Open Web Application Security Project), которая публикует материалы об информационной безопасности и разрабатывает собственное программное обеспечение.
После завершения сканирования Dependency-Check генерирует отчет в формате HTML, в котором подробно описаны найденные уязвимости.
Установим утилиту и запустим сканирование тестового проекта, написанного на языке Java. Я использую дистрибутив Ubuntu версии 22.04 и выполняю все команды от имени root-пользователя.
1. Для начала необходимо установить Java 8-й версии, так как для запуска Dependency-Check необходима Java. Для установки Java необходимо выполнить команду:
apt -y install openjdk-8-jre-headless
2. После того как Java была успешно установлена, скачиваем последнюю актуальную версию программы (на момент написания статьи это 9.2.0) при помощи утилиты wget:
wget https://github.com/jeremylong/DependencyCheck/releases/download/v9.2.0/dependency-check-9.2.0-release.zip
3. Разархивируем скачанный архив, используя утилиту unzip. Если утилиты нет в системе, ее необходимо установить при помощи команды:
apt -y install zip
Далее разархивируем:
unzip dependency-check-9.2.0-release.zip
4. В созданной директории dependency-check/bin будет находиться файл dependency-check.sh. Создадим для этого файла символьную ссылку в директорию /usr/bin, чтобы запускать Dependency-Check из любого места в системе:
ln -s /root/dependency-check/bin/dependency-check.sh /usr/bin/dependency-check.sh
5. Проверяем, что программа была корректно установлена путем вывода версии:
dependency-check.sh --version
Если в выводе отобразилась используемая версия, то Dependency-Check успешно установлен.
Далее мы просканируем тестовый проект на Java. Для этого воспользуемся командой:
dependency-check.sh --scan basic-selenium-project/
Здесь basic-selenium-project — это имя директории с исходным кодом.
Первое сканирование может занять длительное время, потому что программе необходимо обновить базу данных существующих уязвимостей.
После завершения сканирования программа сохранит отчет в ту директорию, из которой запускалась команда сканирования. Отчет всегда генерируется в формате HTML.
В отчете в первую очередь отображается вкладка Summary, в которой перечислены все зависимости с уязвимостями.
Так же, как и в Snyk, все найденные уязвимости подразделяются на степени критичности — Critical, High, Medium, Low.
Если перейти по ссылке уязвимости, откроется ее более подробное описание.
Dependency-Track
Официальный сайт: Dependency-Track
Стоимость: бесплатная версия Open Source.
Поддерживаемые языки программирования и фреймворки: Cargo (Rust), Composer (PHP), Gems (Ruby), Hex (Erlang/Elixir), Maven (Java), NPM (Javascript), NuGet (.NET), PyPI (Python).
Интеграция со сторонними сервисами: GitHub, Azure DevOps, MixewayHub. Список всех поддерживаемых сервисов по ссылке.
Dependency-Track — инструмент, который работает с форматом BOM (Bill-of-Materials). Это XML-файл, в котором хранятся описания используемых библиотек, включающий такую информацию, как названия библиотек, их версии, источники и так далее. Dependency-Track использует несколько баз данных уязвимостей — NVD, Sonatype OSS Index, NPM.
Программа работает через веб-интерфейс, в котором есть различные графики для наглядного контроля за найденными уязвимостями.
Dependency-Track устанавливается при помощи утилиты docker compose. Предварительно установите Docker и docker compose на вашем сервере. Для установки Dependency-Track выполняем следующие шаги:
1. Скачиваем официальный docker compose файл:
curl -LO https://dependencytrack.org/docker-compose.yml
2. В скачанном файле ищем строку API_BASE_URL и в ее значении меняем адрес с localhost на адрес или доменное имя сервера, на котором будет запускаться Dependency-Track:
3. Запускаем Dependency-Track при помощи команды:
docker compose up -d
4. Веб-интерфейс программы находится на порту 8080. При первом входе необходимо ввести стандартные данные:
логин: admin
пароль: admin
5. Далее программа попросит ввести еще раз стандартный логин и пароль и задать новый пароль для учетной записи admin:
6. Для того чтобы запустить сканирование, надо создать новый проект. В главном меню слева выбираем вкладку Projects («Проекты») и нажимаем на Create Project («Создать новый проект»):
7. Далее задаем любое имя для проекта (Project name) и выбираем тип проекта из выпадающего списка (Classifier). Нажимаем на кнопку Create.
8. Когда проект создан, переходим в раздел Components и нажимаем на кнопку Upload BOM:
Как я уже упомянул ранее, Dependency-Check работает только с файлами типа BOM. Для примера возьмем один из таких файлов, использовавшийся в проекте для JavaScript. Выбираем файл при помощи кнопки Browse:
Когда файл будет просканирован, в отчете отобразятся все используемые библиотеки и найденные уязвимости.
Чтобы увидеть более подробную информацию, нужно открыть необходимый компонент.
Для каждого проекта отображается общая картина по найденным уязвимостям.
Заключение
Большинство библиотек, которые используются при разработке приложений, имеют открытый исходный код. Именно поэтому важно отслеживать, насколько они безопасны для вас, нет ли в них «дыр». В этой статье мы рассмотрели топ-3 популярных сканера для поиска уязвимостей в сторонних компонентах и подключенных библиотеках.