Důležitost analýzy třetích stran softwarových komponent (angl. Software Composition Analysis — SCA) v procesu vývoje roste s každoročními zprávami o zranitelnostech open source knihoven, které publikují společnosti Synopsys, Sonatype, Snyk, White Source. Podle zprávy počet odhalených zranitelností v open source v roce 2019 vzrostl téměř o 1,5krát ve srovnání s předchozím rokem, zatímco komponenty s otevřeným kódem se používají v 60 % až 80 % projektů. Pokud se obrátíme na nezávislé názory, procesy SCA jsou jednotlivou praktikou OWASP SAMM a BSIMM jako ukazatel zralosti, a v první polovině roku 2020 OWASP vydala nový standard OWASP Software Component Verification Standard (SCVS), který poskytuje osvědčené postupy pro ověřování třetích stran komponent v dodavatelském řetězci softwaru.

Jedním z nejvýznamnějších případů s společností Equifax v květnu 2017. Neznámí útočníci získali informace o 143 milionech Američanů, včetně plných jmen, adres, čísel sociálního zabezpečení a řidičských průkazů. V 209 000 případech se v dokumentech také objevily informace o platebních kartách obětí. Tento únik vznikl v důsledku zneužití kritické zranitelnosti v Apache Struts 2 (CVE-2017-5638), přičemž oprava byla vydána již v březnu 2017. Společnost měla dva měsíce na instalaci aktualizace, avšak nikdo se tím nezaobíral.
V tomto článku se bude diskutovat o výběru nástroje pro provádění SCA z pohledu kvality analyzovaných výsledků. Také bude uvedeno funkční porovnání nástrojů. Proces integrace do CI/CD a možnosti integrace ponecháme na další publikace. Široký seznam nástrojů byl představen OWASP , ale v rámci tohoto přehledu se dotkneme pouze nejpopulárnějšího open source nástroje Dependency Check, o něco méně známé open source platformy Dependency Track a enterprise řešení Sonatype Nexus IQ. Také si vysvětlíme, jak tato řešení fungují a porovnáme získané výsledky z hlediska falešných pozitiv.

Princip práce
— je to nástroj (CLI, maven, jenkins modul, ant), který analyzuje soubory projektu, shromažďuje fragmenty informací o závislostech (název balíčku, groupid, specifikace názvu, verze…), vytváří řetězec CPE — (Common Platform Enumeration), Package URL (PURL) a identifikuje pro CPE/PURL zranitelnosti z databází (NVD, Sonatype OSS Index, NPM Audit API…), po čemž vytváří jednorázovou zprávu ve formátu HTML, JSON, XML…
Podívejme se, jak vypadá CPE:
cpe:2.3:part:vendor:product:version:update:edition:language:sw_edition:target_sw:target_hw:other- Part: Určení, že komponenta patří k aplikaci (a), operačnímu systému (o), hardwaru (h) (Povinný údaj)
- Vendor: Název výrobce produktu (Povinný údaj)
- Product: Název produktu (Povinný údaj)
- Version: Verze komponenty (Zastaralý údaj)
- Update: Aktualizace balíčku
- Edition: Děděná verze (Zastaralý údaj)
- Language: Jazyk definovaný v RFC-5646
- SW Edition: Verze softwaru
- Target SW: Softwarové prostředí, ve kterém produkt funguje
- Target HW: Hardwarové prostředí, ve kterém produkt funguje
- Other: Informace o dodavateli nebo produktu
Příklad CPE vypadá takto:
cpe:2.3:a:pivotal_software:spring_framework:3.0.0:*:*:*:*:*:*:* Řetězec znamená, že CPE verze 2.3 popisuje komponentu aplikace od výrobce pivotal_software s názvem spring_framework verze 3.0.0. Pokud otevřeme zranitelnost v NVD, můžeme vidět zmínku o této CPE. První problém, na který bychom se měli zaměřit — CVE v NVD podle CPE informuje o problému v rámci frameworku, nikoli v konkrétní komponentě. To znamená, že pokud jsou vývojáři úzce spjati s frameworkem, a zjištěná zranitelnost se netýká těch modulů, které používají, specialistovi na bezpečnost se tak či onak bude muset zabývat touto CVE a přemýšlet o aktualizaci.
URL adresa se také používá nástroji SCA. Formát URL adresy balíčku je následující:
scheme:type/namespace/name@version?qualifiers#subpath- Scheme: Bude vždy ‘pkg’, což označuje, že se jedná o URL adresu balíčku (Povinný údaj)
- Type: „Typ“ balíčku nebo „protokol“ balíčku, například maven, npm, nuget, gem, pypi atd. (Povinný údaj)
- Namespace: Nějaká předpona názvu, jako je identifikátor skupiny Maven, vlastník Docker obrazu, uživatel nebo organizace GitHub. Nepovinné a závislé na typu.
- Name: Název balíčku (Povinný údaj)
- Version: Verze balíčku
- Qualifiers: Další kvalifikační údaje pro balíček, jako jsou operační systém, architektura, distribuce atd. Nepovinné a závislé na typu položky.
- Subcesta: Další cesta v balíčku vzhledem k kořeni balíčku
Napří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, která přijímá hotové sestavy materiálů (BOM) vytvořené a , tedy hotové specifikace o existujících závislostech. Toto je XML soubor s popisem závislostí — název, hashe, URL balíčku, vydavatel, licence. Poté Dependency Track analyzuje BOM, zkoumá existující zjištěné závislosti CVE z databáze zranitelností (NVD, Sonatype OSS Index …), po čemž vytváří grafy, počítá metriky a pravidelně aktualizuje údaje o stavu zranitelnosti komponent.
Příklad toho, jak může vypadat BOM ve formátu 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 může být používán nejen jako vstupní parametry pro Dependency Track, ale také pro inventarizaci komponentů SW v dodavatelském řetězci, například pro poskytování zákazníkovi SW. V roce 2014 byl ve Spojených státech navržen zákon , který uváděl, že při nákupu SW musí každá vládní instituce požadovat BOM, aby se zabránilo použití zranitelných komponentů, avšak zákon nakonec nenabyl účinnosti.
Pokud se vrátíme k SCA, Dependency Track má připravené integrace s notifikačními platformami jako Slack, systémy správy zranitelností jako Kenna Security. Je také třeba zmínit, že Dependency Track navíc identifikuje zastaralé verze balíčků a poskytuje informace o licencích (díky podpoře SPDX).
Pokud jde konkrétně o kvalitu SCA, existuje zde zásadní rozdíl.
Dependency Track nepřijímá projekt jako vstupní data, ale přijímá BOM. To znamená, že pokud chceme zkontrolovat projekt, musíme nejprve vygenerovat bom.xml, například pomocí CycloneDX. Tímto způsobem Dependency Track přímo závisí na CycloneDX. Na druhou stranu to dává možnost přizpůsobení. Tak tým OZON napsal pro vytváření BOM souborů pro projekty v Golangu s cílem dalšího skenování prostřednictvím Dependency Track.
je komerční řešení SCA od společnosti Sonatype, které je součástí ekosystému Sonatype, kam také patří Nexus Repository Manager. Nexus IQ může přijímat jako vstupní data jak war archivy (pro java projekty) přes webové rozhraní nebo API, tak i BOM, pokud se vaše organizace nestihla přeorientovat z CycloneDX na nové řešení. Na rozdíl od open source řešení, IQ se nezaměřuje pouze na CP/PURL k zjištěné komponentě a odpovídající zranitelnosti v databázi, ale bere v úvahu i vlastní výzkumy, například název zranitelné funkce nebo třídy. Mechanismy IQ budou podrobněji probrány později při analýze výsledků.
Shrneme některé závěry ohledně funkčních vlastností a také prozkoumáme podporované jazyky pro analýzu:
Jazyk
Nexus IQ
Dependency Check
Dependency Track
Javy
+
+
+
C/C++
+
+
—
C#
+
+
—
.Net
+
+
+
Erlang
—
—
+
JavaScript (NodeJS)
+
+
+
PHP
+
+
+
CouchDB
+
+
+
Ruby
+
+
+
Perl
—
—
—
Scala
+
+
+
Objective C
+
+
—
Swift
+
+
—
R
+
—
—
Go
+
+
+
Funkční možnosti
Funkční možnosti
Nexus IQ
Dependency Check
Dependency Track
Možnost provádět kontrolu komponent používaných v zdrojovém kódu na licenční čistotu
+
—
+
Možnost skenování a analýzy zranitelností a licenční čistoty pro Docker obrazy
+ Integrace s Clair
—
—
Možnost nastavení bezpečnostní politiky pro používání knihoven s otevřeným zdrojovým kódem
+
—
—
Možnost skenování repozitářů s otevřeným zdrojovým kódem na přítomnost zranitelných komponent
+ RubyGems, Maven, NPM, Nuget, Pypi, Conan, Bower, Conda, Go, p2, R, Yum, Helm, Docker, CocoaPods, Git LFS
—
+ Hex, RubyGems, Maven, NPM, Nuget, Pypi
Mít specializovanou výzkumnou skupinu
+
—
—
Práce v uzavřeném obvodu
+
+
+
Používání externích databází
+ Uzavřená databáze Sonatype
+ Sonatype OSS, NPM veřejní poradci
+ Sonatype OSS, NPM veřejní poradci, RetireJS, VulnDB, podpora vlastní databáze zranitelností
Možnost filtrovat komponenty s otevřeným zdrojovým kódem při pokusu o nahrání do vývojového obvodu podle nakonfigurovaných politik
+
—
—
Doporučení pro opravy zranitelností, přítomnost odkazů na opravy
+
+- (závisí na popisu v veřejných databázích)
+- (závisí na popisu v veřejných databázích)
Hodnocení zjištěných zranitelností podle závažnosti
+
+
+
Role model přístupu
+
—
+
Podpora příkazového řádku CLI
+
+
+- (pouze pro CycloneDX)
Výběr / třídění zranitelností podle stanovených kritérií
+
—
+
Dashboard stavu aplikací
+
—
+
Generování zpráv ve formátu PDF
+
—
—
Generování zpráv ve formátu JSONCSV
+
+
—
Podpora českého jazyka
—
—
—
Integrační možnosti
Integrace
Nexus IQ
Dependency Check
Dependency Track
Integrace s LDAP/Active Directory
+
—
+
Integrace s nástrojem pro kontinuální integraci (continuous integration) Bamboo
+
—
—
Integrace s nástrojem pro kontinuální integraci (continuous integration) TeamCity
+
—
—
Integrace s nástrojem pro kontinuální integraci (continuous integration) GitLab
+
+- (ve formě pluginu pro GitLab)
+
Integrace s nástrojem pro kontinuální integraci (continuous integration) Jenkins
+
+
+
Dostupnost pluginů k IDE
+ IntelliJ, Eclipse, Visual Studio
—
—
Podpora přizpůsobené integrace přes webové služby (API) nástroje
+
—
+
Dependency Check
První spuštění
Spustíme Dependency Check proti úmyslně zranitelnému aplikaci .
Pro toto využijeme :
mvn org.owasp:dependency-check-maven:checkVýsledkem v adresáři target se objeví dependency-check-report.html.

Otevřeme soubor. Po shrnující informaci o celkovém počtu zranitelností můžeme vidět informace o zranitelnostech s vysokou úrovní závažnosti a důvěryhodnosti s uvedením na balíček, CPE, číslo CVE.
Následuje podrobnější informace, zejména to, na základě čeho bylo rozhodnutí přijato (evidence), tedy jakýsi BOM.

Dále následuje CPE, PURL a popis CVE. Doporučení k nápravě ostatně nebyla poskytnuta z důvodu jejich absence v databázi NVD.

Pro systematické prohlížení výsledků skenování lze nastavit Nginx s minimálními nastaveními, nebo odesílat zjištěné defekty do systému pro správu defektů, které podporují konektory pro Dependency Check. Například Defect Dojo.
Dependency Track
Instalace
Dependency Track je na druhé straně webová platforma s grafickým zobrazením, proto akutní problém ukládání defektů ve třetím řešení zde nestojí.
Pro instalaci existují následující podporované scénáře: Docker, WAR, Executable WAR.
První spuštění
Přejdeme na URL spuštěné služby. Přihlásíme se přes admin/admin, změníme uživatelské jméno a heslo, poté se dostaneme na Dashboard. Další krok, který uděláme — vytvoříme projekt pro testovací aplikaci na Java v Home/Projects → Vytvořit Projekt . Jako příklad vezmeme DVJA.

Jelikož Dependency Track může přijímat pouze BOM jako vstupní data, je nutné tento BOM získat. Využijeme :
mvn org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBomZískáme bom.xml a nahrajeme soubor v vytvořeném projektu DVJA → Závislosti → Nahrát BOM.
Přejdeme do Administrace → Analytici. Uvědomujeme si, že máme zapnut pouze Interní analytik, který zahrnuje NVD. Připojíme také Sonatype OSS Index.

Tímto získáme následující přehled pro náš projekt:

Také v seznamu lze nalézt jednu zranitelnost vztahující se k Sonatype OSS:

Hlavním zklamáním bylo, že Dependency Track již nepřijímá XML zprávy Dependency Check. Poslední podporované verze integrace s Dependency Check byly 1.0.0 – 4.0.2, zatímco jsem testoval 5.3.2.
Tady (a ), když to ještě bylo možné.
Nexus IQ
První spuštění
Instalace Nexus IQ probíhá z archivů na , ale pro tyto účely jsme si sestavili obraz Docker.
Po přihlášení do konzole je třeba vytvořit Organizaci a Aplikaci.



Jak vidíte, nastavení v případě IQ je poněkud složitější, protože musíme také vytvořit politiky aplikovatelné pro různé „fáze“ (dev, build, stage, release). To je nutné k blokování zranitelných komponent při postupu v pipeline blíž k produkci, nebo blokovat jakmile se dostanou do Nexus Repo při stahování vývojáři.
Abychom si uvědomili rozdíl mezi open source a enterprise, provedeme stejné skenování prostřednictvím Nexus IQ analogicky prostřednictvím , přičemž nejprve vytvoříme testovací aplikaci 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=
Přejdeme na URL ke vygenerované zprávě v webovém rozhraní IQ:

Zde lze vidět všechna porušení politiky s označením různé úrovně závažnosti (od Info po Security Critical). Písmeno D vedle komponenty znamená, že komponenta je přímá závislost, a písmeno T vedle komponenty znamená, že komponenta je tranzitivní závislost, tedy je tranzitivní.
Mimochodem, zpráva od Snyku uvádí, že více než 70 % zranitelností open source zjištěných v Node.js, Java a Ruby se nachází v tranzitivních závislostech.
Pokud otevřete jedno z porušení politiky Nexus IQ, uvidíte popis komponenty a také Version Graph, který ukazuje umístění aktuální verze na časové ose a také v jakém okamžiku zranitelnost přestává být zranitelná. Výška svíček na grafu ukazuje popularitu používání této komponenty.

Pokud přejdete do sekce zranitelností a rozbalíte CVE, můžete si přečíst popis této zranitelnosti, doporučení pro odstranění a také důvod, proč se tato komponenta dostala pod porušení, tedy přítomnost třídy. DiskFileitem.class.


Shrneme pouze ty, které se týkají třetích komponentů Java, a odstraníme js komponenty. V závorkách uvedeme počet zranitelností, které byly nalezeny mimo NVD.
Celkem Nexus IQ:
- Naskenované závislosti: 62
- Zranitelné závislosti: 16
- Nalezené zranitelnosti: 42 (8 sonatype db)
Celkem Dependency Check:
- Naskenované závislosti: 47
- Zranitelné závislosti: 13
- Nalezené zranitelnosti: 91 (14 sonatype oss)
Celkem Dependency Track:
- Naskenované závislosti: 59
- Zranitelné závislosti: 10
- Nalezené zranitelnosti: 51 (1 sonatype oss)
Dalším krokem bude analyzovat získané výsledky a zjistit, které z těchto zranitelností jsou skutečným defektem a které jsou falešným poplachem.
Vyloučení odpovědnosti
Tato recenze není nevyvratitelnou pravdou. Autora neměla za cíl vyzdvihnout jeden nástroj nad ostatní. Smyslem recenze bylo ukázat mechanismy fungování nástrojů SCA a způsoby ověření jejich výsledků.
Porovnání výsledků
Podmínky:
Falešným poplachem v souvislosti se zranitelnostmi třetích komponentů je:
- Nesoulad CVE s identifikovanou komponentou
- Například pokud je zranitelnost zjištěna ve frameworku struts2 a nástroj ukazuje na komponentu frameworku struts-tiles, ke které se tato zranitelnost nevztahuje, pak jde o falešný poplach.
- Nesoulad CVE s identifikovanou verzí komponenty
- Například zranitelnost je vázána na verzi python > 3.5 a nástroj označuje za zranitelnou verzi 2.7 - to je falešný poplach, protože zranitelnost se ve skutečnosti týká pouze větve produktu 3.x.
- Duplicita CVE
- Například pokud SCA ukázal na CVE, které umožňuje realizovat RCE, a poté SCA označuje pro tuto stejnou komponentu CVE, které se vztahuje k produktům Cisco, zasaženým touto RCE. V takovém případě půjde o falešný poplach.
- Například byla nalezena CVE v komponentě spring-web, po čemž SCA ukazuje na tuto CVE v dalších komponentách frameworku Spring Framework, zatímco CVE nemá žádný vztah k jiným komponentám. V takovém případě bude výsledkem false positive.
Předmětem výzkumu byl vybrán Open Source projekt DVJA. Ve výzkumu byly zahrnuty pouze java komponenty (bez js).
Shrnující výsledky
Přejdeme přímo k výsledkům manuálního revize identifikovaných zranitelností. S podrobnou zprávou pro každou CVE se můžete seznámit v Příloze.
Shrnující výsledky všech zranitelností:
Parameter
Nexus IQ
Dependency Check
Dependency Track
Celkový počet identifikovaných zranitelností
42
91
51
Nesprávně identifikované zranitelnosti (false positive)
2(4.76%)
62(68,13%)
29(56.86%)
Nenašly se relevantní zranitelnosti (false negative)
10
20
27
Shrnující výsledky podle komponentů:
Parameter
Nexus IQ
Dependency Check
Dependency Track
Celkový počet identifikovaných komponentů
62
47
59
Celkový počet zranitelných komponentů
16
13
10
Nesprávně identifikované zranitelné komponenty (false positive)
1
5
0
Nesprávně identifikované zranitelné komponenty (false positive)
0
6
6
Vytvoříme vizuální grafiky, abychom posoudili poměr false positive a false negative k celkovému počtu zranitelností. Na vodorovné ose jsou uvedeny komponenty a na svislé ose identifikované zranitelnosti.



Pro srovnání, podobný výzkum byl proveden týmem Sonatype na testování projektu z 1531 komponentů pomocí OWASP Dependency Check. Jak můžeme vidět, poměr šumu k správným aktivacím je podobný našim výsledkům.

Zdroj:
Podíváme se na některé CVE z výsledků našeho skenování, abychom pochopili příčinu těchto výsledků.
Více informací
Č.1
Nejprve si probereme některé zajímavé body Sonatype Nexus IQ.
Nexus IQ ukazuje na problém s deserializací s možností provést RCE v Spring Framework několikrát. CVE-2016-1000027 v spring-web:3.0.5 poprvé, a CVE-2011-2894 v spring-context:3.0.5 a spring-core:3.0.5. Na první pohled se zdá, že dochází k duplicaci zranitelnosti podle několika CVE. Neboť, pokud se podíváte na CVE-2016-1000027 a CVE-2011-2894 v databázi NVD, vypadá to jasně.
Komponenta
Zranitelnost
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 je sama o sobě velmi známá. Ve zprávě tato CVE byla uznána jako jedna z nejčastějších. Popis pro CVE-2016-100027 je obecně v NVD trochu nedostačující a platí, že se zdá, že je použitelná pouze pro Spring Framework 4.1.4. Podívejme se na a zde se to stává více nebo méně jasné. Z porozumíme, že kromě zranitelnosti v RemoteInvocationSerializingExporter v CVE-2011-2894 je zranitelnost pozorována v HttpInvokerServiceExporter. O tom nás informuje Nexus IQ:

Nicméně nic takového není v NVD, což způsobuje, že Dependency Check a Dependency Track dostávají falešně negativní výsledky.
Z popisu CVE-2011-2894 také vyplývá, že zranitelnost skutečně existuje jak ve spring-context:3.0.5, tak ve spring-core:3.0.5. Potvrzení toho lze nalézt v článku od osob, které tuto zranitelnost objevily.
č. 2
Komponenta
Zranitelnost
Výsledek
struts2-core:2.3.30
CVE-2016-4003
FALSE
Pokud se podíváme na zranitelnost CVE-2016-4003, pochopíme, že byla opravena již ve verzi 2.3.28, přesto nám Nexus IQ o ní informuje. V popisu zranitelnosti je poznámka:

To znamená, že zranitelnost existuje pouze ve spojení se zastaralou verzí JRE, o čemž nás chtěli informovat. Přesto to považujeme za false positive, ačkoliv ne tak vážný.
č. 3
Komponenta
Zranitelnost
Výsledek
xwork-core:2.3.30
CVE-2017-9804
TRUE
xwork-core:2.3.30
CVE-2017-7672
FALSE
Pokud se podíváme na popis CVE-2017-9804 a CVE-2017-7672, pochopíme, že problém je v URLValidator class, přičemž CVE-2017-9804 vychází z CVE-2017-7672. Přítomnost druhé zranitelnosti nenese žádnou užitečnou zátěž, kromě toho, že její závažnost vzrostla na vysokou, takže to lze považovat za zbytečný šum.
Celkově nebyly nalezeny žádné další falešně pozitivní výsledky pro Nexus IQ.
č. 4
Existuje několik aspektů, které vyzdvihují IQ na pozadí jiných řešení.
Komponenta
Zranitelnost
Výsledek
spring-web:3.0.5
CVE-2020-5398
TRUE
CVE v NVD uvádí, že se vztahuje pouze na verze 5.2.x do 5.2.3, 5.1.x do 5.1.13 a verze 5.0.x do 5.0.16, přesto pokud se podíváme na popis CVE v Nexus IQ, uvidíme následující:
Oznámení o deviaci poradenství: Tým bezpečnostního výzkumu Sonatype zjistil, že tato zranitelnost byla zavedená ve verzi 3.0.2.RELEASE a ne v 5.0.x, jak je uvedeno v poradenství.
Po tomto následuje PoC této zranitelnosti, který informuje, že existuje ve verzi 3.0.5.
Falešný negativ se posílá k Dependency Check a Dependency Track.
č. 5
Podívejme se na falešně pozitivní výsledky pro Dependency Check a Dependency Track.
Dependency Check se vyznačuje tím, že odráží CVE, které se vztahují na celý framework v NVD, na ty komponenty, kterým se tato CVE netýkají. To se týká CVE-2012-0394, CVE-2013-2115, CVE-2014-0114, CVE-2015-0899, CVE-2015-2992, CVE-2016-1181, CVE-2016-1182, které Dependency Check „přiřadil“ k struts-taglib:1.3.8 a struts-tiles-1.3.8. Tyto komponenty nemají nic společného s tím, co je popsáno v CVE — zpracováním požadavků, validací stránek a tak dále. To je dáno tím, že společným prvkem mezi těmito CVE a komponentami je pouze framework, což je důvod, proč to Dependency Check považoval za zranitelnost.
Stejná situace je se spring-tx:3.0.5 a podobná situace platí pro struts-core:1.3.8. Pro struts-core Dependency Check a Dependency Track našly velké množství zranitelností, které se ve skutečnosti vztahují na struts2-core, který je v podstatě samostatným rámcem. V tomto případě Nexus IQ správně pochopil situaci a ve všech vygenerovaných CVE uvedl, že struts-core dosáhl konce životnosti a je nutné přejít na struts2-core.
č. 6
V některých situacích je nespravedlivé vykládat jasnou chybu Dependency Check a Dependency Track. Konkrétně CVE-2013-4152, CVE-2013-6429, CVE-2013-6430, CVE-2013-7315, CVE-2014-0054, CVE-2014-0225, CVE-2014-0225, které Dependency Check a Dependency Track přiřadili k spring-core:3.0.5, se ve skutečnosti vztahují na spring-web:3.0.5. Přitom část z těchto CVE byla nalezena i v Nexus IQ, nicméně IQ je správně přiřadil k jiné komponentě. To, že tyto zranitelnosti nebyly nalezeny ve spring-core, neznamená, že v rámci rámce vůbec nejsou, a open source nástroje správně upozornily na tyto zranitelnosti (jen se lehce přestřelily).
Závěry
Jak vidíme, určení správnosti zjištěných zranitelností manuální revizí nenabízí jednoznačné výsledky, což vytváří sporné momenty. Výsledky ukazují, že řešení Nexus IQ má nejnižší míru falešných poplachů a nejvyšší přesnost.
Především je to spojeno s tím, že tým Sonatype rozšířil popis každé zranitelnosti CVE z NVD ve svých databázích, přičemž uvedl s přesností na třídu nebo funkci zranitelnosti pro danou verzi komponenty a provedli další výzkumy (například zkontrolovali zranitelnosti u starších verzí softwaru).
Neméně důležitý vliv na výsledky mají i ty zranitelnosti, které se nedostaly do NVD, ale přesto jsou v databázi Sonatype s označením SONATYPE. Podle zprávy o 45 % zjištěných zranitelností s otevřeným zdrojovým kódem nebylo hlášeno do NVD. Podle databáze WhiteSource pouze 29 % všech zranitelností s otevřeným zdrojovým kódem, registrovaných mimo NVD, nakonec publikováno v NVD, proto je tak důležité hledat zranitelnosti také v dalších zdrojích.
Výsledkem je, že Dependency Check vydává velké množství šumu, zatímco opomíjí část zranitelných komponent. Dependency Track generuje menší šum a identifikuje velké množství komponent, což vizuálně nevypadá rušivě v webovém rozhraní.
Praxe ukazuje, že open source by měl být prvním krokem k zralému DevSecOps. Prvním krokem k integraci SCA do vývoje by měly být procesy, konkrétně diskuse s vedením a příbuznými odděleními o tom, jak by měly vypadat ideální procesy v rámci vaší organizace. Možná zjistíte, že pro vaši organizaci v počátečních fázích postačí Dependency Check nebo Dependency Track, zatímco podniková řešení přijdou jako logické pokračování v důsledku narůstající složitosti vyvíjených aplikací.
Příloha A. Výsledky vztahující se k komponentům
Značení:
- High — zranitelnosti vysoké a kritické úrovně v komponentu
- Medium — zranitelnosti střední úrovně kritičnosti v komponentu
- TRUE — Odpovídající zranitelnost (True positive issue)
- FALSE — Falešné pozitivní (False positive issue)
Komponenta
Nexus IQ
Dependency Check
Dependency Track
Výsledek
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
komponent nebyl nalezen
TRUE
spring-web:3.0.5
High
komponent nebyl nalezen
High
TRUE
spring-context:3.0.5
Medium
komponent nebyl nalezen
—
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
Příloha B. Výsledky vztahující se k zranitelnostem
Značení:
- High — zranitelnosti vysoké a kritické úrovně v komponentu
- Medium — zranitelnosti střední úrovně kritičnosti v komponentu
- TRUE — Odpovídající zranitelnost (True positive issue)
- FALSE — Falešné pozitivní (False positive issue)
Komponenta
Nexus IQ
Dependency Check
Dependency Track
Závažnost
Výsledek
Komentář
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
Duplikuje RCE(OSSINDEX)
—
CVE-2017-15708
CVE-2017-15708
High
FALSE
Duplikuje 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
Zranitelnost se vztahuje pouze na verze 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
Stejná zranitelnost jako CVE-2019-2692, ale s dodatkem „útoky mohou mít významný dopad na další produkty“
—
CVE-2017-15945
—
High
FALSE
Nelze se vztahovat na mysql-connector-java
—
CVE-2020-2933
—
Low
FALSE
Duplikát k CVE-2020-2934
CVE-2020-2934
CVE-2020-2934
—
Medium
TRUE
spring-expression:3.0.5
CVE-2018-1270
komponent nebyl nalezen
—
High
TRUE
CVE-2018-1257
—
—
Medium
TRUE
spring-web:3.0.5
CVE-2016-1000027
komponent nebyl nalezen
—
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
Ukázkový příklad v prospěch IQ: „Tým pro výzkum bezpečnosti Sonatype zjistil, že tato zranitelnost byla zavedena ve verzi 3.0.2.RELEASE a ne 5.0.x, jak je uvedeno v doporučení.“
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
komponent nebyl nalezen
—
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
Duplikát této zranitelnosti v spring-web
—
CVE-2013-4152
—
Medium
FALSE
Zranitelnost se vztahuje k komponentu spring-web
—
CVE-2013-6429
CVE-2013-6429
Medium
FALSE
Zranitelnost se vztahuje k komponentu spring-web
—
CVE-2013-6430
—
Medium
FALSE
Zranitelnost se vztahuje k komponentu spring-web
—
CVE-2013-7315
CVE-2013-7315
Medium
FALSE
SPLIT z CVE-2013-4152. + Zranitelnost se vztahuje k komponentu spring-web
—
CVE-2014-0054
CVE-2014-0054
Medium
FALSE
Zranitelnost se vztahuje k komponentu spring-web
—
CVE-2014-0225
—
High
FALSE
Zranitelnost se vztahuje k komponentu spring-web
—
—
CVE-2014-0225
High
FALSE
Duplikát této zranitelnosti v spring-web
—
CVE-2014-1904
CVE-2014-1904
Medium
FALSE
Zranitelnost se vztahuje k komponentu spring-web-mvc
—
CVE-2014-3625
CVE-2014-3625
Medium
FALSE
Zranitelnost se vztahuje k komponentu spring-web-mvc
—
CVE-2016-9878
CVE-2016-9878
High
FALSE
Zranitelnost se vztahuje k komponentu spring-web-mvc
—
CVE-2018-1270
CVE-2018-1270
High
FALSE
Pro spring-expression / spring-messages
—
CVE-2018-1271
CVE-2018-1271
Medium
FALSE
Zranitelnost se vztahuje k komponentu 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
Zranitelnost se nevztahuje na spring-tx
—
CVE-2011-2894
—
High
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2013-4152
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2013-6429
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2013-6430
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2013-7315
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2014-0054
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2014-0225
—
High
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2014-1904
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2014-3625
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2016-9878
—
High
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2018-1270
—
High
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2018-1271
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
—
CVE-2018-1272
—
Medium
FALSE
Zranitelnost se nevztahuje na spring-tx
struts-core:1.3.8
—
CVE-2011-5057 (OSSINDEX)
Medium
FASLE
Zranitelnost v Struts 2
—
CVE-2012-0391 (OSSINDEX)
CVE-2012-0391
High
FALSE
Zranitelnost v Struts 2
—
CVE-2014-0094 (OSSINDEX)
CVE-2014-0094
Medium
FALSE
Zranitelnost v Struts 2
—
CVE-2014-0113 (OSSINDEX)
CVE-2014-0113
High
FALSE
Zranitelnost v Struts 2
CVE-2016-1182
3VE-2016-1182
—
High
TRUE
—
—
CVE-2011-5057
Medium
FALSE
Zranitelnost v Struts 2
—
CVE-2012-0392 (OSSINDEX)
CVE-2012-0392
High
FALSE
Zranitelnost v Struts 2
—
CVE-2012-0393 (OSSINDEX)
CVE-2012-0393
Medium
FALSE
Zranitelnost v Struts 2
CVE-2015-0899
CVE-2015-0899
—
High
TRUE
—
CVE-2012-0394
CVE-2012-0394
Medium
FALSE
Zranitelnost v Struts 2
—
CVE-2012-0838 (OSSINDEX)
CVE-2012-0838
High
FALSE
Zranitelnost v Struts 2
—
CVE-2013-1965 (OSSINDEX)
CVE-2013-1965
High
FALSE
Zranitelnost v Struts 2
—
CVE-2013-1966 (OSSINDEX)
CVE-2013-1966
High
FASLE
Zranitelnost v Struts 2
—
CVE-2013-2115
CVE-2013-2115
High
FASLE
Zranitelnost v Struts 2
—
CVE-2013-2134 (OSSINDEX)
CVE-2013-2134
High
FASLE
Zranitelnost v Struts 2
—
CVE-2013-2135 (OSSINDEX)
CVE-2013-2135
High
FASLE
Zranitelnost v Struts 2
CVE-2014-0114
CVE-2014-0114
—
High
TRUE
—
CVE-2015-2992
CVE-2015-2992
Medium
FALSE
Zranitelnost v Struts 2
—
CVE-2016-0785 (OSSINDEX)
CVE-2016-0785
High
FALSE
Zranitelnost v Struts 2
CVE-2016-1181
CVE-2016-1181
—
High
TRUE
—
CVE-2016-4003 (OSSINDEX)
CVE-2016-4003
High
FALSE
Zranitelnost v Struts 2
xwork-core:2.3.30
CVE-2017-9804
—
—
High
TRUE
SONATYPE-2017-0173
—
—
High
TRUE
CVE-2017-7672
—
—
High
FALSE
Duplikát k 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
Duplikát k CVE-2018-1327
—
CVE-2017-9804
—
High
TRUE
—
CVE-2017-9805
CVE-2017-9805
High
TRUE
CVE-2016-4003
—
—
Medium
FALSE
Platí pro Apache Struts 2.x až do 2.3.28, což je verze 2.3.30. Nicméně, podle popisu, CVE platí pro všechny verze Struts 2, pokud se používá JRE 1.7 nebo starší. Zřejmě se zde rozhodli pro jistotu, ale vypadá to spíše jako FALSE
—
CVE-2018-1327
CVE-2018-1327
High
TRUE
CVE-2017-5638
CVE-2017-5638
CVE-2017-5638
High
TRUE
To je ta zranitelnost, kterou zneužili útočníci v Equifaxu v roce 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
Pro struts2-core
—
CVE-2013-2115
—
High
FALSE
Pro struts2-core
—
CVE-2014-0114
—
High
FALSE
Pro commons-beanutils
—
CVE-2015-0899
—
High
FALSE
Není relevantní pro taglib
—
CVE-2015-2992
—
Medium
FALSE
Platí pro struts2-core
—
CVE-2016-1181
—
High
FALSE
Není relevantní pro taglib
—
CVE-2016-1182
—
High
FALSE
Není relevantní pro taglib
struts-tiles-1.3.8
—
CVE-2012-0394
—
Medium
FALSE
Pro struts2-core
—
CVE-2013-2115
—
High
FALSE
Pro struts2-core
—
CVE-2014-0114
—
High
FALSE
Pod commons-beanutils
—
CVE-2015-0899
—
High
FALSE
Není relevantní pro tiles
—
CVE-2015-2992
—
Medium
FALSE
Pro struts2-core
—
CVE-2016-1181
—
High
FALSE
Není relevantní pro taglib
—
CVE-2016-1182
—
High
FALSE
Není relevantní pro taglib
Zdroj: habr.com
