HimeraSearchDB
Carding_EbayThief
triada
CrackerTuch
d-shop

НОВОСТИ [Из песочницы] DevSecOps: принципы работы и сравнение SCA. Часть первая

NewsBot
Оффлайн

NewsBot

.
.
Регистрация
21.07.20
Сообщения
40.408
Реакции
1
Репутация
0
Значимость анализа сторонних компонентов ПО (англ. 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), предоставляющий лучшие практики по проверке сторонних компонент в цепочке поставок ПО.

v1gsliw5axpmk9yusfgjzoa2cna.jpeg


Один из самых показательных кейсов с компанией 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. Также разберемся, как работают эти решения и сравним полученные результаты на предмет ложных срабатываний.

xtdsy_qtvg5jorfcgoo29_ybe2i.png


Принцип работы


— это утилита (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:eek:ther

  • 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/[email protected]
pkg:pypi/[email protected]

— on-premise веб-платформа, которая принимает готовые Bill of Materials (BOM) сформированные и , то есть готовые спецификации об имеющихся зависимостях. Это XML-файл с описанием зависимостей — name, hashes, package url, publisher, license. Далее Dependency Track разбирает BOM, смотрит имеющиеся к выявленным зависимостям CVE из базы данных уязвимостей (NVD, Sonatype OSS Index …), после чего строит графики, вычисляет метрики, регулярно обновляя данные о статусе уязвимости компонент.

Пример того, как может выглядеть BOM в формате XML:







Apache
org.apache.tomcat
tomcat-catalina
9.0.14

3942447fac867ae5cdb3229b658f4d48
e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a
f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b
e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282



Apache-2.0



pkg:maven/org.apache.tomcat/[email protected]





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 IQDependency CheckDependency Track

Java

+

+

+

C/C++

+

+

-

C#

+

+

-

.Net

+

+

+

Erlang

-

-

+

JavaScript (NodeJS)

+

+

+

PHP

+

+

+

Python

+

+

+

Ruby

+

+

+

Perl

-

-

-

Scala

+

+

+

Objective C

+

+

-

Swift

+

+

-

R

+

-

-

Go

+

+

+

Функциональные возможности

Функциональные возможностиNexus IQDependency CheckDependency 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-формате

+

-

-

Генерация отчётов в формате JSON\CSV

+

+

-

Поддержка русского языка

-

-

-

Интеграционные возможности
ИнтеграцияNexus IQDependency CheckDependency 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.

-7ez45zw76x087edt7pncx3y1da.png


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

Следом идет более подробная информация, в частности то, на основе чего было принято решение (evidence), то есть некий BOM.

qpnc1fniiadfrcqbp-vkuro4g6k.png


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

x-b5fwqx_5gmvcy0qyoz6va4ycq.png


Для систематичного просмотра результатов сканирования можно настроить Nginx с минимальными настройками, либо отправлять полученные дефекты в систему управления дефектами, которые поддерживают конекторы к Dependency Check. Например, Defect Dojo.

Dependency Track


Установка


Dependency Track, в свою очередь, является веб-платформой с отображающими графиками, поэтому острый вопрос о хранении дефектов в стороннем решении здесь не стоит.
Для установки есть следующие поддерживаемые сценарии: Docker, WAR, Executable WAR.

Первый запуск


Переходим по URL запущенного сервиса. Входим через admin/admin, меняем логин и пароль, после чего попадаем на Dashboard. Следующее, что мы сделаем — создадим проект для тестового приложения на Java в Home/Projects → Create Project . В качестве примера возьмем DVJA.

wc6gf6m_zgbbbwvigqenztyhccw.png


Так как 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.

zffqd8ropnykkoglkoahvknq2km.png


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

uloadburbvueg9ez_nfsjyamfos.png


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

vkagqka2mrig63_6fi7bf7hlatu.png


Основное разочарование было в том, что Dependency Track больше не принимает xml-отчеты Dependency Check. Последние поддерживаемые версии интеграции с Dependency Check были 1.0.0 — 4.0.2, в то время как я тестировал 5.3.2.

Вот ), когда это было еще возможно.

Nexus IQ


Первый запуск


Установка Nexus IQ происходит из архивов по , но мы для этих целей собрали себе образ Docker.

После входа в консоль необходимо создать Организацию и Приложение.

1lku7hxu0iktlchvywarkae-uj4.png


djjzchqgh70ne0x_4oyeotwbi9u.png


t1wmkyndmbeclpqazldwykyxlaq.png


Как можно видеть, настройка в случае с 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= -Dclm.username= -Dclm.password=



Переходим по URL к сгенерированному отчету в веб-интерфейсе IQ:

slmeg0tqewmzdjuu03hmmwyhx8y.png


Здесь можно увидеть все нарушения политики с указанием разного уровня значимости (от Info до Security Critical). Буква D рядом с компонентой означает, что компонента Direct Dependency, а буква T рядом с компонентом означает, что компонента Transitive Dependency, то есть является транзитивной.

Кстати, отчет от Snyk сообщает, что более 70% уязвимостей open source обнаруженных в Node.js, Java и Ruby находятся в транзитивных зависимостях.

Если открыть одно из нарушений политики Nexus IQ, мы можем увидеть описание компоненты, а также Version Graph, который показывает местоположение текущей версии на временном графе, а также в какой момент уязвимость перестает быть уязвимой. Высота свечей на графе показывает популярность использования этой компоненты.

qdrbqzez2rwg1vc2sappdzvs66u.png


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

gyzo_vin0fsbucsapz6hkn3mqnc.png


sbx6euo3tckptoxedjzxczdfvc4.png


Подведем итоги только касающиеся сторонних компонентов 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 IQDependency CheckDependency Track

Всего выявлено уязвимостей

42

91

51

Неверно выявлено уязвимостей (false positive)

2(4.76%)

62(68,13%)

29(56.86%)

Не обнаружено релевантных уязвимостей (false negative)

10

20

27

Сводные результаты по компонентам:
ПараметрNexus IQDependency CheckDependency Track

Всего выявлено компонентов

62

47

59

Всего уязвимых компонентов

16

13

10

Неверно выявлены уязвимые компоненты (false positive)

1

5

0

Неверно выявлены уязвимые компоненты (false positive)

0

6

6

Построим визуальные графики, чтобы оценить соотношение false positive и false negative к общему числу уязвимостей. По горизонтали отмечены компоненты, а по вертикали выявленные в них уязвимости.

qeibnxjk4sohwzatzsvbqug-tkg.png


ucv_zb8xm2x8ixacmqe5hgxu77e.png


dj9pcy2objzcyhadpb9dgxh3wu8.png


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

wgi0pw01iuqmmtaclisl_i_cqgg.png

Источник:

Рассмотрим некоторые 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:
st9ckstxf2ydc93kzfeoig2ouxy.png


Описание из NVD:
3sflu4s1aahaailqhhibxl9llmy.png


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

jadsgg02uxxn_-pms3o6hwzw_5q.png


Тем не менее ничего подобного нет в 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 нам о ней сообщает. В описании к уязвимости есть примечание:

7tr6c-ax5y7myerndalx12qdg3i.png


То есть уязвимость существует только в связке с устаревшей версией 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 IQDependency CheckDependency 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 IQDependency CheckDependency TrackSeverityРезультатКомментарий

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
 
Сверху Снизу