Dôležitosť analýzy tretích komponentov softvéru (angl. Software Composition Analysis — SCA) v procese vývoja rastie s každoročnými správami o zraniteľnostiach open source knižníc, ktoré berú na seba spoločnosti Synopsys, Sonatype, Snyk, White Source. Podľa správy počet zistených zraniteľností v open source v roku 2019 vzrástol takmer o 1,5-krát v porovnaní s predchádzajúcim rokom, pričom komponenty s otvoreným kódom sú používané v 60 % až 80 % projektov. Ak sa obrátime na nezávislý názor, procesy SCA sú samostatnou praxou OWASP SAMM a BSIMM ako ukazovateľ zrelosti, pričom v prvej polovici roku 2020 OWASP vydala nový štandard OWASP Software Component Verification Standard (SCVS), ktorý poskytuje najlepšie praktiky na overenie tretích komponentov v dodávateľskom reťazci softvéru.

Jeden z najvýznamnejších prípadov s spoločnosťou Equifax v máji 2017. Neznámi útočníci získali informácie o 143 miliónoch Američanov, vrátane celých mien, adries, čísel sociálneho zabezpečenia a vodičských preukazov. V 209 000 prípadoch sa v dokumentoch nachádzali aj údaje o bankových kartách obetí. Tento únik dát sa stal v dôsledku zneužitia kritickej zraniteľnosti v Apache Struts 2 (CVE-2017-5638), pričom oprava bola vydaná už v marci 2017. Spoločnosť mala dva mesiace na nainštalovanie aktualizácie, avšak nikto sa o to nepostaral.
V tomto článku sa bude diskutovať o otázke výberu nástroja na vykonávanie SCA z hľadiska kvality výsledkov analýzy. Taktiež bude uvedené funkčné porovnanie nástrojov. Proces integrácie do CI/CD a možnosti integrácie ponecháme na nasledujúce publikácie. Široký zoznam nástrojov bol predstavený OWASP , ale v rámci tohto prehľadu budeme hovoriť len o najpopulárnejšom open source nástroji Dependency Check, o trochu menej známej open source platforme Dependency Track a Enterprise riešení Sonatype Nexus IQ. Taktiež preskúmame, ako tieto riešenia fungujú a porovnáme získané výsledky z hľadiska falošných poplachov.

Princíp fungovania
— je nástroj (CLI, maven, jenkins modul, ant), ktorý analyzuje súbory projektu, zbiera fragmenty informácií o závislostiach (názov balíka, groupid, názov špecifikácie, verzia…) a vytvára reťazec CPE — (Common Platform Enumeration), Package URL (PURL) a odhaľuje zraniteľnosti pre CPE/PURL z databáz (NVD, Sonatype OSS Index, NPM Audit API…), po čom vytvára jednorazovú správu vo formáte HTML, JSON, XML…
Pozrime sa, ako vyzerá CPE:
cpe:2.3:part:vendor:product:version:update:edition:language:sw_edition:target_sw:target_hw:other- Časť: Uvedenie, že komponent patrí k aplikácii (a), operačnému systému (o), hardvéru (h) (Povinný bod)
- Predajca: Názov výrobcu produktu (Povinný bod)
- Produkt: Názov produktu (Povinný bod)
- Verzia: Verzia komponentu (Zastaraný bod)
- Aktualizácia: Aktualizácia balíka
- Edícia: Dedičná verzia (Zastaraný bod)
- Jazyk: Jazyk definovaný v RFC-5646
- SW Edícia: Verzia softvéru
- Cieľový SW: Softvérové prostredie, v ktorom produkt funguje
- Cieľový HW: Hardvérové prostredie, v ktorom produkt funguje
- Iné: Informácie o dodávateľovi alebo produkte
Príklad CPE vyzerá nasledovne:
cpe:2.3:a:pivotal_software:spring_framework:3.0.0:*:*:*:*:*:*:* Reťazec znamená, že CPE verzia 2.3 popisuje komponentu aplikácie od výrobcu pivotal_software s názvom spring_framework verzie 3.0.0. Ak otvoríme zraniteľnosť v NVD, tak môžeme vidieť zmienku o tejto CPE. Prvý problém, na ktorý si hneď treba dávať pozor — CVE v NVD, podľa CPE, hlási problém vo frameworku, nie v konkrétnom komponente. To znamená, že ak sú vývojári silne viazaní na framework a zistená zraniteľnosť sa netýka tých modulov, ktoré používajú vývojári, bezpečnostný expert sa tak či onak bude musieť zaoberať touto CVE a zamyslieť sa nad aktualizáciou.
URL adresa sa tiež používa nástrojmi SCA. Formát URL adresy balíka je nasledovný:
scheme:type/namespace/name@version?qualifiers#subpath- Sсheme: Vždy bude ‘pkg’, čo naznačuje, že je to URL adresa balíka (Povinný bod)
- Typ: „Typ“ balíka alebo „protokol“ balíka, napríklad maven, npm, nuget, gem, pypi atď. (Povinný bod)
- Namespace: Nejaký prefix názvu, ako je identifikátor skupiny Maven, vlastník obrazu Docker, užívateľ alebo organizácia GitHub. Nepovinné a závisí od typu.
- Názov: Názov balíka (Povinný bod)
- Verzia: Verzia balíka
- Qualifiers: Dodatočné kvalifikačné údaje pre balík, ako sú operačný systém, architektúra, distribúcia atď. Nepovinné a závisiace od typu položky.
- Subcesta: Dodatočná cesta v balíku vo vzťahu k koreňu balíka
Napríklad:
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 webová platforma, ktorá prijíma hotové Bill of Materials (BOM) vytvorené a , teda hotové špecifikácie o existujúcich závislostiach. Ide o XML súbor s popisom závislostí — názov, hash, adresa balíka, vydavateľ, licencia. Následne Dependency Track analyzuje BOM, preveruje existujúce CVE identifikované závislostiam z databázy zraniteľností (NVD, Sonatype OSS Index …), po čom vytvára grafy, počíta metriky a pravidelne aktualizuje údaje o stave zraniteľností komponentov.
Príklad toho, ako môže vyzerať BOM vo formáte XML:
Apache
org.apache.tomcat
tomcat-catalina
9.0.14
3942447fac867ae5cdb3229b658f4d48
e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a
f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b
e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282
Apache-2.0
pkg:maven/org.apache.tomcat/tomcat-catalina@9.0.14
BOM sa môže používať nielen ako vstupné parametre pre Dependency Track, ale aj na inventarizáciu softvérových komponentov v dodávateľskom reťazci, napríklad na poskytnutie zákazníkovi softvéru. V roku 2014 bol v USA dokonca navrhnutý zákon , ktorý stanovoval, že pri nákupe softvéru by všetky štátne inštitúcie mali požadovať BOM na prevenciu použitia zraniteľných komponentov, avšak zákon tak nikdy nevstúpil do platnosti.
Keď sa vrátim k SCA, Dependency Track má hotové integrácie s platformami pre notifikácie ako Slack, systémami na správu zraniteľností ako Kenna Security. Je tiež potrebné spomenúť, že Dependency Track navyše identifikuje zastarané verzie balíkov a poskytuje informácie o licenciách (vďaka podpore SPDX).
Ak hovoríme presne o kvalite SCA, existuje tu zásadný rozdiel.
Dependency Track neprijíma projekt ako vstupné údaje, ale prijíma práve BOM. To znamená, že ak chceme overiť projekt, najprv musíme vygenerovať bom.xml, napríklad pomocou CycloneDX. Tým pádom Dependency Track priamo závisí od CycloneDX. Zároveň to poskytuje možnosť prispôsobenia. Tak tím OZON napísal na zostavenie BOM súborov pre projekty v Golangu s cieľom ďalšieho skenovania cez Dependency Track.
je komerčné riešenie SCA od spoločnosti Sonatype, ktoré je součástou ekosystému Sonatype, kam patrí aj Nexus Repository Manager. Nexus IQ môže prijímať ako vstupné dáta war archívy (pre java projekty) cez webové rozhranie alebo API, tak aj BOM, ak vaša organizácia nestihla prestaviť z CycloneDX na nové riešenie. Na rozdiel od open source riešení, IQ sa odvoláva nielen na CP/PURL k identifikovanej komponente a zodpovedajúcej zraniteľnosti v databáze, ale zohľadňuje aj vlastné výskumy, napríklad názov zraniteľnej funkcie alebo triedy. Mechanizmy IQ budú podrobne preskúmané neskôr pri analýze výsledkov.
Zhrnieme niektoré výsledky týkajúce sa funkčných vlastností a posúdime podporované jazyky na analýzu:
Jazyk
Nexus IQ
Dependency Check
Dependency Track
Java
+
+
+
C/C++
+
+
—
C#
+
+
—
.Net
+
+
+
Erlang
—
—
+
JavaScript (NodeJS)
+
+
+
PHP
+
+
+
Python
+
+
+
Ruby
+
+
+
Perl
—
—
—
Scala
+
+
+
Objective C
+
+
—
Swift
+
+
—
R
+
—
—
Go
+
+
+
Funkčné možnosti
Funkčné možnosti
Nexus IQ
Dependency Check
Dependency Track
Možnosť zabezpečiť kontrolu komponentov použitých v zdrojovom kóde na licenčnú čistotu
+
—
+
Možnosť skenovania a analýzy na prítomnosť zraniteľností a licenčnej čistoty pre Docker obrazy
+ Integrácia s Clair
—
—
Možnosť nastaviť bezpečnostnú politiku pre používanie knižníc s otvoreným zdrojom
+
—
—
Možnosť skenovania repozitárov s otvoreným zdrojom na prítomnosť zraniteľných komponentov
+ RubyGems, Maven, NPM, Nuget, Pypi, Conan, Bower, Conda, Go, p2, R, Yum, Helm, Docker, CocoaPods, Git LFS
—
+ Hex, RubyGems, Maven, NPM, Nuget, Pypi
Existencia špecializovanej výskumnej skupiny
+
—
—
Práca v uzavretom obvode
+
+
+
Použitie externých databáz
+ Uzavretá databáza Sonatype
+ Sonatype OSS, NPM Public Advisors
+ Sonatype OSS, NPM Public Advisors, RetireJS, VulnDB, podpora vlastnej databázy zraniteľností
Možnosť filtrovať komponenty s otvoreným zdrojom pri pokuse o nahranie do vývojového obvodu podľa nakonfigurovaných politík
+
—
—
Odporúčania na opravu zraniteľností, prítomnosť odkazov na opravy
+
+- (závisí od popisu v verejných databázach)
+- (závisí od popisu v verejných databázach)
Hodnotenie zistených zraniteľností podľa závažnosti
+
+
+
Rolová model prístupu
+
—
+
Podpora rozhrania príkazového riadku CLI
+
+
+- (iba pre CycloneDX)
Výber / triedenie zraniteľností podľa stanovených kritérií
+
—
+
Dashboard stavu aplikácií
+
—
+
Generovanie reportov vo formáte PDF
+
—
—
Generovanie reportov vo formáte JSONCSV
+
+
—
Podpora slovenčiny
—
—
—
Integrácie
Integrácia
Nexus IQ
Dependency Check
Dependency Track
Integrácia s LDAP/Active Directory
+
—
+
Integrácia s kontinuálnou integračnou systémom (continuous integration) Bamboo
+
—
—
Integrácia s kontinuálnou integračnou systémom (continuous integration) TeamCity
+
—
—
Integrácia s kontinuálnou integračnou systémom (continuous integration) GitLab
+
+- (vo forme pluginu pre GitLab)
+
Integrácia s kontinuálnou integračnou systémom (continuous integration) Jenkins
+
+
+
Prítomnosť pluginov pre IDE
+ IntelliJ, Eclipse, Visual Studio
—
—
Podpora prispôsobenej integrácie prostredníctvom webových služieb (API) nástroja
+
—
+
Dependency Check
Prvý beh
Spustíme Dependency Check na úmyselne zraniteľnej aplikácii .
Na to využijeme :
mvn org.owasp:dependency-check-maven:checkV dôsledku toho sa v adresári target objaví dependency-check-report.html.

Otvoríme súbor. Po súhrnnej informácii o celkovom počte zraniteľností môžeme vidieť informácie o zraniteľnostiach s vysokou úrovňou závažnosti a dôveryhodnosti, vrátane označenia balíka, CPE a počtu CVE.
Nasleduje podrobnejšie informácie, konkrétne to, na základe čoho bolo prijaté rozhodnutie (evidence), teda istý BOM.

Ďalej nasleduje CPE, PURL a popis CVE. Odporúčania na opravu nie sú priložené, pretože chýbajú v databáze NVD.

Na systematické prezeranie výsledkov skenovania je možné nastaviť Nginx s minimálnymi nastaveniami, alebo posielať získané defekty do systému riadenia defektov, ktoré podporujú konektory k Dependency Check. Napríklad Defect Dojo.
Dependency Track
Inštalácia
Dependency Track, na druhej strane, je webová platforma s grafmi, a preto tu neexistuje problém s ukladaním defektov do externého riešenia.
Pre inštaláciu sú podporované nasledujúce scenáre: Docker, WAR, Executable WAR.
Prvý beh
Prejdeme na URL spusteného servisu. Prihlásime sa cez admin/admin, zmeníme prihlasovacie údaje a dostaneme sa na Dashboard. Ďalšie, čo urobíme — vytvoríme projekt pre testovaciu aplikáciu v Jave v Home/Projects → Vytvoriť projekt . Ako príklad vezmeme DVJA.

Keďže Dependency Track môže prijímať ako vstup iba BOM, je potrebné tento BOM získať. Využijeme :
mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBomZískame bom.xml a nahráme súbor v vytvorenom projekte DVJA → Závislosti → Nahrať BOM.
Prejdeme do sekcie Administrácia → Analýzy. Rozumieme, že máme zapnutý iba Interný analyzátor, ktorý zahŕňa NVD. Pripojíme aj Sonatype OSS Index.

Takto získame nasledujúci prehľad pre náš projekt:

V zozname môžeme nájsť jednu zraniteľnosť, ktorá sa uplatňuje na Sonatype OSS:

Hlavné sklamanie bolo v tom, že Dependency Track už neprijíma xml správy Dependency Check. Posledné podporované verzie integrácie s Dependency Check boli 1.0.0 – 4.0.2, zatiaľ čo ja som testoval 5.3.2.
Tu sú (a ), keď to ešte bolo možné.
Nexus IQ
Prvý beh
Inštalácia Nexus IQ prebieha z archívov , ale my sme pre tieto účely zostavili obraz Docker.
Po prihlásení do konzoly je potrebné vytvoriť Organizáciu a Aplikáciu.



Ako vidíte, nastavenie v prípade IQ je o niečo komplikovanejšie, pretože musíme tiež vytvoriť politiky aplikovateľné na rôzne „štádiá“ (dev, build, stage, release). To je potrebné na blokovanie zraniteľných komponentov, keď sa posúvame po pipeline bližšie k produ, alebo ich zablokovanie hneď, keď sa dostanú do Nexus Repo pri sťahovaní vývojármi.
Aby sme pocítili rozdiel medzi open source a enterprise, vykonáme rovnaké skenovanie cez Nexus IQ podobne cez , predtým vytvorením testovacej aplikácie v rozhraní 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=
Prejdeme na URL k vygenerovanej správe v webovom rozhraní IQ:

Tu môžete vidieť všetky porušenia politiky s uvedením rôznej úrovne závažnosti (od Info po Security Critical). Písmeno D vedľa komponentu znamená, že komponent je Priama závislosť, a písmeno T vedľa komponentu znamená, že komponent je Transitívna závislosť.
Mimochodom, správa od Snyk uvádza, že viac ako 70% zraniteľností open source zistených v Node.js, Java a Ruby sa nachádza v transitívnych závislostiach.
Ak otvoríme jedno z porušení politiky Nexus IQ, môžeme vidieť popis komponentu, ako aj Version Graph, ktorý ukazuje umiestnenie aktuálnej verzie na časovej osi, a tiež v akom momente prestáva byť zraniteľnosť zraniteľnou. Výška stĺpcov na grafe ukazuje popularitu využívania tejto komponenty.

Ak prejdeme do sekcie zraniteľností a rozbalíme CVE, môžeme si prečítať popis tejto zraniteľnosti, odporúčania na opravu, ako aj dôvod, prečo sa táto komponenta dostala pod porušenie, teda prítomnosť triedy DiskFileitem.class.


Zhrnieme len tie, ktoré sa týkajú externých komponentov Java, bez komponentov js. V zátvorkách uvedieme počet zraniteľností, ktoré boli nájdené mimo NVD.
Celkovo Nexus IQ:
- Naskenované závislosti: 62
- Zraniteľné závislosti: 16
- Nájdené zraniteľnosti: 42 (8 sonatype db)
Celkovo Dependency Check:
- Naskenované závislosti: 47
- Zraniteľné závislosti: 13
- Nájdené zraniteľnosti: 91 (14 sonatype oss)
Celkovo Dependency Track:
- Naskenované závislosti: 59
- Zraniteľné závislosti: 10
- Nájdené zraniteľnosti: 51 (1 sonatype oss)
Ďalším krokom analyzujeme získané výsledky a zistíme, čo z týchto zraniteľností je skutočnou chybou a čo je falošný poplach.
Zrieknutie sa zodpovednosti
Toto hodnotenie nie je nepopierateľnou pravdou. Pred autorom nebolo cieľom vyzdvihnúť konkrétny nástroj na pozadí ostatných. Zmyslom hodnotenia bolo ukázať mechanizmy fungovania nástrojov SCA a spôsoby overovania ich výsledkov.
Porovnanie výsledkov
Podmienky:
Falošným poplachom vo vzťahu k zraniteľnostiam externých komponentov je:
- Nesúlad CVE s identifikovanou komponentou
- Napríklad, ak je zraniteľnosť identifikovaná vo frameworku struts2, a nástroj označuje komponentu frameworku struts-tiles, na ktorú sa táto zraniteľnosť nevzťahuje, ide o falošný poplach.
- Nesúlad CVE s identifikovanou verziou komponenty
- Napríklad, zraniteľnosť sa viaže na verziu python > 3.5 a nástroj označí za zraniteľnú verziu 2.7 — to je falošný poplach, pretože zraniteľnosť sa v skutočnosti vzťahuje iba na vetvu produktu 3.x.
- Kopírovanie CVE
- Napríklad, ak SCA identifikoval CVE, ktorý umožňuje realizovať RCE, a potom SCA označuje pre tú istú komponentu CVE vzťahujúcu sa na produkty Cisco, ktoré sú náchylné na túto RCE. V takom prípade bude falošný poplach.
- Napríklad, CVE bola nájdená v komponente spring-web, po čom SCA označuje tú istú CVE v iných komponentoch rámca Spring Framework, zatiaľ čo CVE nemá vzťah k iným komponentom. V takom prípade bude výsledok false positive.
Prieskum sa sústreďuje na projekt Open Source DVJA. V prieskume sa zúčastnili iba java komponenty (bez js).
Zhrnuté výsledky
Prejdeme rovno k výsledkom manuálneho prehľadu odhalených zraniteľností. S úplnou správou pre každú CVE sa môžete oboznámiť v Prílohe.
Zhrnuté výsledky pre všetky zraniteľnosti:
Parameter
Nexus IQ
Dependency Check
Dependency Track
Celkovo bolo odhalených zraniteľností
42
91
51
Nesprávne odhalené zraniteľnosti (false positive)
2(4.76%)
62(68,13%)
29(56.86%)
Neboli nájdené relevantné zraniteľnosti (false negative)
10
20
27
Zhrnuté výsledky podľa komponentov:
Parameter
Nexus IQ
Dependency Check
Dependency Track
Celkovo bolo odhalených komponentov
62
47
59
Celkovo zraniteľných komponentov
16
13
10
Nesprávne odhalené zraniteľné komponenty (false positive)
1
5
0
Nesprávne odhalené zraniteľné komponenty (false positive)
0
6
6
Vybudujeme vizuálne grafy, aby sme zhodnotili pomer false positive a false negative k celkovému počtu zraniteľností. Na horizontálnej osi sú komponenty a na vertikálnej osi odhalené zraniteľnosti.



Na porovnanie, podobný prieskum bol vykonaný tímom Sonatype na teste projektu z 1531 komponentov pomocou OWASP Dependency Check. Ako vidíme, pomer hluku k správnym spúšťaniam je porovnateľný s našimi výsledkami.

Zdroj:
Pozrime sa na niektoré CVE z výsledkov nášho skenovania, aby sme pochopili príčiny takýchto výsledkov.
Viac informácií
Č. 1
Najprv si rozoberieme niektoré zaujímavé aspekty Sonatype Nexus IQ.
Nexus IQ poukazuje na problém s deserializáciou s možnosťou vykonania RCE v Spring Framework viackrát. CVE-2016-1000027 v spring-web:3.0.5 po prvýkrát a CVE-2011-2894 v spring-context:3.0.5 a spring-core:3.0.5. Na prvý pohľad to vyzerá, ako keby došlo k duplicite zraniteľnosti podľa viacerých CVE. Pretože ak sa pozrieme na CVE-2016-1000027 a CVE-2011-2894 v databáze NVD, vyzerá to, že je to jasné.
Komponent
Zraniteľnosť
spring-web:3.0.5
CVE-2016-1000027
spring-context:3.0.5
CVE-2011-2894
spring-core:3.0.5
CVE-2011-2894
Popis z NVD:

Popis z NVD:

CVE-2011-2894 sama o sebe je dosť známa. V správe táto CVE bola uznaná ako jedna z najčastejšie sa vyskytujúcich. Opis pre CVE-2016-100027 je v NVD v zásade obmedzený, a aj tak sa zdá, že je aplikovateľný iba pre Spring Framework 4.1.4. Pozrime sa na a tu sa to stáva viac-menej jasným. Z rozumieme, že okrem zraniteľnosti vo RemoteInvocationSerializingExporter v CVE-2011-2894, zraniteľnosť sa pozoruje v HttpInvokerServiceExporter. O tom nás informuje Nexus IQ:

Avšak v NVD nie je nič podobné, čo spôsobuje, že Dependency Check a Dependency Track dostávajú falošne negatívne výsledky.
Z opisu CVE-2011-2894 môžeme tiež usúdiť, že zraniteľnosť skutočne existuje aj v spring-context:3.0.5 a spring-core:3.0.5. Potvrdenie toho môžeme nájsť v článku od toho, kto túto zraniteľnosť objavil.
Č. 2
Komponent
Zraniteľnosť
Výsledok
struts2-core:2.3.30
CVE-2016-4003
FALSE
Ak sa pozrieme na zraniteľnosť CVE-2016-4003, pochopíme, že bola opravená už vo verzii 2.3.28, napriek tomu nám Nexus IQ o nej informuje. V opise zraniteľnosti je poznámka:

To znamená, že zraniteľnosť existuje len v kombinácii so zastaranou verziou JRE, čo nám chcú povedať. Napriek tomu to považujeme za falošný pozitív, aj keď nie za najhorší.
Č. 3
Komponent
Zraniteľnosť
Výsledok
xwork-core:2.3.30
CVE-2017-9804
TRUE
xwork-core:2.3.30
CVE-2017-7672
FALSE
Ak sa pozrieme na opis CVE-2017-9804 a CVE-2017-7672, pochopíme, že problém spočíva v URLValidator class, pričom CVE-2017-9804 vyplýva z CVE-2017-7672. Existencia druhej zraniteľnosti neprináša žiadnu užitočnú hodnotu okrem toho, že jej závažnosť vzrástla na vysokú, takže to môžeme považovať za nadbytočný šum.
Vo všeobecnosti neboli pre Nexus IQ nájdené ďalšie falošné pozitívy.
Č. 4
Existuje niekoľko aspektov, ktoré vyčleňujú IQ na pozadí iných riešení.
Komponent
Zraniteľnosť
Výsledok
spring-web:3.0.5
CVE-2020-5398
TRUE
CVE v NVD uvádza, že platí iba pre verzie 5.2.x do 5.2.3, 5.1.x do 5.1.13, a verzie 5.0.x do 5.0.16, napriek tomu, ak sa pozrieme na opis CVE v Nexus IQ, uvidíme nasledovné:
Advisory Deviation Notice: Tím security research spoločnosti Sonatype zistil, že táto zraniteľnosť bola zavedená vo verzii 3.0.2.RELEASE a nie 5.0.x, ako je uvedené v poradenstve.
Po tomto nasleduje PoC k tejto zraniteľnosti, ktorý oznamuje, že je prítomná vo verzii 3.0.5.
Falošne negatívne výsledky sa posielajú k Dependency Check a Dependency Track.
Č. 5
Pozrime sa na falošné pozitívy pre Dependency Check a Dependency Track.
Dependency Check sa osobitne vyznačuje tým, že reflektuje tie CVE, ktoré sa týkajú celého rámca v NVD, na komponenty, ku ktorým tieto CVE nie sú aplikovateľné. Týka sa to CVE-2012-0394, CVE-2013-2115, CVE-2014-0114, CVE-2015-0899, CVE-2015-2992, CVE-2016-1181, CVE-2016-1182, ktoré Dependency Check “pripnul” na struts-taglib:1.3.8 a struts-tiles-1.3.8. Tieto komponenty nemajú nič spoločné s tým, čo je popísané v CVE — spracovanie požiadaviek, validácia stránok atď. To je spôsobené tým, že to, čo spája tieto CVE a komponenty, je len rámec, v dôsledku čoho to Dependency Check považuje za zraniteľnosť.
Rovnaká situácia je so spring-tx:3.0.5, a podobná situácia s struts-core:1.3.8. Pre struts-core Dependency Check a Dependency Track našli veľmi veľa zraniteľností, ktoré v skutočnosti platia pre struts2-core, ktorý je v podstate samostatný framework. V tomto prípade Nexus IQ správne porozumel situácii a v tých CVE, ktoré vydal, uviedol, že struts-core dosiahol koniec životnosti a je potrebné prejsť na struts2-core.
č. 6
V niektorých situáciách je nespravodlivé interpretovať zjavné chyby Dependency Check a Dependency Track. Konkrétne CVE-2013-4152, CVE-2013-6429, CVE-2013-6430, CVE-2013-7315, CVE-2014-0054, CVE-2014-0225, CVE-2014-0225, ktoré Dependency Check a Dependency Track priradili k spring-core:3.0.5, v skutočnosti patria k spring-web:3.0.5. Časť týchto CVE bola nájdená aj Nexus IQ, avšak IQ ich správne identifikoval k inej komponente. To, že tieto zraniteľnosti neboli nájdené v spring-core, neznamená, že neexistujú vo frameworku ako takom, a open-source nástroje spravodlivo poukázali na tieto zraniteľnosti (len ich trocha minuli).
Zhrnutie
Ako môžeme vidieť, určovanie presnosti identifikovaných zraniteľností ručným preskúmaním neprináša jednoznačné výsledky, čo vedie k sporným bodom. Výsledky sú také, že riešenie Nexus IQ má najnižší počet falošných poplachov a najvyššiu presnosť.
Predovšetkým je to spôsobené tým, že tím Sonatype rozšíril popis pre každú zraniteľnosť CVE z NVD vo svojich databázach, uviedol presnosť až na úroveň triedy alebo funkcie zraniteľnosti pre rôzne verzie komponentov a vykonal ďalší výskum (napríklad preveroval zraniteľnosti v starších verziách softvéru).
Zásadný vplyv na výsledky majú aj zraniteľnosti, ktoré sa nedostali do NVD, ale predsa sú prítomné v databáze Sonatype s označením SONATYPE. Podľa správy o 45% zistených zraniteľností s otvoreným zdrojovým kódom nie je hlásených v NVD. Podľa databázy WhiteSource, len 29% zo všetkých zraniteľností s otvoreným zdrojovým kódom, registrovaných mimo NVD, sa nakoniec zverejní v nej, preto je tak dôležité hľadať zraniteľnosti aj v iných zdrojoch.
Ako výsledok, Dependency Check vydáva veľké množstvo šumu, pričom opomína niektoré zraniteľné komponenty. Dependency Track vydáva menej šumu a identifikuje veľké množstvo komponentov, čo vizuálne nebijú do očí v webovom rozhraní.
Praktika však ukazuje, že open source by mal byť prvým krokom na ceste k vyzrelému DevSecOps. Prvá vec, nad ktorou by ste sa mali zamyslieť pre integráciu SCA do vývoja, sú procesy, a to konkrétne diskusie s vedením a súvisiacimi oddeleniami o tom, ako by mali vyzerať ideálne procesy vo vašej organizácii. Možno sa ukáže, že pre vašu organizáciu spočiatku budú Dependency Check alebo Dependency Track a všetky podnikové riešenia logickým pokračovaním v dôsledku zvyšujúcej sa zložitosti vyvíjaných aplikácií.
Príloha A. Výsledky vzťahujúce sa na komponenty
Podmienené označenia:
- Vysoká — zraniteľnosti vysokého a kritického stupňa v komponente
- Stredná — Zraniteľnosti stredného stupňa kritickosti v komponente
- PRAVDA — Správne identifikovaná zraniteľnosť (True positive issue)
- NEPRAVDA — Falošný poplach (False positive issue)
Komponent
Nexus IQ
Dependency Check
Dependency Track
Výsledok
dom4j: 1.6.1
Vysoká
Vysoká
Vysoká
TRUE
log4j-core: 2.3
Vysoká
Vysoká
Vysoká
TRUE
log4j: 1.2.14
Vysoká
Vysoká
—
TRUE
commons-collections:3.1
Vysoká
Vysoká
Vysoká
TRUE
commons-fileupload:1.3.2
Vysoká
Vysoká
Vysoká
TRUE
commons-beanutils:1.7.0
Vysoká
Vysoká
Vysoká
TRUE
commons-codec:1:10
Stredná
—
—
TRUE
mysql-connector-java:5.1.42
Vysoká
Vysoká
Vysoká
TRUE
spring-expression:3.0.5
Vysoká
komponent nebol nájdený
TRUE
spring-web:3.0.5
Vysoká
komponent nebol nájdený
Vysoká
TRUE
spring-context:3.0.5
Stredná
komponent nebol nájdený
—
TRUE
spring-core:3.0.5
Stredná
Vysoká
Vysoká
TRUE
struts2-config-browser-plugin:2.3.30
Stredná
—
—
TRUE
spring-tx:3.0.5
—
Vysoká
—
FALSE
struts-core:1.3.8
Vysoká
Vysoká
Vysoká
TRUE
xwork-core: 2.3.30
Vysoká
—
—
TRUE
struts2-core: 2.3.30
Vysoká
Vysoká
Vysoká
TRUE
struts-taglib:1.3.8
—
Vysoká
—
FALSE
struts-tiles-1.3.8
—
Vysoká
—
FALSE
Príloha B. Výsledky vzťahujúce sa na zraniteľnosti
Podmienené označenia:
- Vysoká — zraniteľnosti vysokého a kritického stupňa v komponente
- Stredná — Zraniteľnosti stredného stupňa kritickosti v komponente
- PRAVDA — Správne identifikovaná zraniteľnosť (True positive issue)
- NEPRAVDA — Falošný poplach (False positive issue)
Komponent
Nexus IQ
Dependency Check
Dependency Track
Závažnosť
Výsledok
Komentár
dom4j: 1.6.1
CVE-2018-1000632
CVE-2018-1000632
CVE-2018-1000632
Vysoká
TRUE
CVE-2020-10683
CVE-2020-10683
CVE-2020-10683
Vysoká
TRUE
log4j-core: 2.3
CVE-2017-5645
CVE-2017-5645
CVE-2017-5645
Vysoká
TRUE
CVE-2020-9488
CVE-2020-9488
CVE-2020-9488
Nízka
TRUE
log4j: 1.2.14
CVE-2019-17571
CVE-2019-17571
—
Vysoká
TRUE
—
CVE-2020-9488
—
Nízka
TRUE
SONATYPE-2010-0053
—
—
Vysoká
TRUE
commons-collections:3.1
—
CVE-2015-6420
CVE-2015-6420
Vysoká
FALSE
Duplikuje RCE(OSSINDEX)
—
CVE-2017-15708
CVE-2017-15708
Vysoká
FALSE
Duplikuje RCE(OSSINDEX)
SONATYPE-2015-0002
RCE (OSSINDEX)
RCE(OSSINDEX)
Vysoká
TRUE
commons-fileupload:1.3.2
CVE-2016-1000031
CVE-2016-1000031
CVE-2016-1000031
Vysoká
TRUE
SONATYPE-2014-0173
—
—
Stredná
TRUE
commons-beanutils:1.7.0
CVE-2014-0114
CVE-2014-0114
CVE-2014-0114
Vysoká
TRUE
—
CVE-2019-10086
CVE-2019-10086
Vysoká
FALSE
Zraniteľnosť sa vzťahuje iba na verzie 1.9.2+
commons-codec:1:10
SONATYPE-2012-0050
—
—
Stredná
TRUE
mysql-connector-java:5.1.42
CVE-2018-3258
CVE-2018-3258
CVE-2018-3258
Vysoká
TRUE
CVE-2019-2692
CVE-2019-2692
—
Stredná
TRUE
—
CVE-2020-2875
—
Stredná
FALSE
Tá istá zraniteľnosť ako CVE-2019-2692, ale s dodatkom „útoky môžu významne ovplyvniť ďalšie produkty“
—
CVE-2017-15945
—
Vysoká
FALSE
Nevzťahuje sa na mysql-connector-java
—
CVE-2020-2933
—
Nízka
FALSE
Duplikát CVE-2020-2934
CVE-2020-2934
CVE-2020-2934
—
Stredná
TRUE
spring-expression:3.0.5
CVE-2018-1270
komponent nebol nájdený
—
Vysoká
TRUE
CVE-2018-1257
—
—
Stredná
TRUE
spring-web:3.0.5
CVE-2016-1000027
komponent nebol nájdený
—
Vysoká
TRUE
CVE-2014-0225
—
CVE-2014-0225
Vysoká
TRUE
CVE-2011-2730
—
—
Vysoká
TRUE
—
—
CVE-2013-4152
Stredná
TRUE
CVE-2018-1272
—
—
Vysoká
TRUE
CVE-2020-5398
—
—
Vysoká
TRUE
Ukážkový príklad v prospech IQ: „Tím bezpečnostného výskumu Sonatype zistil, že táto zraniteľnosť bola zavedená vo verzii 3.0.2.RELEASE a nie 5.0.x, ako bolo uvedené v oznámení.“
CVE-2013-6429
—
—
Stredná
TRUE
CVE-2014-0054
—
CVE-2014-0054
Stredná
TRUE
CVE-2013-6430
—
—
Stredná
TRUE
spring-context:3.0.5
CVE-2011-2894
komponent nebol nájdený
—
Stredná
TRUE
spring-core:3.0.5
—
CVE-2011-2730
CVE-2011-2730
Vysoká
TRUE
CVE-2011-2894
CVE-2011-2894
CVE-2011-2894
Stredná
TRUE
—
—
CVE-2013-4152
Stredná
FALSE
Duplikát tej istej zraniteľnosti v spring-web
—
CVE-2013-4152
—
Stredná
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web
—
CVE-2013-6429
CVE-2013-6429
Stredná
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web
—
CVE-2013-6430
—
Stredná
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web
—
CVE-2013-7315
CVE-2013-7315
Stredná
FALSE
SPLIT z CVE-2013-4152. + Zraniteľnosť sa vzťahuje k komponentu spring-web
—
CVE-2014-0054
CVE-2014-0054
Stredná
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web
—
CVE-2014-0225
—
Vysoká
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web
—
—
CVE-2014-0225
Vysoká
FALSE
Duplikát tej istej zraniteľnosti v spring-web
—
CVE-2014-1904
CVE-2014-1904
Stredná
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web-mvc
—
CVE-2014-3625
CVE-2014-3625
Stredná
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web-mvc
—
CVE-2016-9878
CVE-2016-9878
Vysoká
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web-mvc
—
CVE-2018-1270
CVE-2018-1270
Vysoká
FALSE
Pre spring-expression / spring-messages
—
CVE-2018-1271
CVE-2018-1271
Stredná
FALSE
Zraniteľnosť sa vzťahuje k komponentu spring-web-mvc
—
CVE-2018-1272
CVE-2018-1272
Vysoká
TRUE
CVE-2014-3578
CVE-2014-3578 (OSSINDEX)
CVE-2014-3578
Stredná
TRUE
SONATYPE-2015-0327
—
—
Nízka
TRUE
struts2-config-browser-plugin:2.3.30
SONATYPE-2016-0104
—
—
Stredná
TRUE
spring-tx:3.0.5
—
CVE-2011-2730
—
Vysoká
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2011-2894
—
Vysoká
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2013-4152
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2013-6429
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2013-6430
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2013-7315
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2014-0054
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2014-0225
—
Vysoká
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2014-1904
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2014-3625
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2016-9878
—
Vysoká
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2018-1270
—
Vysoká
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2018-1271
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
—
CVE-2018-1272
—
Stredná
FALSE
Zraniteľnosť sa nevzťahuje na spring-tx
struts-core:1.3.8
—
CVE-2011-5057 (OSSINDEX)
Stredná
FASLE
Zraniteľnosť pre Struts 2
—
CVE-2012-0391 (OSSINDEX)
CVE-2012-0391
Vysoká
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2014-0094 (OSSINDEX)
CVE-2014-0094
Stredná
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2014-0113 (OSSINDEX)
CVE-2014-0113
Vysoká
FALSE
Zraniteľnosť pre Struts 2
CVE-2016-1182
3VE-2016-1182
—
Vysoká
TRUE
—
—
CVE-2011-5057
Stredná
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2012-0392 (OSSINDEX)
CVE-2012-0392
Vysoká
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2012-0393 (OSSINDEX)
CVE-2012-0393
Stredná
FALSE
Zraniteľnosť pre Struts 2
CVE-2015-0899
CVE-2015-0899
—
Vysoká
TRUE
—
CVE-2012-0394
CVE-2012-0394
Stredná
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2012-0838 (OSSINDEX)
CVE-2012-0838
Vysoká
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2013-1965 (OSSINDEX)
CVE-2013-1965
Vysoká
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2013-1966 (OSSINDEX)
CVE-2013-1966
Vysoká
FASLE
Zraniteľnosť pre Struts 2
—
CVE-2013-2115
CVE-2013-2115
Vysoká
FASLE
Zraniteľnosť pre Struts 2
—
CVE-2013-2134 (OSSINDEX)
CVE-2013-2134
Vysoká
FASLE
Zraniteľnosť pre Struts 2
—
CVE-2013-2135 (OSSINDEX)
CVE-2013-2135
Vysoká
FASLE
Zraniteľnosť pre Struts 2
CVE-2014-0114
CVE-2014-0114
—
Vysoká
TRUE
—
CVE-2015-2992
CVE-2015-2992
Stredná
FALSE
Zraniteľnosť pre Struts 2
—
CVE-2016-0785 (OSSINDEX)
CVE-2016-0785
Vysoká
FALSE
Zraniteľnosť pre Struts 2
CVE-2016-1181
CVE-2016-1181
—
Vysoká
TRUE
—
CVE-2016-4003 (OSSINDEX)
CVE-2016-4003
Vysoká
FALSE
Zraniteľnosť pre Struts 2
xwork-core:2.3.30
CVE-2017-9804
—
—
Vysoká
TRUE
SONATYPE-2017-0173
—
—
Vysoká
TRUE
CVE-2017-7672
—
—
Vysoká
FALSE
Duplicit k CVE-2017-9804
SONATYPE-2016-0127
—
—
Vysoká
TRUE
struts2-core:2.3.30
—
CVE-2016-6795
CVE-2016-6795
Vysoká
TRUE
—
CVE-2017-9787
CVE-2017-9787
Vysoká
TRUE
—
CVE-2017-9791
CVE-2017-9791
Vysoká
TRUE
—
CVE-2017-9793
—
Vysoká
FALSE
Duplikát k CVE-2018-1327
—
CVE-2017-9804
—
Vysoká
TRUE
—
CVE-2017-9805
CVE-2017-9805
Vysoká
TRUE
CVE-2016-4003
—
—
Stredná
FALSE
Aplikuje sa na Apache Struts 2.x do 2.3.28, pričom verzia je 2.3.30. Napriek tomu, vychádzajúc z opisu, CVE platí pre všetky verzie Struts 2, ak je použitý JRE 1.7 a menšie. Zjavne sa tu rozhodli poistiť, ale viac to vyzerá na FALSE
—
CVE-2018-1327
CVE-2018-1327
Vysoká
TRUE
CVE-2017-5638
CVE-2017-5638
CVE-2017-5638
Vysoká
TRUE
To je tá zraniteľnosť, ktorú zneužili útočníci v Equifax v 2017 roku
CVE-2017-12611
CVE-2017-12611
—
Vysoká
TRUE
CVE-2018-11776
CVE-2018-11776
CVE-2018-11776
Vysoká
TRUE
struts-taglib:1.3.8
—
CVE-2012-0394
—
Stredná
FALSE
Pre struts2-core
—
CVE-2013-2115
—
Vysoká
FALSE
Pre struts2-core
—
CVE-2014-0114
—
Vysoká
FALSE
Pre commons-beanutils
—
CVE-2015-0899
—
Vysoká
FALSE
Nevzťahuje sa na taglib
—
CVE-2015-2992
—
Stredná
FALSE
Vzťahuje sa na struts2-core
—
CVE-2016-1181
—
Vysoká
FALSE
Nevzťahuje sa na taglib
—
CVE-2016-1182
—
Vysoká
FALSE
Nevzťahuje sa na taglib
struts-tiles-1.3.8
—
CVE-2012-0394
—
Stredná
FALSE
Pre struts2-core
—
CVE-2013-2115
—
Vysoká
FALSE
Pre struts2-core
—
CVE-2014-0114
—
Vysoká
FALSE
Pod commons-beanutils
—
CVE-2015-0899
—
Vysoká
FALSE
Nevzťahuje sa na tiles
—
CVE-2015-2992
—
Stredná
FALSE
Pre struts2-core
—
CVE-2016-1181
—
Vysoká
FALSE
Nevzťahuje sa na taglib
—
CVE-2016-1182
—
Vysoká
FALSE
Nevzťahuje sa na taglib
Zdroj: habr.com
