DevSecOps: принципи роботи та порівняння SCA. Частина перша

p align="justify"> Значимість аналізу сторонніх компонентів ПЗ (англ. Software Composition Analysis - SCA) в процесі розробки зростає в міру виходу щорічних звітів про вразливості open source бібліотек, які публікуються компаніями Synopsys, Sonatype, Snyk, White Source. Відповідно до звіту The State of Open Source Security Vulnerabilities 2020 кількість виявлених уразливостей в open source у 2019 році зросла майже в 1.5 рази порівняно з попереднім роком, тоді як компоненти з відкритим кодом використовуються від 60% до 80% проектів. Якщо звернутися до незалежної думки, то процеси SCA є окремою практикою OWASP SAMM і BSIMM як показник зрілості, а в першій половині 2020 року OWASP випустила новий стандарт OWASP Software Component Verification Standard (SCVS), що надає кращі практики з перевірки сторонніх компонентів у ланцюжку поставок ПЗ.

DevSecOps: принципи роботи та порівняння SCA. Частина перша

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

DevSecOps: принципи роботи та порівняння SCA. Частина перша

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

Перевірка залежностей - це утиліта (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

  • частина: Вказівка ​​про те, що компонент відноситься до додатку (a), операційної системи (o), заліза (h) (Обов'язковий пункт)
  • Виробник: Назва виробника продукту (Обов'язковий пункт)
  • продукт: Назва продукту (Обов'язковий пункт)
  • Версія: Версія компоненти (Застарілий пункт)
  • Оновлення: Оновлення пакету
  • видання: Спадкована версія (Застарілий пункт)
  • Мова: Мова, що визначається RFC-5646
  • SW Edition: Версія програмного забезпечення
  • Target SW: Програмне середовище, в якому працює продукт
  • Target HW: Апаратне середовище, в якому працює продукт
  • Інший: Інформація про постачальника або продукт

Приклад CPE виглядає так:

cpe:2.3:a:pivotal_software:spring_framework:3.0.0:*:*:*:*:*:*:*

Рядок означає, що CPE версії 2.3 описує компонент програми від виробника pivotal_software з назвою spring_framework Версія 3.0.0. Якщо ми відкриємо вразливість CVE-2014-0225 в NVD, то можемо побачити згадку про цю CPE. Перша проблема, на яку відразу варто звернути увагу - CVE в NVD, згідно з CPE повідомляє про наявність проблеми у фреймворку, а не в конкретному компоненті. Тобто якщо розробники щільно зав'язані на фреймворк, а виявлена ​​вразливість не стосується тих модулів, які використовують розробники, фахівцю з безпеки так чи інакше доведеться розбирати цю CVE і замислюватися про оновлення.

URL-адреса також використовується інструментами SCA. Формат URL-адреси пакета наступний:

scheme:type/namespace/name@version?qualifiers#subpath

  • Sсheme: Завжди буде 'pkg', що вказує на те, що це URL-адреса пакета (Обов'язковий пункт)
  • Тип: "Тип" пакета або "протокол" пакета, наприклад maven, npm, nuget, gem, pypi і т.д. (Обов'язковий пункт)
  • Простір імен: Деякий префікс імені, такий як ідентифікатор Maven, власник образу Docker, користувач або організація GitHub. Необов'язковий та залежить від типу.
  • ім'я: Ім'я пакета (Обов'язковий пункт)
  • Версія: Версія пакету
  • Кваліфікатори: Додаткові кваліфікаційні дані пакета, такі як ОС, архітектура, дистрибутив тощо. буд. Необов'язковий і залежить від типу пункт.
  • Subpath: Додатковий шлях у пакеті щодо кореня пакету

Наприклад:

pkg:golang/google.golang.org/genproto#googleapis/api/annotations
pkg:maven/org.apache.commons/[email protected]
pkg:pypi/[email protected]

Dependency Track - on-premise веб-платформа, яка приймає готові Bill of Materials (BOM) сформовані CycloneDX и SPDXтобто готові специфікації про наявні залежності. Це файл 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/[email protected]</purl>
    </component>
      <!-- More components here -->
  </components>
</bom>

BOM може використовуватися не тільки як вхідні параметри для Dependency Track, але і для інвентаризації компонентів ПЗ у ланцюжку поставок, наприклад, для надання замовнику ПЗ. У 2014 році на розгляд у США було навіть запропоновано закон "Cyber ​​Supply Chain Management and Transparency Act of 2014", Який говорив, що при закупівлі ПЗ будь-яка держ. установа має вимагати BOM для запобігання використанню вразливих компонентів, проте в силу акт так і не набрав чинності.

Повертаючись до SCA, Dependency Track має готові інтеграції з Notification Platforms на кшталт Slack, системами управління вразливістю на кшталт Kenna Security. Варто також сказати, що Dependency Track також виявляє застарілі версії пакетів і надає інформацію про ліцензії (за рахунок підтримки SPDX).

Якщо говорити саме про якість SCA, тут є принципова різниця.

Dependency Track не приймає проект як вхідні дані, а приймає саме BOM. Це означає, що якщо ми захочемо перевірити проект, спочатку нам потрібно згенерувати bom.xml, наприклад, за допомогою CycloneDX. Таким чином, Dependency Track залежить від CycloneDX. У той же час це дає можливість кастомізації. Так команда OZON написала модуль CycloneDX для складання BOM-файлів для проектів на Golang з метою подальшого сканування через Dependency Track.

Nexus IQ - Комерційне рішення SCA від компанії Sonatype, яке є частиною екосистеми Sonatype, куди також входить Nexus Repository Manager. Nexus IQ може приймати як вхідні дані як war архіви (для java проектів) через веб-інтерфейс або API, так і BOM, якщо ваша організація не встигла перебудуватися з CycloneDX на нове рішення. На відміну від open source рішень, IQ звертається як до CP/PURL до виявленої компоненті і відповідної вразливості у базі даних, а й враховує власні дослідження, наприклад, назва вразливої ​​функції чи класу. Механізми IQ будуть розглянуті пізніше при розборі результатів.

Підіб'ємо деякі підсумки за функціональними особливостями, а також розглянемо підтримувані мови для аналізу:

Мова
Nexus IQ
Перевірка залежностей
Dependency Track

Java
+
+
+

C / C ++
+
+
-

C#
+
+
-

.Net
+
+
+

Ерланг
-
-
+

JavaScript (NodeJS)
+
+
+

PHP
+
+
+

Python
+
+
+

рубін
+
+
+

Perl
-
-
-

масштаб
+
+
+

Завдання C
+
+
-

Швидко
+
+
-

R
+
-
-

Go
+
+
+

Функціональні можливості

Функціональні можливості
Nexus IQ
Перевірка залежностей
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 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 до спеціально вразливого додатку DVJA.

Для цього скористаємося Dependency Check Maven Plugin:

mvn org.owasp:dependency-check-maven:check

В результаті директорії target з'явиться dependency-check-report.html.

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Відкриємо файл. Після зведеної інформації про загальну кількість вразливостей можемо побачити інформацію про вразливості з високим рівнем Severity та Confidence із зазначенням на пакет, CPE, число CVE.

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

DevSecOps: принципи роботи та порівняння SCA. Частина перша

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

DevSecOps: принципи роботи та порівняння SCA. Частина перша

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

Dependency Track

Встановлення

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

Перший запуск

Переходимо URL запущеного сервісу. Входимо через admin/admin, міняємо логін та пароль, після чого потрапляємо на Dashboard. Наступне, що ми зробимо - створимо проект для тестової програми на Java в Home/Projects → Create Project . Як приклад візьмемо DVJA.

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Так як Dependency Track може приймати як вхідні дані тільки BOM, цей BOM необхідно отримати. Скористаємося CycloneDX Maven Plugin:

mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom

Отримуємо bom.xml та завантажуємо файл у створеному проекті DVJA → Dependeencies → Upload BOM.

Зайдемо в Administration → Analyzers. Розуміємо, що у нас включено лише Internal Analyzer, що включає NVD. Підключимо також Sonatype OSS Index.

DevSecOps: принципи роботи та порівняння SCA. Частина перша

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

DevSecOps: принципи роботи та порівняння SCA. Частина перша

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

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Основне розчарування було в тому, що Dependency Track більше не приймає xml-звіти Dependency Check. Останні підтримувані версії інтеграції з Dependency Check були 1.0.0 - 4.0.2, в той час, як я тестував 5.3.2.

Ось відеоось), коли це було ще можливо.

Nexus IQ

Перший запуск

Установка Nexus IQ походить з архівів по документаціїАле ми для цих цілей зібрали собі образ Docker.

Після входу в консоль необхідно створити Організацію та Додаток.

DevSecOps: принципи роботи та порівняння SCA. Частина перша

DevSecOps: принципи роботи та порівняння SCA. Частина перша

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Як можна бачити, налаштування у випадку з IQ відбувається дещо складніше, бо нам також необхідно створити політики, які застосовуються для різних “стейджів” (dev, build, stage, release). Це необхідно, щоб блокувати вразливі компоненти в міру просування пайплайном ближче до проду, або блокувати як тільки вони потрапляють в Nexus Repo при завантаженні розробниками.

Щоб відчути різницю open source та enterprise, виконаємо таке ж сканування через Nexus IQ аналогічно через Плагін Maven, попередньо створивши тестовий додаток в інтерфейсі 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:

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Тут можна побачити всі порушення політики із зазначенням різного рівня значущості (від Info до Security Critical). Літера D поряд із компонентом означає, що компонента Direct Dependency, а літера T поряд із компонентом означає, що компонента Transitive Dependency, тобто є транзитивною.

До речі, звіт State of Open Source Security Report 2020 від Snyk повідомляє, що понад 70% уразливостей open source виявлених у Node.js, Java та Ruby перебувають у транзитивних залежностях.

Якщо відкрити одне з порушень політики Nexus IQ, ми можемо побачити опис компоненти, а також Version Graph, який показує місцезнаходження поточної версії на тимчасовому графі, а також у який момент уразливість перестає бути вразливою. Висота свічок на графі показує популярність використання цієї компоненти.

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Якщо перейти в розділ вразливостей та розкрити CVE, то можна прочитати опис до цієї вразливості, рекомендації щодо усунення, а також причину, з якої цей компонент потрапив під порушення, тобто наявність класу DiskFileitem.class.

DevSecOps: принципи роботи та порівняння SCA. Частина перша

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Підіб'ємо підсумки тільки що стосуються сторонніх компонентів 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 Track

Усього виявлено вразливостей
42
91
51

Невірно виявлено уразливостей (false positive)
2 (4.76%)
62 (68,13%)
29 (56.86%)

Не виявлено релевантних уразливостей (false negative)
10
20
27

Зведені результати за компонентами:

Параметр
Nexus IQ
Перевірка залежностей
Dependency Track

Усього виявлено компонентів
62
47
59

Усього вразливих компонентів
16
13
10

Невірно виявлені уразливі компоненти (false positive)
1
5
0

Невірно виявлені уразливі компоненти (false positive)
0
6
6

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

DevSecOps: принципи роботи та порівняння SCA. Частина перша

DevSecOps: принципи роботи та порівняння SCA. Частина перша

DevSecOps: принципи роботи та порівняння SCA. Частина перша

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

DevSecOps: принципи роботи та порівняння SCA. Частина перша
Джерело: www.sonatype.com/why-precision-matters-ebook

Розглянемо деякі 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

Опис CVE-2011-2894 з NVD:
DevSecOps: принципи роботи та порівняння SCA. Частина перша

Опис CVE-2016-1000027 з NVD:
DevSecOps: принципи роботи та порівняння SCA. Частина перша

CVE-2011-2894 сама собою досить відома. У звіті White Source за 2011 рік ця CVE була визнана однією з найпоширеніших. Описи для CVE-2016-100027 в принципі трохи в NVD, та й застосовна вона, як би, тільки для Spring Framework 4.1.4. Погляньмо на посилання і тут стає все більш менш зрозуміло. З статті Tenable ми розуміємо, що крім уразливості в RemoteInvocationSerializingExporter в CVE-2011-2894, вразливість спостерігається в HttpInvokerServiceExporter. Про це нам і каже Nexus IQ:

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Проте нічого подібного немає в 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
ПОМИЛКОВИЙ

Якщо ми вивчимо вразливість CVE-2016-4003, зрозуміємо, що її виправили ще у версії 2.3.28, проте Nexus IQ нам про неї повідомляє. В описі вразливості є примітка:

DevSecOps: принципи роботи та порівняння SCA. Частина перша

Тобто вразливість існує тільки у зв'язці із застарілою версією JRE, про що нас вирішили попередити. Тим не менш, вважаємо це False Positive, хоч і не найстрашнішим.

№ 3

Компонент
уразливість
Результат

xwork-core:2.3.30
CVE-2017-9804
ІСТИНА

xwork-core:2.3.30
CVE-2017-7672
ПОМИЛКОВИЙ

Якщо ми подивимося опис до 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
ІСТИНА

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: У програмі Sonatype Security Research team визнається, що ця vulnerability була встановлена ​​в версії 3.0.2.

Після цього слід 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 до 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 віднесли до 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. Відповідно до звіту The State of Open Source Security Vulnerabilities 2020 про 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 Track
Результат

dom4j: 1.6.1
Високий
Високий
Високий
ІСТИНА

log4j-core: 2.3
Високий
Високий
Високий
ІСТИНА

log4j: 1.2.14
Високий
Високий
-
ІСТИНА

commons-collections:3.1
Високий
Високий
Високий
ІСТИНА

commons-fileupload:1.3.2
Високий
Високий
Високий
ІСТИНА

commons-beanutils:1.7.0
Високий
Високий
Високий
ІСТИНА

commons-codec:1:10
Medium
-
-
ІСТИНА

mysql-connector-java:5.1.42
Високий
Високий
Високий
ІСТИНА

spring-expression:3.0.5
Високий
компонент не знайдено

ІСТИНА

spring-web:3.0.5
Високий
компонент не знайдено
Високий
ІСТИНА

spring-context:3.0.5
Medium
компонент не знайдено
-
ІСТИНА

spring-core:3.0.5
Medium
Високий
Високий
ІСТИНА

struts2-config-browser-plugin:2.3.30
Medium
-
-
ІСТИНА

spring-tx:3.0.5
-
Високий
-
ПОМИЛКОВИЙ

struts-core:1.3.8
Високий
Високий
Високий
ІСТИНА

xwork-core: 2.3.30
Високий
-
-
ІСТИНА

struts2-core: 2.3.30
Високий
Високий
Високий
ІСТИНА

struts-taglib:1.3.8
-
Високий
-
ПОМИЛКОВИЙ

struts-tiles-1.3.8
-
Високий
-
ПОМИЛКОВИЙ

Додаток Б. Результати стосовно вразливостей
Умовні позначення:

  • High - вразливість високого та критичного рівня в компоненті
  • Medium - Вразливість середнього рівня критичності в компоненті
  • TRUE - Правильно визначена вразливість (True positive issue)
  • FALSE - Хибне спрацьовування (False positive issue)

Компонент
Nexus IQ
Перевірка залежностей
Dependency Track
Строгість
Результат
Коментар

dom4j: 1.6.1
CVE-2018-1000632
CVE-2018-1000632
CVE-2018-1000632
Високий
ІСТИНА

CVE-2020-10683
CVE-2020-10683
CVE-2020-10683
Високий
ІСТИНА

log4j-core: 2.3
CVE-2017-5645
CVE-2017-5645
CVE-2017-5645
Високий
ІСТИНА

CVE-2020-9488
CVE-2020-9488
CVE-2020-9488
низький
ІСТИНА

log4j: 1.2.14
CVE-2019-17571
CVE-2019-17571
-
Високий
ІСТИНА

-
CVE-2020-9488
-
низький
ІСТИНА

SONATYPE-2010-0053
-
-
Високий
ІСТИНА

commons-collections:3.1
-
CVE-2015-6420
CVE-2015-6420
Високий
ПОМИЛКОВИЙ
Дублює RCE(OSSINDEX)

-
CVE-2017-15708
CVE-2017-15708
Високий
ПОМИЛКОВИЙ
Дублює RCE(OSSINDEX)

SONATYPE-2015-0002
RCE (OSSINDEX)
RCE(OSSINDEX)
Високий
ІСТИНА

commons-fileupload:1.3.2
CVE-2016-1000031
CVE-2016-1000031
CVE-2016-1000031
Високий
ІСТИНА

SONATYPE-2014-0173
-
-
Medium
ІСТИНА

commons-beanutils:1.7.0
CVE-2014-0114
CVE-2014-0114
CVE-2014-0114
Високий
ІСТИНА

-
CVE-2019-10086
CVE-2019-10086
Високий
ПОМИЛКОВИЙ
Вразливість застосовується лише для версій 1.9.2+

commons-codec:1:10
SONATYPE-2012-0050
-
-
Medium
ІСТИНА

mysql-connector-java:5.1.42
CVE-2018-3258
CVE-2018-3258
CVE-2018-3258
Високий
ІСТИНА

CVE-2019-2692
CVE-2019-2692
-
Medium
ІСТИНА

-
CVE-2020-2875
-
Medium
ПОМИЛКОВИЙ
Та сама вразливість як і CVE-2019-2692, але з припискою «attacks may significantly impact additional products»

-
CVE-2017-15945
-
Високий
ПОМИЛКОВИЙ
Не відноситься до mysql-connector-java

-
CVE-2020-2933
-
низький
ПОМИЛКОВИЙ
Публікат до CVE-2020-2934

CVE-2020-2934
CVE-2020-2934
-
Medium
ІСТИНА

spring-expression:3.0.5
CVE-2018-1270
компонент не знайдено
-
Високий
ІСТИНА

CVE-2018-1257
-
-
Medium
ІСТИНА

spring-web:3.0.5
CVE-2016-1000027
компонент не знайдено
-
Високий
ІСТИНА

CVE-2014-0225
-
CVE-2014-0225
Високий
ІСТИНА

CVE-2011-2730
-
-
Високий
ІСТИНА

-
-
CVE-2013-4152
Medium
ІСТИНА

CVE-2018-1272
-
-
Високий
ІСТИНА

CVE-2020-5398
-
-
Високий
ІСТИНА
Показовий приклад на користь IQ: "The Sonatype security research team discovered that this vulnerability was introduced in version 3.0.2.RELEASE and no 5.0.x as stated in the advisory."

CVE-2013-6429
-
-
Medium
ІСТИНА

CVE-2014-0054
-
CVE-2014-0054
Medium
ІСТИНА

CVE-2013-6430
-
-
Medium
ІСТИНА

spring-context:3.0.5
CVE-2011-2894
компонент не знайдено
-
Medium
ІСТИНА

spring-core:3.0.5
-
CVE-2011-2730
CVE-2011-2730
Високий
ІСТИНА

CVE-2011-2894
CVE-2011-2894
CVE-2011-2894
Medium
ІСТИНА

-
-
CVE-2013-4152
Medium
ПОМИЛКОВИЙ
Дублікат цієї ж уразливості у spring-web

-
CVE-2013-4152
-
Medium
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web

-
CVE-2013-6429
CVE-2013-6429
Medium
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web

-
CVE-2013-6430
-
Medium
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web

-
CVE-2013-7315
CVE-2013-7315
Medium
ПОМИЛКОВИЙ
SPLIT із CVE-2013-4152. + Вразливість відноситься до компоненту spring-web

-
CVE-2014-0054
CVE-2014-0054
Medium
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web

-
CVE-2014-0225
-
Високий
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web

-
-
CVE-2014-0225
Високий
ПОМИЛКОВИЙ
Дублікат цієї ж уразливості у spring-web

-
CVE-2014-1904
CVE-2014-1904
Medium
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web-mvc

-
CVE-2014-3625
CVE-2014-3625
Medium
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web-mvc

-
CVE-2016-9878
CVE-2016-9878
Високий
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web-mvc

-
CVE-2018-1270
CVE-2018-1270
Високий
ПОМИЛКОВИЙ
Для spring-expression / spring-messages

-
CVE-2018-1271
CVE-2018-1271
Medium
ПОМИЛКОВИЙ
Вразливість відноситься до компоненту spring-web-mvc

-
CVE-2018-1272
CVE-2018-1272
Високий
ІСТИНА

CVE-2014-3578
CVE-2014-3578 (OSSINDEX)
CVE-2014-3578
Medium
ІСТИНА

SONATYPE-2015-0327
-
-
низький
ІСТИНА

struts2-config-browser-plugin:2.3.30
SONATYPE-2016-0104
-
-
Medium
ІСТИНА

spring-tx:3.0.5
-
CVE-2011-2730
-
Високий
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2011-2894
-
Високий
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2013-4152
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2013-6429
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2013-6430
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2013-7315
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2014-0054
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2014-0225
-
Високий
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2014-1904
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2014-3625
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2016-9878
-
Високий
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2018-1270
-
Високий
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2018-1271
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

-
CVE-2018-1272
-
Medium
ПОМИЛКОВИЙ
Вразливість не відноситься до spring-tx

struts-core:1.3.8
-
CVE-2011-5057 (OSSINDEX)

Medium
FASLE
Вразливість до Struts 2

-
CVE-2012-0391 (OSSINDEX)
CVE-2012-0391
Високий
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2014-0094 (OSSINDEX)
CVE-2014-0094
Medium
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2014-0113 (OSSINDEX)
CVE-2014-0113
Високий
ПОМИЛКОВИЙ
Вразливість до Struts 2

CVE-2016-1182
3VE-2016-1182
-
Високий
ІСТИНА

-
-
CVE-2011-5057
Medium
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2012-0392 (OSSINDEX)
CVE-2012-0392
Високий
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2012-0393 (OSSINDEX)
CVE-2012-0393
Medium
ПОМИЛКОВИЙ
Вразливість до Struts 2

CVE-2015-0899
CVE-2015-0899
-
Високий
ІСТИНА

-
CVE-2012-0394
CVE-2012-0394
Medium
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2012-0838 (OSSINDEX)
CVE-2012-0838
Високий
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2013-1965 (OSSINDEX)
CVE-2013-1965
Високий
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2013-1966 (OSSINDEX)
CVE-2013-1966
Високий
FASLE
Вразливість до Struts 2

-
CVE-2013-2115
CVE-2013-2115
Високий
FASLE
Вразливість до Struts 2

-
CVE-2013-2134 (OSSINDEX)
CVE-2013-2134
Високий
FASLE
Вразливість до Struts 2

-
CVE-2013-2135 (OSSINDEX)
CVE-2013-2135
Високий
FASLE
Вразливість до Struts 2

CVE-2014-0114
CVE-2014-0114
-
Високий
ІСТИНА

-
CVE-2015-2992
CVE-2015-2992
Medium
ПОМИЛКОВИЙ
Вразливість до Struts 2

-
CVE-2016-0785 (OSSINDEX)
CVE-2016-0785
Високий
ПОМИЛКОВИЙ
Вразливість до Struts 2

CVE-2016-1181
CVE-2016-1181
-
Високий
ІСТИНА

-
CVE-2016-4003 (OSSINDEX)
CVE-2016-4003
Високий
ПОМИЛКОВИЙ
Вразливість до Struts 2

xwork-core:2.3.30
CVE-2017-9804
-
-
Високий
ІСТИНА

SONATYPE-2017-0173
-
-
Високий
ІСТИНА

CVE-2017-7672
-
-
Високий
ПОМИЛКОВИЙ
Дубль до CVE-2017-9804

SONATYPE-2016-0127
-
-
Високий
ІСТИНА

struts2-core:2.3.30
-
CVE-2016-6795
CVE-2016-6795
Високий
ІСТИНА

-
CVE-2017-9787
CVE-2017-9787
Високий
ІСТИНА

-
CVE-2017-9791
CVE-2017-9791
Високий
ІСТИНА

-
CVE-2017-9793
-
Високий
ПОМИЛКОВИЙ
Публікат до CVE-2018-1327

-
CVE-2017-9804
-
Високий
ІСТИНА

-
CVE-2017-9805
CVE-2017-9805
Високий
ІСТИНА

CVE-2016-4003
-
-
Medium
ПОМИЛКОВИЙ
Застосовується до Apache Struts 2.x до 2.3.28, а це версія 2.3.30. Тим не менш, виходячи з опису, CVE діє за будь-яких версій Struts 2, якщо використовується JRE 1.7 і менше. Мабуть, нас тут вирішили перестрахувати, але більше схоже на FALSE.

-
CVE-2018-1327
CVE-2018-1327
Високий
ІСТИНА

CVE-2017-5638
CVE-2017-5638
CVE-2017-5638
Високий
ІСТИНА
Та сама вразливість, якою скористалися зловмисники в Equifax у 2017 році

CVE-2017-12611
CVE-2017-12611
-
Високий
ІСТИНА

CVE-2018-11776
CVE-2018-11776
CVE-2018-11776
Високий
ІСТИНА

struts-taglib:1.3.8
-
CVE-2012-0394
-
Medium
ПОМИЛКОВИЙ
Для struts2-core

-
CVE-2013-2115
-
Високий
ПОМИЛКОВИЙ
Для struts2-core

-
CVE-2014-0114
-
Високий
ПОМИЛКОВИЙ
Для commons-beanutils

-
CVE-2015-0899
-
Високий
ПОМИЛКОВИЙ
Не відноситься до taglib

-
CVE-2015-2992
-
Medium
ПОМИЛКОВИЙ
Належить до struts2-core

-
CVE-2016-1181
-
Високий
ПОМИЛКОВИЙ
Не відноситься до taglib

-
CVE-2016-1182
-
Високий
ПОМИЛКОВИЙ
Не відноситься до taglib

struts-tiles-1.3.8
-
CVE-2012-0394
-
Medium
ПОМИЛКОВИЙ
Для struts2-core

-
CVE-2013-2115
-
Високий
ПОМИЛКОВИЙ
Для struts2-core

-
CVE-2014-0114
-
Високий
ПОМИЛКОВИЙ
Під commons-beanutils

-
CVE-2015-0899
-
Високий
ПОМИЛКОВИЙ
Не відноситься до tiles

-
CVE-2015-2992
-
Medium
ПОМИЛКОВИЙ
Для struts2-core

-
CVE-2016-1181
-
Високий
ПОМИЛКОВИЙ
Не відноситься до taglib

-
CVE-2016-1182
-
Високий
ПОМИЛКОВИЙ
Не відноситься до taglib

Джерело: habr.com

Додати коментар або відгук