Значимость анализа сторонних компонентов ПО (англ. Software Composition Analysis — SCA) в процессе разработки растет по мере выхода ежегодных отчетов об уязвимостях open source библиотек, которые публикуются компаниями Synopsys, Sonatype, Snyk, White Source. Согласно отчету число выявленных уязвимостей в open source в 2019 выросло почти в 1.5 раза в сравнении с предыдущим годом, в то время как компоненты с открытым кодом используются от 60% до 80% проектов. Если обратиться к независимому мнению, то процессы SCA являются отдельной практикой OWASP SAMM и BSIMM в качестве показателя зрелости, а в первой половине 2020 года OWASP выпустила новый стандарт OWASP Software Component Verification Standard (SCVS), предоставляющий лучшие практики по проверке сторонних компонент в цепочке поставок ПО.

Один из самых показательных кейсов с компанией Equifax в мае 2017 года. Неизвестные злоумышленники завладели информацией о 143 млн. американцев, включая полные имена, адреса, номера социального страхования и водительских удостоверений. В 209 000 случаях в документах также фигурировала информация о банковских картах пострадавших. Данная утечка произошла в следствие эксплуатации критической уязвимости в Apache Struts 2 (CVE-2017-5638), в то время как исправление было выпущено еще в марте 2017 года. У компании было два месяца на установку обновления, однако этим никто не озаботился.
В данной статье будет обсуждаться вопрос выбора инструмента для проведения SCA с точки зрения качества результатов анализа. Также будет приведено функциональное сравнение инструментов. Процесс встраивания в CI/CD и возможности по интеграции оставим на последующие публикации. Широкий список инструментов был представлен OWASP , но в рамках текущего обзора мы коснемся только самого популярного open source инструмента Dependency Check, чуть менее известной open source платформы Dependency Track и Enterprise-решения Sonatype Nexus IQ. Также разберемся, как работают эти решения и сравним полученные результаты на предмет ложных срабатываний.

Принцип работы
— это утилита (CLI, maven, jenkins модуль, ant), которая анализирует файлы проекта, собирает фрагменты информации о зависимостях (package name, groupid, specification title, version…), строит строку CPE — (Common Platform Enumeration), Package URL (PURL) и выявляет для CPE/PURL уязвимости из баз данных (NVD, Sonatype OSS Index, NPM Audit API…), после чего строит единоразовый отчет в формате HTML, JSON, XML…
Рассмотрим, как выглядит CPE:
cpe:2.3:part:vendor:product:version:update:edition:language:sw_edition:target_sw:target_hw:other- Part: Указание о том, что компонент относится к приложению (a), операционной системе (o), железу (h) (Обязательный пункт)
- Vendor: Название производителя продукта (Обязательный пункт)
- Product: Название продукта (Обязательный пункт)
- Version: Версия компоненты (Устаревший пункт)
- Update: Обновление пакета
- Edition: Наследуемая версия (Устаревший пункт)
- Language: Язык, определяемый в RFC-5646
- SW Edition: Версия ПО
- Target SW: Программная среда, в которой работает продукт
- Target HW: Аппаратная среда, в которой работает продукт
- Other: Информация о поставщике или продукте
Пример CPE выглядит следующим образом:
cpe:2.3:a:pivotal_software:spring_framework:3.0.0:*:*:*:*:*:*:* Строка означает, что CPE версии 2.3 описывает компонент приложения от производителя pivotal_software с названием spring_framework версии 3.0.0. Если мы откроем уязвимость в NVD, то можем увидеть упоминание этой CPE. Первая проблема, на которую сразу стоит обратить внимание — CVE в NVD, согласно CPE, сообщает о наличии проблемы во фреймворке, а не в конкретной компоненте. То есть, если разработчики плотно завязаны на фреймворк, а выявленная уязвимость не касается тех модулей, которые используют разработчики, специалисту по безопасности так или иначе придется разбирать данную CVE и задумываться об обновлении.
URL-адрес также используется инструментами SCA. Формат URL-адреса пакета следующий:
scheme:type/namespace/name@version?qualifiers#subpath- Sсheme: Всегда будет ‘pkg’, указывающий, что это URL-адрес пакета (Обязательный пункт)
- Type: «Тип» пакета или «протокол» пакета, например maven, npm, nuget, gem, pypi и т.д. (Обязательный пункт)
- Namespace: Некоторый префикс имени, такой как идентификатор группы Maven, владелец образа Docker, пользователь или организация GitHub. Необязательный и зависит от типа.
- Name: Имя пакета (Обязательный пункт)
- Version: Версия пакета
- Qualifiers: Дополнительные квалификационные данные для пакета, такие как ОС, архитектура, дистрибутив и т. Д. Необязательный и зависящий от типа пункт.
- Subpath: Дополнительный путь в пакете относительно корня пакета
Например:
pkg:golang/google.golang.org/genproto#googleapis/api/annotations
pkg:maven/org.apache.commons/io@1.3.4
pkg:pypi/django-package@1.11.1.dev1— on-premise веб-платформа, которая принимает готовые Bill of Materials (BOM) сформированные и , то есть готовые спецификации об имеющихся зависимостях. Это XML-файл с описанием зависимостей — name, hashes, package url, publisher, license. Далее Dependency Track разбирает BOM, смотрит имеющиеся к выявленным зависимостям CVE из базы данных уязвимостей (NVD, Sonatype OSS Index …), после чего строит графики, вычисляет метрики, регулярно обновляя данные о статусе уязвимости компонент.
Пример того, как может выглядеть BOM в формате XML:
<?xml version="1.0" encoding="UTF-8"?>
<bom xmlns="http://cyclonedx.org/schema/bom/1.2" serialNumber="urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79" version="1">
<components>
<component type="library">
<publisher>Apache</publisher>
<group>org.apache.tomcat</group>
<name>tomcat-catalina</name>
<version>9.0.14</version>
<hashes>
<hash alg="MD5">3942447fac867ae5cdb3229b658f4d48</hash>
<hash alg="SHA-1">e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a</hash>
<hash alg="SHA-256">f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b</hash>
<hash alg="SHA-512">e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282</hash>
</hashes>
<licenses>
<license>
<id>Apache-2.0</id>
</license>
</licenses>
<purl>pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14</purl>
</component>
<!-- More components here -->
</components>
</bom>BOM может использоваться не только в качестве входных параметров для Dependency Track, но и для инвентаризации компонентов ПО в цепочке поставок, например, для предоставления заказчику ПО. В 2014 году на рассмотрение в США был даже предложен закон , который гласил, что при закупке ПО любое гос. учреждение должно запрашивать BOM для предотвращения использования уязвимых компонент, однако в силу акт так и не вступил.
Возвращаясь к SCA, у Dependency Track есть готовые интеграции с Notification Platforms вроде Slack, системами управления уязвимостями вроде Kenna Security. Стоит также сказать, что Dependency Track ко всему прочему выявляет устаревшие версии пакетов и предоставляет информацию о лицензиях (за счет поддержки SPDX).
Если говорить именно о качестве SCA, то здесь есть принципиальная разница.
Dependency Track не принимает проект в качестве входных данных, а принимает именно BOM. Это означает, что если мы захотим проверить проект, то сначала нам нужно сгенерировать bom.xml, например, с помощью CycloneDX. Таким образом, Dependency Track напрямую зависит от CycloneDX. В то же время, это дает возможность кастомизации. Так команда OZON написала для сборки BOM-файлов для проектов на Golang с целью дальнейшего сканирования через Dependency Track.
— коммерческое решение SCA от компании Sonatype, которое является частью экосистемы Sonatype, куда также входит Nexus Repository Manager. Nexus IQ может принимать в качестве входных данных как war архивы (для java проектов) через веб-интерфейс или API, так и BOM, если ваша организация не успела перестроиться с CycloneDX на новое решение. В отличие от open source решений, IQ обращается не только к CP/PURL к выявленной компоненте и соответствующей уязвимости в базе данных, но и учитывает собственные исследования, например, название уязвимой функции или класса. Механизмы IQ будут рассмотрены позднее при разборе результатов.
Подведем некоторые итоге по функциональным особенностям, а также рассмотрим поддерживаемые языки для анализа:
Язык
Nexus IQ
Dependency Check
Dependency Track
Java
+
+
+
C/C++
+
+
—
C#
+
+
—
.Net
+
+
+
Erlang
—
—
+
JavaScript (NodeJS)
+
+
+
PHP
+
+
+
Python
+
+
+
Ruby
+
+
+
Perl
—
—
—
Scala
+
+
+
Objective C
+
+
—
Swift
+
+
—
R
+
—
—
Go
+
+
+
Функциональные возможности
Функциональные возможности
Nexus IQ
Dependency Check
Dependency Track
Возможность обеспечивать проверку компонент, используемых в исходном коде на лицензионную чистоту
+
—
+
Возможность сканирования и анализа на наличие уязвимостей и лицензионной чистоты для образов Docker
+ Интеграция с Clair
—
—
Возможность настройки политики безопасности для использования библиотек с открытым исходным кодом
+
—
—
Возможность сканирования репозиториев с открытым исходным кодом на наличие уязвимых компонентов
+ RubyGems, Maven, NPM, Nuget, Pypi, Conan, Bower, Conda, Go, p2, R, Yum, Helm, Docker, CocoaPods, Git LFS
—
+ Hex, RubyGems, Maven, NPM, Nuget, Pypi
Наличие специализированной исследовательской группы
+
—
—
Работа в закрытом контуре
+
+
+
Использование сторонних баз данных
+ Закрытая БД Sonatype
+ Sonatype OSS, NPM Public Advisors
+ Sonatype OSS, NPM Public Advisors, RetireJS, VulnDB, поддержка собственной БД уязвимостей
Возможность фильтровать компоненты с открытым исходным кодом при попытке загрузки в контур разработки согласно сконфигурированным политикам
+
—
—
Рекомендации по исправлению уязвимостей, наличие ссылок на исправление
+
+- (зависит от описания в публичных базах)
+- (зависит от описания в публичных базах)
Ранжирование обнаруженных уязвимостей по степени критичности
+
+
+
Ролевая модель доступа
+
—
+
Поддержка интерфейса командной строки CLI
+
+
+- (только для CycloneDX)
Выборка / сортировка уязвимостей по определяемым критериям
+
—
+
Dashboard по состоянию приложений
+
—
+
Генерация отчётов в PDF-формате
+
—
—
Генерация отчётов в формате JSONCSV
+
+
—
Поддержка русского языка
—
—
—
Интеграционные возможности
Интеграция
Nexus IQ
Dependency Check
Dependency Track
Интеграция с LDAP/Active Directory
+
—
+
Интеграция с системой непрерывной интеграции (continous integration) Bamboo
+
—
—
Интеграция с системой непрерывной интеграции (continous integration) TeamCity
+
—
—
Интеграция с системой непрерывной интеграции (continous integration) GitLab
+
+- (в виде плагина для GitLab)
+
Интеграция с системой непрерывной интеграции (continous integration) Jenkins
+
+
+
Наличие плагинов к IDE
+ IntelliJ, Eclipse, Visual Studio
—
—
Поддержка кастомизированной интеграции через web-services (API) инструмента
+
—
+
Dependency Check
Первый запуск
Запустим Dependency Check к умышленно уязвимому приложению .
Для этого воспользуемся :
mvn org.owasp:dependency-check-maven:checkВ результате в директории target появится dependency-check-report.html.

Откроем файл. После сводной информации об общем количестве уязвимостей можем увидеть информацию об уязвимостях с высоким уровнем Severity и Confidence с указанием на пакет, CPE, число CVE.
Следом идет более подробная информация, в частности то, на основе чего было принято решение (evidence), то есть некий BOM.

Далее идет CPE, PURL и описание CVE. Рекомендации об исправлении кстати не прилагаются в силу отсутствия их в базе NVD.

Для систематичного просмотра результатов сканирования можно настроить Nginx с минимальными настройками, либо отправлять полученные дефекты в систему управления дефектами, которые поддерживают конекторы к Dependency Check. Например, Defect Dojo.
Dependency Track
Установка
Dependency Track, в свою очередь, является веб-платформой с отображающими графиками, поэтому острый вопрос о хранении дефектов в стороннем решении здесь не стоит.
Для установки есть следующие поддерживаемые сценарии: Docker, WAR, Executable WAR.
Первый запуск
Переходим по URL запущенного сервиса. Входим через admin/admin, меняем логин и пароль, после чего попадаем на Dashboard. Следующее, что мы сделаем — создадим проект для тестового приложения на Java в Home/Projects → Create Project . В качестве примера возьмем DVJA.

Так как Dependency Track может принимать в качестве входных данных только BOM, этот BOM необходимо получить. Воспользуемся :
mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBomПолучаем bom.xml и загружаем файл в созданном проекте DVJA → Dependeencies → Upload BOM.
Зайдем в Administration → Analyzers. Понимаем, что у нас включен только Internal Analyzer, включающий NVD. Подключим также Sonatype OSS Index.

Таким образом, получим следующую картину для нашего проекта:

Также в списке можно найти одну уязвимость, применимую к Sonatype OSS:

Основное разочарование было в том, что Dependency Track больше не принимает xml-отчеты Dependency Check. Последние поддерживаемые версии интеграции с Dependency Check были 1.0.0 — 4.0.2, в то время как я тестировал 5.3.2.
Вот (и ), когда это было еще возможно.
Nexus IQ
Первый запуск
Установка Nexus IQ происходит из архивов по , но мы для этих целей собрали себе образ Docker.
После входа в консоль необходимо создать Организацию и Приложение.



Как можно видеть, настройка в случае с IQ происходит несколько сложнее, ибо нам также необходимо создать политики, применимые для разных “стейджей” (dev, build, stage, release). Это необходимо, чтобы блокировать уязвимые компоненты по мере продвижения по пайплайну ближе к проду, либо блокировать как только они попадают в Nexus Repo при скачивании разработчиками.
Чтобы ощутить разницу open source и enterprise, выполним такое же сканирование через Nexus IQ аналогично через , предварительно создав тестовое приложение в интерфейсе NexusIQ dvja-test-and-compare:
mvn com.sonatype.clm:clm-maven-plugin:evaluate -Dclm.applicationId=dvja-test-and-compare -Dclm.serverUrl=<NEXUSIQIP> -Dclm.username=<USERNAME> -Dclm.password=<PASSWORD>
Переходим по URL к сгенерированному отчету в веб-интерфейсе IQ:

Здесь можно увидеть все нарушения политики с указанием разного уровня значимости (от Info до Security Critical). Буква D рядом с компонентой означает, что компонента Direct Dependency, а буква T рядом с компонентом означает, что компонента Transitive Dependency, то есть является транзитивной.
Кстати, отчет от Snyk сообщает, что более 70% уязвимостей open source обнаруженных в Node.js, Java и Ruby находятся в транзитивных зависимостях.
Если открыть одно из нарушений политики Nexus IQ, мы можем увидеть описание компоненты, а также Version Graph, который показывает местоположение текущей версии на временном графе, а также в какой момент уязвимость перестает быть уязвимой. Высота свечей на графе показывает популярность использования этой компоненты.

Если перейти в раздел уязвимостей и раскрыть CVE, то можно прочитать описание к этой уязвимости, рекомендации по устранению, а также причину, по которой данная компонента попала под нарушение, то есть наличие класса DiskFileitem.class.


Подведем итоги только касающиеся сторонних компонентов Java, убрав компоненты js. В скобках укажем число тех уязвимостей, которые были найдены за пределами NVD.
Итого Nexus IQ:
- Dependencies Scanned: 62
- Vulnerable Dependencies: 16
- Vulnerabilities Found: 42 (8 sonatype db)
Итого Dependency Check:
- Dependencies Scanned: 47
- Vulnerable Dependencies: 13
- Vulnerabilities Found: 91 (14 sonatype oss)
Итого Dependency Track:
- Dependencies Scanned: 59
- Vulnerable Dependencies: 10
- Vulnerabilities Found: 51 (1 sonatype oss)
Следующим шагов проанализируем полученные результаты и разберемся, что из этих уязвимостей является реальным дефектом, а что ложным срабатыванием.
Дисклеймер
Данное ревью не является неоспоримой истиной. Перед автором не стояло цели выделить отдельный инструмент на фоне других. Смысл ревью был показать механизмы работы инструментов SCA и способы проверки их результатов.
Сравнение результатов
Условия:
Ложным срабатыванием по отношению к уязвимостям сторонних компонентов является:
- Несоответствие CVE к выявленной компоненте
- Например, если уязвимость выявлена во фреймворке struts2, а инструмент указывает на компоненту фреймворка struts-tiles, к которой эта уязвимость не относится, то это false positive
- Несоответствие CVE к выявленной версии компоненты
- Например, уязвимость привязана к версии python > 3.5 и инструмент отмечает уязвимой версию 2.7 — это false positive, так как на самом деле уязвимость относится только к ветке продукта 3.x
- Дублирование CVE
- Например, если SCA указал на CVE, позволяющую реализовать RCE, после чего SCA указывает для этой же компоненты CVE, применимую к продуктам Cisco, подверженным этой RCE. В таком случае будет false positive.
- Например, CVE была найдена в компоненте spring-web, после чего SCA указывает на эту же CVE в других компонентах фреймворка Spring Framework, в то время как CVE к другим компонентам отношения не имеет. В таком случае будет false positive.
Объектом исследования выбран Open Source проект DVJA. В исследовании участвовали только java компоненты (без js).
Сводные результаты
Перейдем сразу в результатом ручного ревью выявленных уязвимостей. С полным отчетом для каждой CVE можно познакомиться в Приложении.
Сводные результаты по всем уязвимостям:
Параметр
Nexus IQ
Dependency Check
Dependency Track
Всего выявлено уязвимостей
42
91
51
Неверно выявлено уязвимостей (false positive)
2(4.76%)
62(68,13%)
29(56.86%)
Не обнаружено релевантных уязвимостей (false negative)
10
20
27
Сводные результаты по компонентам:
Параметр
Nexus IQ
Dependency Check
Dependency Track
Всего выявлено компонентов
62
47
59
Всего уязвимых компонентов
16
13
10
Неверно выявлены уязвимые компоненты (false positive)
1
5
0
Неверно выявлены уязвимые компоненты (false positive)
0
6
6
Построим визуальные графики, чтобы оценить соотношение false positive и false negative к общему числу уязвимостей. По горизонтали отмечены компоненты, а по вертикали выявленные в них уязвимости.



Для сравнения, аналогичное исследование было проведено командой Sonatype по тестированию проекта из 1531 компоненты с помощью OWASP Dependency Check. Как мы можем увидеть, соотношение шума к корректным срабатываниям соезмиримо с нашими результатами.

Источник:
Рассмотрим некоторые CVE из результатов нашего сканирования, чтобы понять причину таких результатов.
Подробнее
№1
Разберем сначала некоторые интересные моменты Sonatype Nexus IQ.
Nexus IQ указывает на проблему с десереализацией с возможностью выполнить RCE в Spring Framework несколько раз. CVE-2016-1000027 в spring-web:3.0.5 в первый раз, и CVE-2011-2894 в spring-context:3.0.5 и spring-core:3.0.5. Поначалу кажется, что происходит дублирование уязвимости по нескольким CVE. Ибо, если посмотреть CVE-2016-1000027 и CVE-2011-2894 в базе NVD, то кажется, что все очевидно
Компонент
Уязвимость
spring-web:3.0.5
CVE-2016-1000027
spring-context:3.0.5
CVE-2011-2894
spring-core:3.0.5
CVE-2011-2894
Описание из NVD:

Описание из NVD:

CVE-2011-2894 сама по себе довольно известная. В отчете эта CVE была признана одной из самых часто встречающихся. Описания для CVE-2016-100027 в принципе немного в NVD, да и применима она, вроде бы, только для Spring Framework 4.1.4. Взглянем на и тут становится все более или менее понятно. Из мы понимаем, что помимо уязвимости в RemoteInvocationSerializingExporter в CVE-2011-2894, уязвимость наблюдается в HttpInvokerServiceExporter. Об этом нам и говорит Nexus IQ:

Тем не менее ничего подобного нет в NVD, из-за чего Dependency Check и Dependency Track получают по false negative.
Также из описания CVE-2011-2894 можно понять, что уязвимость действительно присутствует и в spring-context:3.0.5 и в spring-core:3.0.5. Подтверждение этому можно найти в статье от того, кто эту уязвимость нашел.
№2
Компонент
Уязвимость
Результат
struts2-core:2.3.30
CVE-2016-4003
FALSE
Если мы изучим уязвимость CVE-2016-4003, то поймем, что ее исправили еще в версии 2.3.28, тем не менее Nexus IQ нам о ней сообщает. В описании к уязвимости есть примечание:

То есть уязвимость существует только в связке с устаревшей версией JRE, о чем нас решили предупредить. Тем не менее, считаем это False Positive, хоть и не самым страшным.
№ 3
Компонент
Уязвимость
Результат
xwork-core:2.3.30
CVE-2017-9804
TRUE
xwork-core:2.3.30
CVE-2017-7672
FALSE
Если мы посмотрим описание к CVE-2017-9804 и CVE-2017-7672, то поймем, что проблема в URLValidator class, причем CVE-2017-9804 вытекает из CVE-2017-7672. Наличие второй уязвимости не несет никакой полезной нагрузки кроме того, что ее severity вырос до High, поэтому можно считать это лишним шумом.
В целом других false positive для Nexus IQ найдено не было.
№4
Есть несколько моментов, которые выделяют IQ на фоне других решений.
Компонент
Уязвимость
Результат
spring-web:3.0.5
CVE-2020-5398
TRUE
CVE в NVD сообщает, что она применима только для версий 5.2.x до 5.2.3, 5.1.x до 5.1.13, и версий 5.0.x до 5.0.16, тем не менее, если мы посмотрим описание CVE в Nexus IQ, то увидим следующее:
Advisory Deviation Notice: The Sonatype security research team discovered that this vulnerability was introduced in version 3.0.2.RELEASE and not 5.0.x as stated in the advisory.
После этого следует PoC к этой уязвимости, который сообщает, что она присутствует в версии 3.0.5.
False negative отправляется к Dependency Check и Dependency Track.
№5
Посмотрим на false positive для Dependency Check и Dependency Track.
Dependency Check отдельно выделяется тем, что отражает те CVE, которые относятся ко всему фреймворку в NVD, в те компоненты, к которым эти CVE не применимы. Это касается CVE-2012-0394, CVE-2013-2115, CVE-2014-0114, CVE-2015-0899, CVE-2015-2992, CVE-2016-1181, CVE-2016-1182, которые Dependency Check “прикрутил” к struts-taglib:1.3.8 и struts-tiles-1.3.8. Эти компоненты не имеют ничего общего с тем, что описано в CVE — обработка запросов, валидация страниц и так далее. Это обусловлено тем, что общее между этими CVE и компонентами — только фреймворк, из-за чего Dependency Check и посчитал это уязвимостью.
Такая же ситуация с spring-tx:3.0.5, и похожая ситуация с struts-core:1.3.8. Для struts-core Dependency Check и Dependency Track нашли очень много уязвимостей, которые на самом деле применимы к struts2-core, который по сути является отдельным фреймворком. В данном случае Nexus IQ правильно понял картину и в тех CVE, которые выдал, указал, что struts-core пришел end of life и необходимо перейти к struts2-core.
№6
В некоторых ситуациях трактовать явную ошибку Dependency Check и Dependency Track несправедливо. В частности CVE-2013-4152, CVE-2013-6429, CVE-2013-6430, CVE-2013-7315, CVE-2014-0054, CVE-2014-0225, CVE-2014-0225, которые Dependency Check и Dependency Track отнесли к spring-core:3.0.5 на самом деле относятся к spring-web:3.0.5. При этом часть из этих CVE были найдены и Nexus IQ, тем не менее IQ их корректно определил к другой компоненте. От того, что эти уязвимости не были найдены в spring-core, нельзя утверждать, что их нет во фреймворке в принципе и open source инструменты справедливо указали на эти уязвимости (просто немного промахнулись).
Выводы
Как мы можем видеть, определение достоверности выявленных уязвимостей ручным ревью не дает однозначных результатов, из-за чего возникают спорные моменты. Результаты таковы, что решение Nexus IQ обладает наименьшим показателем ложных срабатываний и наибольшей точностью.
В первую очередь, это связано с тем, что команда Sonatype расширило описание для каждой уязвимости CVE из NVD в своих базах, указав с точностью до класса или функции уязвимости для той или иной версии компоненты, проведя дополнительные исследования (например, проверив уязвимости на более старых версий ПО).
Немаловажное влияние на результаты играют и те уязвимости, которые не попали в NVD, но тем не менее присутствуют в базе Sonatype с пометкой SONATYPE. Согласно отчету о 45% обнаруженных уязвимостей с открытым исходным кодом не сообщается в NVD. Согласно базе данных WhiteSource, только 29% всех уязвимостей с открытым исходным кодом, зарегистрированных за пределами NVD, в конечном итоге публикуются в ней, поэтому так важно искать уязвимости также в других источниках.
Как итог Dependency Check выдает большое количество шума, упуская часть уязвимых компонент. Dependency Track выдает меньший шум и выявляет большое число компонент, что визуально не режет глаза в веб-интерфейсе.
Тем не менее, практика показывает, что именно open source должен становится первым шагов на пути к зрелому DevSecOps. Первое, над чем стоит задуматься для встраивания SCA в разработку, — это процессы, а именно размышления совместно с руководством и смежными департаментами над тем, как должны выглядеть идеальные процессы у себя в организации. Возможно, окажется так, что для вашей организации на первых порах Dependency Check или Dependency Track закроют все стоящие перед бизнесом потребности, а Enterprise-решения будут являться логическим продолжением в силу роста сложности разрабатываемых приложений.
Приложение А. Результаты применительно к компонентам
Условные обозначения:
- High — уязвимости высокого и критичного уровня в компоненте
- Medium — Уязвимости среднего уровня критичности в компоненте
- TRUE — Верно определенная уязвимость (True positive issue)
- FALSE — Ложное срабатывание (False positive issue)
Компонент
Nexus IQ
Dependency Check
Dependency Track
Результат
dom4j: 1.6.1
High
High
High
TRUE
log4j-core: 2.3
High
High
High
TRUE
log4j: 1.2.14
High
High
—
TRUE
commons-collections:3.1
High
High
High
TRUE
commons-fileupload:1.3.2
High
High
High
TRUE
commons-beanutils:1.7.0
High
High
High
TRUE
commons-codec:1:10
Medium
—
—
TRUE
mysql-connector-java:5.1.42
High
High
High
TRUE
spring-expression:3.0.5
High
компонент не найден
TRUE
spring-web:3.0.5
High
компонент не найден
High
TRUE
spring-context:3.0.5
Medium
компонент не найден
—
TRUE
spring-core:3.0.5
Medium
High
High
TRUE
struts2-config-browser-plugin:2.3.30
Medium
—
—
TRUE
spring-tx:3.0.5
—
High
—
FALSE
struts-core:1.3.8
High
High
High
TRUE
xwork-core: 2.3.30
High
—
—
TRUE
struts2-core: 2.3.30
High
High
High
TRUE
struts-taglib:1.3.8
—
High
—
FALSE
struts-tiles-1.3.8
—
High
—
FALSE
Приложение Б. Результаты применительно к уязвимостям
Условные обозначения:
- High — уязвимости высокого и критичного уровня в компоненте
- Medium — Уязвимости среднего уровня критичности в компоненте
- TRUE — Верно определенная уязвимость (True positive issue)
- FALSE — Ложное срабатывание (False positive issue)
Компонент
Nexus IQ
Dependency Check
Dependency Track
Severity
Результат
Комментарий
dom4j: 1.6.1
CVE-2018-1000632
CVE-2018-1000632
CVE-2018-1000632
High
TRUE
CVE-2020-10683
CVE-2020-10683
CVE-2020-10683
High
TRUE
log4j-core: 2.3
CVE-2017-5645
CVE-2017-5645
CVE-2017-5645
High
TRUE
CVE-2020-9488
CVE-2020-9488
CVE-2020-9488
Low
TRUE
log4j: 1.2.14
CVE-2019-17571
CVE-2019-17571
—
High
TRUE
—
CVE-2020-9488
—
Low
TRUE
SONATYPE-2010-0053
—
—
High
TRUE
commons-collections:3.1
—
CVE-2015-6420
CVE-2015-6420
High
FALSE
Дублирует RCE(OSSINDEX)
—
CVE-2017-15708
CVE-2017-15708
High
FALSE
Дублирует RCE(OSSINDEX)
SONATYPE-2015-0002
RCE (OSSINDEX)
RCE(OSSINDEX)
High
TRUE
commons-fileupload:1.3.2
CVE-2016-1000031
CVE-2016-1000031
CVE-2016-1000031
High
TRUE
SONATYPE-2014-0173
—
—
Medium
TRUE
commons-beanutils:1.7.0
CVE-2014-0114
CVE-2014-0114
CVE-2014-0114
High
TRUE
—
CVE-2019-10086
CVE-2019-10086
High
FALSE
Уязвимость применима только для версий 1.9.2+
commons-codec:1:10
SONATYPE-2012-0050
—
—
Medium
TRUE
mysql-connector-java:5.1.42
CVE-2018-3258
CVE-2018-3258
CVE-2018-3258
High
TRUE
CVE-2019-2692
CVE-2019-2692
—
Medium
TRUE
—
CVE-2020-2875
—
Medium
FALSE
Та же самая уязвимость как и CVE-2019-2692, но c припиской «attacks may significantly impact additional products»
—
CVE-2017-15945
—
High
FALSE
Не относится к mysql-connector-java
—
CVE-2020-2933
—
Low
FALSE
Дубликат к CVE-2020-2934
CVE-2020-2934
CVE-2020-2934
—
Medium
TRUE
spring-expression:3.0.5
CVE-2018-1270
компонент не найден
—
High
TRUE
CVE-2018-1257
—
—
Medium
TRUE
spring-web:3.0.5
CVE-2016-1000027
компонент не найден
—
High
TRUE
CVE-2014-0225
—
CVE-2014-0225
High
TRUE
CVE-2011-2730
—
—
High
TRUE
—
—
CVE-2013-4152
Medium
TRUE
CVE-2018-1272
—
—
High
TRUE
CVE-2020-5398
—
—
High
TRUE
Показательный пример в пользу IQ: «The Sonatype security research team discovered that this vulnerability was introduced in version 3.0.2.RELEASE and not 5.0.x as stated in the advisory.»
CVE-2013-6429
—
—
Medium
TRUE
CVE-2014-0054
—
CVE-2014-0054
Medium
TRUE
CVE-2013-6430
—
—
Medium
TRUE
spring-context:3.0.5
CVE-2011-2894
компонент не найден
—
Medium
TRUE
spring-core:3.0.5
—
CVE-2011-2730
CVE-2011-2730
High
TRUE
CVE-2011-2894
CVE-2011-2894
CVE-2011-2894
Medium
TRUE
—
—
CVE-2013-4152
Medium
FALSE
Дубликат этой же уязвимости в spring-web
—
CVE-2013-4152
—
Medium
FALSE
Уязвимость относится к компоненте spring-web
—
CVE-2013-6429
CVE-2013-6429
Medium
FALSE
Уязвимость относится к компоненте spring-web
—
CVE-2013-6430
—
Medium
FALSE
Уязвимость относится к компоненте spring-web
—
CVE-2013-7315
CVE-2013-7315
Medium
FALSE
SPLIT из CVE-2013-4152. + Уязвимость относится к компоненте spring-web
—
CVE-2014-0054
CVE-2014-0054
Medium
FALSE
Уязвимость относится к компоненте spring-web
—
CVE-2014-0225
—
High
FALSE
Уязвимость относится к компоненте spring-web
—
—
CVE-2014-0225
High
FALSE
Дубликат этой же уязвимости в spring-web
—
CVE-2014-1904
CVE-2014-1904
Medium
FALSE
Уязвимость относится к компоненте spring-web-mvc
—
CVE-2014-3625
CVE-2014-3625
Medium
FALSE
Уязвимость относится к компоненте spring-web-mvc
—
CVE-2016-9878
CVE-2016-9878
High
FALSE
Уязвимость относится к компоненте spring-web-mvc
—
CVE-2018-1270
CVE-2018-1270
High
FALSE
Для spring-expression / spring-messages
—
CVE-2018-1271
CVE-2018-1271
Medium
FALSE
Уязвимость относится к компоненте spring-web-mvc
—
CVE-2018-1272
CVE-2018-1272
High
TRUE
CVE-2014-3578
CVE-2014-3578 (OSSINDEX)
CVE-2014-3578
Medium
TRUE
SONATYPE-2015-0327
—
—
Low
TRUE
struts2-config-browser-plugin:2.3.30
SONATYPE-2016-0104
—
—
Medium
TRUE
spring-tx:3.0.5
—
CVE-2011-2730
—
High
FALSE
Уязвимость не относится к spring-tx
—
CVE-2011-2894
—
High
FALSE
Уязвимость не относится к spring-tx
—
CVE-2013-4152
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2013-6429
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2013-6430
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2013-7315
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2014-0054
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2014-0225
—
High
FALSE
Уязвимость не относится к spring-tx
—
CVE-2014-1904
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2014-3625
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2016-9878
—
High
FALSE
Уязвимость не относится к spring-tx
—
CVE-2018-1270
—
High
FALSE
Уязвимость не относится к spring-tx
—
CVE-2018-1271
—
Medium
FALSE
Уязвимость не относится к spring-tx
—
CVE-2018-1272
—
Medium
FALSE
Уязвимость не относится к spring-tx
struts-core:1.3.8
—
CVE-2011-5057 (OSSINDEX)
Medium
FASLE
Уязвимость к Struts 2
—
CVE-2012-0391 (OSSINDEX)
CVE-2012-0391
High
FALSE
Уязвимость к Struts 2
—
CVE-2014-0094 (OSSINDEX)
CVE-2014-0094
Medium
FALSE
Уязвимость к Struts 2
—
CVE-2014-0113 (OSSINDEX)
CVE-2014-0113
High
FALSE
Уязвимость к Struts 2
CVE-2016-1182
3VE-2016-1182
—
High
TRUE
—
—
CVE-2011-5057
Medium
FALSE
Уязвимость к Struts 2
—
CVE-2012-0392 (OSSINDEX)
CVE-2012-0392
High
FALSE
Уязвимость к Struts 2
—
CVE-2012-0393 (OSSINDEX)
CVE-2012-0393
Medium
FALSE
Уязвимость к Struts 2
CVE-2015-0899
CVE-2015-0899
—
High
TRUE
—
CVE-2012-0394
CVE-2012-0394
Medium
FALSE
Уязвимость к Struts 2
—
CVE-2012-0838 (OSSINDEX)
CVE-2012-0838
High
FALSE
Уязвимость к Struts 2
—
CVE-2013-1965 (OSSINDEX)
CVE-2013-1965
High
FALSE
Уязвимость к Struts 2
—
CVE-2013-1966 (OSSINDEX)
CVE-2013-1966
High
FASLE
Уязвимость к Struts 2
—
CVE-2013-2115
CVE-2013-2115
High
FASLE
Уязвимость к Struts 2
—
CVE-2013-2134 (OSSINDEX)
CVE-2013-2134
High
FASLE
Уязвимость к Struts 2
—
CVE-2013-2135 (OSSINDEX)
CVE-2013-2135
High
FASLE
Уязвимость к Struts 2
CVE-2014-0114
CVE-2014-0114
—
High
TRUE
—
CVE-2015-2992
CVE-2015-2992
Medium
FALSE
Уязвимость к Struts 2
—
CVE-2016-0785 (OSSINDEX)
CVE-2016-0785
High
FALSE
Уязвимость к Struts 2
CVE-2016-1181
CVE-2016-1181
—
High
TRUE
—
CVE-2016-4003 (OSSINDEX)
CVE-2016-4003
High
FALSE
Уязвимость к Struts 2
xwork-core:2.3.30
CVE-2017-9804
—
—
High
TRUE
SONATYPE-2017-0173
—
—
High
TRUE
CVE-2017-7672
—
—
High
FALSE
Дубль к CVE-2017-9804
SONATYPE-2016-0127
—
—
High
TRUE
struts2-core:2.3.30
—
CVE-2016-6795
CVE-2016-6795
High
TRUE
—
CVE-2017-9787
CVE-2017-9787
High
TRUE
—
CVE-2017-9791
CVE-2017-9791
High
TRUE
—
CVE-2017-9793
—
High
FALSE
Дубликат к CVE-2018-1327
—
CVE-2017-9804
—
High
TRUE
—
CVE-2017-9805
CVE-2017-9805
High
TRUE
CVE-2016-4003
—
—
Medium
FALSE
Применимо к Apache Struts 2.x до 2.3.28, а это версия 2.3.30. Тем не менее, исходя из описания, CVE действует при любых версиях Struts 2, если используется JRE 1.7 и меньше. Видимо нас тут решили перестраховать, но больше похоже на FALSE
—
CVE-2018-1327
CVE-2018-1327
High
TRUE
CVE-2017-5638
CVE-2017-5638
CVE-2017-5638
High
TRUE
Та самая уязвимость, которой воспользовались злоумышленники в Equifax в 2017 году
CVE-2017-12611
CVE-2017-12611
—
High
TRUE
CVE-2018-11776
CVE-2018-11776
CVE-2018-11776
High
TRUE
struts-taglib:1.3.8
—
CVE-2012-0394
—
Medium
FALSE
Для struts2-core
—
CVE-2013-2115
—
High
FALSE
Для struts2-core
—
CVE-2014-0114
—
High
FALSE
Для commons-beanutils
—
CVE-2015-0899
—
High
FALSE
Не относится к taglib
—
CVE-2015-2992
—
Medium
FALSE
Относится к struts2-core
—
CVE-2016-1181
—
High
FALSE
Не относится к taglib
—
CVE-2016-1182
—
High
FALSE
Не относится к taglib
struts-tiles-1.3.8
—
CVE-2012-0394
—
Medium
FALSE
Для struts2-core
—
CVE-2013-2115
—
High
FALSE
Для struts2-core
—
CVE-2014-0114
—
High
FALSE
Под commons-beanutils
—
CVE-2015-0899
—
High
FALSE
Не относится к tiles
—
CVE-2015-2992
—
Medium
FALSE
Для struts2-core
—
CVE-2016-1181
—
High
FALSE
Не относится к taglib
—
CVE-2016-1182
—
High
FALSE
Не относится к taglib
Источник: habr.com
