Nastavte skenování závislostí

Kontrola závislostí v GitHub Advanced Security pro Azure DevOps detekuje opensourcové komponenty používané ve zdrojovém kódu a zjistí, jestli existují nějaká související ohrožení zabezpečení. Všechny zjištěné zranitelnosti z opensourcových komponent se označí jako výstraha. Budete potřebovat GitHub Advanced Security pro Azure DevOps, nebo pokud používáte samostatné prostředí, je povolené GitHub Code Security pro Azure DevOps.

Pokročilé zabezpečení GitHubu pro Azure DevOps funguje s Azure Repos. Pokud chcete používat GitHub Advanced Security s úložišti GitHub, přečtěte si téma GitHub Advanced Security .

Požadavky

Kategorie Požadavky
Oprávnění – Zobrazení souhrnu všech výstrah pro úložiště: Přispěvatel oprávnění k úložišti.
– Chcete-li zavřít výstrahy v rozšířeném zabezpečení: oprávnění pro správce projektu.
- Správa oprávnění v rozšířeném zabezpečení: Člen skupiny správců kolekce projektů nebo Rozšířené zabezpečení: správa nastavení oprávnění nastavena na Povolit.
Úlohy kanálu – V Nastavení organizace>KanályNastavení>> se ujistěte, že možnost Zakázat úlohy Marketplace je vypnutá. Kontrola kódu a kontrola závislostí závisí na Azure Pipelines úlohách distribuovaných prostřednictvím Visual Studio Marketplace. Pokud zakážete úlohy z Marketplace, výchozí nastavení nemůže spustit kontroly a pokročilé kanály nastavení můžou hlásit, že úloha chybí. Další informace naleznete v tématu Správa úkolů.

Další informace o pokročilých oprávněních zabezpečení naleznete v tématu Správa oprávnění Advanced Security.

O kontrole závislostí

Kontrola závislostí vygeneruje výstrahu pro libovolnou open-source komponentu, přímou nebo transitivní, která je zranitelná a na které váš kód závisí. Přímá ohrožení zabezpečení jsou knihovny, které váš kód přímo používá. Přechodné závislosti jsou knihovny nebo jiný software, který přímé závislosti používá.

Seznamte se s detekcí závislostí pomocí skenování

Nový snímek komponent se uloží při každé změně grafu závislostí úložiště a po spuštění kanálu, který obsahuje úlohu kontroly závislostí.

Pro každou zjištěnou zranitelnou komponentu se komponenta a zranitelnost uvedou v protokolu sestavení a zobrazí jako výstraha na kartě Upřesněné zabezpečení. Výstrahy kontroly závislostí vytvářejí pouze poradci, kteří byli zkontrolováni GitHubem a přidáni do databáze poradců GitHubu. Protokol sestavení obsahuje odkaz na jednotlivá upozornění pro další šetření. Další informace o podrobnostech výstrah najdete v tématu Jak opravit výstrahy kontroly závislostí.

Protokol sestavení obsahuje také základní informace o každé zjištěné chybě zabezpečení. Mezi tyto podrobnosti patří závažnost, ovlivněná komponenta, název chyby zabezpečení a související CVE.

Snímek obrazovky s výstupem sestavení skenování závislostí.

Note

Kontrola závislostí vyžaduje spuštění kanálu nakonfigurovaného pro AdvancedSecurity-Dependency-Scanning@1 úlohu nebo spuštění kanálu v úložišti s povolenou výchozí instalací kontroly závislostí. Povolení rozšířeného zabezpečení nebo zabezpečení kódu nespustí kontrolu závislostí automaticky.

Seznam podporovaných ekosystémů komponent a verzí najdete v tématu Podporované ekosystémy balíčků.

Zjistěte více o výstrahách kontroly závislostí

Karta Rozšířené zabezpečení v Azure DevOps je centrum pro zobrazení výstrah zabezpečení, které ve výchozím nastavení zobrazuje výstrahy kontroly závislostí. Můžete filtrovat podle větve, kanálu, balíčku, závažnosti, rozsahu závislostí a percentilu EPSS (Exploit Prediction Scoring System). Můžete si vybrat upozornění, kde najdete další podrobnosti, včetně pokynů k nápravě. Momentálně centrum upozornění nezobrazuje výstrahy pro dokončené skenování na větvích pull requestů.

Když je ve vašem úložišti zjištěn ohrožený balíček, oprava upozornění na kontrolu závislostí obvykle zahrnuje aktualizaci na vyšší verzi balíčku nebo odstranění problematického balíčku. Toto doporučení platí pro přímé i přechodné (nebo nepřímé) závislosti. Výchozí zobrazení na kartě Rozšířené zabezpečení je aktivní upozornění pro výchozí větev úložiště.

Pokud se kanály nebo větve přejmenují, výsledky se neprojeví – může to trvat až 24 hodin, než se zobrazí nový název.

Snímek obrazovky stránky upozornění skenování závislostí s filtry Rozsah a percentil EPSS.

Určení priority výstrah podle rozsahu závislostí

Rozsah závislostí označuje, jestli je ohrožená závislost používána za běhu nebo pouze během vývoje. Na stránce Upozornění použijte filtr Rozsah s možností jednoho výběru k zobrazení upozornění na závislosti modulu runtime nebo vývojové.

Závislosti určené pouze pro vývoj zobrazují v seznamu výstrah odznak Vývoj. Podrobnosti výstrahy také zobrazují obor závislosti, když výsledek kontroly obsahuje tato metadata. Pokud metadata rozsahu nejsou k dispozici, Advanced Security vynechá štítek a podrobnosti o rozsahu, aniž by změnila jakékoli jiné chování upozornění.

Rozsah se vztahuje na konkrétní výsledek závislosti, nikoli globálně na balíček. Stejný balíček může mít jiný rozsah, pokud je zjištěn v jiné cestě závislostí nebo v jiném projektu.

Stanovení priority výstrah pomocí EPSS

Systém EPSS (Exploit Prediction Scoring System) odhaduje pravděpodobnost, že bude softwarová zranitelnost zneužita ve skutečném provozu. EPSS poskytuje skóre i percentil; Advanced Security zobrazuje percentil u výstrah kontroly závislostí. Vyšší percentil znamená, že zranitelnost je hodnocena výše z hlediska pravděpodobnosti předpokládaného zneužití ve srovnání s ostatními hodnocenými zranitelnostmi.

Při stanovení priority nápravy používejte percentil EPSS společně se závažností. Závažnost odráží potenciální dopad ohrožení zabezpečení, zatímco EPSS pomáhá vyhodnotit, jak pravděpodobné je zneužití. Na stránce Výstrahy použijte filtr percentilu EPSS k určení rozsahu percentilu a zaměřte se na výstrahy závislostí, které splňují daný rozsah. Hranice rozsahu jsou inkluzivní a kombinují se s jinými filtry, které použijete.

Percentil EPSS seskupuje chyby zabezpečení do následujících kategorií:

Percentil EPSS Kategorie
90–100% Velmi vysoká
70–90% Vysoká
50–70% Střední
0–50% Nízká

Data EPSS nejsou k dispozici pro každou radu. Pokud výstraha neobsahuje metadata EPSS, advanced Security v podrobnostech výstrahy nezobrazí percentil EPSS. Chybějící metadata nemají vliv na závažnost, stav nebo pokyny k nápravě výstrahy.

Stav výstrahy se automaticky aktualizuje na Closed, když se ohrožená komponenta už nezjistí v nejnovějším buildu pro všechny potrubí, ve kterých je nainstalovaná úloha skenování závislostí. Pokud chcete zobrazit vyřešená upozornění, použijte State filtr na hlavním panelu nástrojů a vyberte Closed.

Snímek obrazovky se zobrazením výstrah kontroly uzavřených závislostí

Pokud pro úložiště vypnete pokročilé zabezpečení, ztratíte přístup k výsledkům na kartě Pokročilé zabezpečení a v úloze sestavení. Úloha sestavení neselže, ale jakékoli výsledky ze sestavení provedených s úlohou, zatímco je rozšířené zabezpečení zakázáno, jsou skryté a nejsou uchovány.

Podrobnosti výstrahy

Můžete také přejít k podrobnostem o upozornění kliknutím na konkrétní výstrahu a pokyny k nápravě.

Snímek obrazovky s informacemi o percentilu hrozby EPSS v upozornění na kontrolu závislostí.

Sekce Vysvětlení
Scope Rozsah označuje, jestli se ohrožená závislost používá za běhu nebo pouze během vývoje. Tyto informace se zobrazí pouze v případě, že jsou pro výsledek k dispozici metadata oboru závislostí.
Percentil EPSS Percentil EPSS označuje, jak se ohrožení zabezpečení řadí k predikované pravděpodobnosti zneužití vzhledem k jiným skóre ohrožení zabezpečení. Tento řádek se zobrazí pouze v případě, že jsou pro poradce k dispozici metadata EPSS.
Doporučení Text doporučení pochází přímo od našeho poskytovatele dat o zranitelnostech, GitHub Advisory Database. Pokyny obvykle navrhují upgrade identifikované komponenty na nezranitelnou verzi.
Umístění V části Umístění jsou podrobně popsány cesty, ve kterých úloha kontroly závislostí zjistí, že se používá zranitelná komponenta. Pokud lze soubor určit z podrobného skenu sestavení jako schválený soubor ve zdroji, zobrazí se karta umístění jako odkaz, na který lze kliknout. Pokud byl soubor vytvořen jako součást sestavení (například artefakt sestavení), na odkaz nelze kliknout. Projděte si protokoly sestavení, abyste lépe pochopili, jak byla komponenta přenesena do sestavení.
Popis Popis je poskytován popisem GitHub Advisory.

Detekce

Kanály uvedené na kartě Detekce jsou kanály , ve kterých byla nalezena ohrožená komponenta. Každý řádek podrobně popisuje nejnovější build ovlivněného kanálu a datum prvního zavedení balíčku. Pokud je ohrožený balíček v některých kanálech opravený, ale ne ve všech, zobrazí se částečně opravené řádky.

Snímek obrazovky se zobrazením zjišťování závislostí pro výstrahu bez opravy

Jakmile se výstraha vyřeší, automaticky se přesune do stavu Closed a na kartě Detekce se zobrazí zelená značka zaškrtnutí, což znamená, že kód s aktualizovanou komponentou byl spuštěn v této pipeline.

Snímek obrazovky se zobrazením zjišťování závislostí pro výstrahu

Závažnost

Poradní databáze GitHubu poskytuje skóre CVSS, které se pak přeloží na nízkou, střední, vysokou nebo kritickou závažnost výstrahy pomocí následujících pokynů:

CVSS skóre Závažnost
1,0 < Skóre < 4,0 Nízká
4,0 < Skóre < 7,0 Střední
7,0 < Skóre < 9,0 Vysoká
Skóre >= 9,0 Kritické

Vyhledání podrobností

V části Hledání podrobností se běžně nacházejí dvě části: ohrožený balíček a kořenová závislost. Ohrožený balíček je potenciálně zranitelná komponenta. Oddíl kořenové závislosti obsahuje komponenty nejvyšší úrovně, které zodpovídají za řetěz závislostí, který vede k ohrožení zabezpečení.

Pokud se na ohrožený balíček odkazuje jenom jako na přímou závislost, zobrazí se jenom část "ohrožený balíček".

Pokud se na ohrožený balíček odkazuje jako na přímou i tranzitivní závislost, balíček se zobrazí v části "ohrožený balíček" i "kořenová závislost".

Pokud se na ohrožený balíček odkazuje pouze jako tranzitivní závislost, balíček se zobrazí v části "ohrožený balíček" a kořenové závislosti odkazující na ohrožený balíček se zobrazí v části "Kořenová závislost".

Správa výstrah kontroly závislostí

Zobrazení upozornění pro úložiště

Ve výchozím nastavení se na stránce upozornění zobrazují výsledky kontroly závislostí pro výchozí větev úložiště.

Stav výstrahy odráží stav výchozí větve a nejnovějšího kanálu spuštění, a to i v případě, že výstraha existuje v jiných větvích a kanálech.

Vygenerovat opravu pomocí Copilot Autofix

U podporovaného upozornění na ohrožení zabezpečení závislosti vyberte možnost Generovat opravu, aby Copilot Autofix navrhl změnu a otevřel žádost o přijetí změn. Zkontrolujte, otestujte a slučte navrhovanou opravu a pak znovu spusťte kontrolu závislostí a ověřte výsledek.

Agentic Autofix může používat pokyny v repozitáři po check-inu a relevantní dovednosti, které pomohou navrhované opravě dodržovat vaše kódovací standardy. Je v omezené veřejné verzi Preview a nepodporuje zjištění malwaru. Požadavky, zprovoznění a pokyny ke kontextu úložiště najdete v tématu Copilot Autofix pro výstrahy zabezpečení kódu.

Automatické vyčištění výstrah z zastaralých konfigurací kanálu

Automatické vyčištění skryje staré výsledky skenování, když se konfigurace pipeline přestanou spouštět. Upozornění se neskryje jednoduše, protože upozornění nebo jeho větev jsou starší než 90 dní. Toto chování platí pro výstrahy kontroly kódu i závislostí.

Co dělá konfiguraci zastaralou?

Vyčištění používá nejnovější čas dokončení fáze kanálu přidružené ke konfiguraci skenování. Fáze se stane zastaralou, když je tato doba dokončení ve výchozím nastavení před více než 90 dny.

Advanced Security označuje záznam fáze pipeline jako neaktivní, ale zachovává jeho výsledky. Zobrazení výstrahy pak skryje výstrahu pouze v případě, že všechny nejnovější výsledky přidružené k této výstraze pocházejí z zastaralých konfigurací. Pokud některý z těchto výsledků pochází z aktivní konfigurace, může se upozornění stále zobrazovat.

Datum nebo aktivita Používá se pro 90denní vyčištění?
Při prvním zjištění výstrahy No
Kdy byla výstraha naposledy zjištěna No
Kdy byl branch naposledy naskenován Ne samostatně. Vyčištění sleduje přidruženou fázi pipeline, kterou je možné sdílet napříč větvemi.
Poslední čas dokončení přidružené fáze pipeline Ano

Proč může stará detekce větve zůstat viditelná nebo se znovu objevit?

Různé větve můžou sdílet stejný záznam aktivity fáze pipeline. Když se tato fáze znovu spustí v jiné větvi, Advanced Security aktualizuje čas dokončení a znovu aktivuje přidružené konfigurace. Díky tomu starší detekce ve větvi, která se v poslední době nespustila, můžou zůstat viditelné nebo se znovu zobrazit.

Představte si například tuto sekvenci:

  1. Fáze pipeline detekuje zranitelnost na develop.
  2. Tato fáze se nespustí na žádné větvi po dobu delší než 90 dnů. Jakmile ho vyčištění označí jako neaktivní, Advanced Security výstrahu skryje, pokud nemá žádné nejnovější výsledky z jiných aktivních konfigurací.
  3. Stejná fáze běží na feature/update-build. Advanced Security znovu aktivuje přidružené konfigurace, takže se starší detekce develop může znovu objevit.

Běh na feature/update-build neskenuje develop. Změní stav aktivity sdílené fáze pipeline, která určuje, jestli Advanced Security zobrazuje starší výsledek.

Z tohoto důvodu se může zobrazit upozornění se starým datem prvního nebo posledního výskytu. Tato data popisují detekci ve větvi, ne stav aktivity fáze pipeline. Opětovná aktivace konfigurace nezpůsobí, že se starší výsledek bude považovat za novou detekci, ani nevyžaduje změnu původního data prvního zjištění.

Co byste měli zkontrolovat?

Pokud stará detekce zůstane viditelná, zkontrolujte spuštění stejné fáze kanálu napříč větvemi, nejen větev zobrazenou v upozornění. Pokud chcete zkontrolovat, jestli v této větvi stále existuje ohrožení zabezpečení, spusťte skenování této větve.

Important

Automatické vyčištění skryje výsledky. Neopraví to ohrožení zabezpečení ani nezavře výstrahu. Pokud se přidružená konfigurace znovu aktivuje, můžou se dříve skrytá otevřená upozornění vrátit jako otevřená upozornění.

Oprava výstrah kontroly závislostí

Přímá závislost je komponenta, kterou máte ve svém úložišti. Tranzitivní nebo nepřímá závislost je komponenta, která je používána přímou závislostí. Váš projekt je stále zranitelný bez ohledu na to, jestli se ohrožení zabezpečení nachází v přímé nebo přechodné závislosti.

Oprava zranitelné přechodné závislosti má obvykle formu explicitního přepsání verze zranitelné komponenty používané pro každou identifikovanou přímou závislost. Jakmile kořenové závislosti upgradují použití ohrožené komponenty na bezpečnou verzi, můžete upgradovat každou kořenovou závislost místo více jednotlivých přepsání.

Aktualizace závislostí pro Yarn/Npm

Představme si, že tento balíček má dvě zranitelnosti. Jedna je pro axios, přímou závislost, a druhá je pro acorn, tranzitivní závislost (také známá jako nepřímá závislost nebo závislost závislosti).

{
 "name": "my-package",
 "version": "1.0.0",
 "dependencies": {
   "axios": "0.18.0",
   "eslint": "5.16.0",
 }
}

Aktuální verze axios má zranitelnost typu nedostupnost služby (DoS) s doporučením k aktualizaci na verzi 0.18.1 nebo vyšší. Vzhledem k tomu, že se jedná o přímou závislost, máte kontrolu nad verzí axios , kterou používáte. Stačí jen aktualizovat verzi axios , kterou načítáte. package.json Aktualizace vypadá nějak takto:

{
  "name": "my-package",
  "version": "1.0.0",
  "dependencies": {
    "axios": "0.19.2",
    "eslint": "5.16.0",
  }
}

Nyní verze eslint zobrazená v package.json závisí na verzi acorn, která představuje zranitelnost typu regulární výraz odepření služby, "Re-DoS", s doporučením k aktualizaci na verzi 5.7.4, 6.4.1, 7.1.1 nebo vyšší. Pokud z nástroje pro kontrolu závislostí obdržíte upozornění, měli byste zjistit kořenovou závislost, která vyžaduje zranitelnou závislost.

Příze

Pokud používáte Yarn, můžete použít yarn, proč najít kompletní řetěz závislostí.

> $ yarn why acorn
 yarn why v1.22.4
 [1/4] Why do we have the module "acorn"...?
 [2/4] Initialising dependency graph...
 [3/4] Finding dependency...
 [4/4] Calculating file sizes...
 => Found "acorn@6.4.0"
 info Reasons this module exists
   - "eslint#espree" depends on it
   - Hoisted from "eslint#espree#acorn"
 info Disk size without dependencies: "1.09MB"
 info Disk size with unique dependencies: "1.09MB"
 info Disk size with transitive dependencies: "1.09MB"
 info Number of shared dependencies: 0
 Done in 0.30s.

Úplný řetěz závislostí je eslint>espree>acorn. Jakmile zjistíte řetězec závislostí, můžete použít jinou funkci Yarn, nazývanou selektivní rozlišení závislostí, k přepsání používané verze acorn.

K definování přepsání verze použijte pole package.json rozlišení. Zobrazí se tři různé metody přepsání balíčku v pořadí od nejhoršího k nejlepšímu:

{
  "name": "yarn-resolutions",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.19.2",
    "eslint": "5.16.0"
  },
  "resolutions": {
    // DO NOT USE!
    "**/acorn": "6.4.1",
    // BETTER
    "eslint/**/acorn": "6.4.1",
    // BEST
    "eslint/espree/acorn": "6.4.1"
  }
}

Použití vzoru **/acorn přepíše všechna použití balíčku acorn pro všechny závislosti. Je to nebezpečné a dochází k chybám za běhu, takže jsme jej odstranili ve verzi Yarn v2.

eslint/**/acorn Použití vzoru přepíše všechna použití balíčku acorn pod balíčkem eslint a v balíčcích, od kterých závisí. Je bezpečnější než přepsání balíčku pro všechny závislosti, ale přesto má určitá rizika, pokud je graf závislostí pro balíček velký. Tento vzor se doporučuje, pokud existuje mnoho dílčích balíčků, které používají ohrožený balíček, a definování přepsání pro jednotlivé dílčí balíčky by bylo nepraktické.

Použití vzoru eslint/espree/acorn přepíše pouze použití acorn v balíčku espree v balíčku eslint. Zaměřuje se konkrétně na ohrožený řetězec závislostí a je doporučeným způsobem, jak přepsat verze balíčků.

npm

Pokud používáte npm 8.3 nebo vyšší, můžete v package.json použít pole overrides.

Přidejte přepsání, pokud potřebujete provést konkrétní změny přechodných závislostí. Můžete například potřebovat přepsat verzi závislosti známým problémem se zabezpečením, nahradit existující závislost forkem nebo zajistit, aby se stejná verze balíčku používala všude.

{
  "name": "npm-overrides",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.19.2",
    "eslint": "5.16.0"
  },
   "overrides":{
       "eslint": {
        "espree": {
          "acorn": "6.4.1"
        }
    }
   }
}

Zobrazený příklad přepsání ukazuje způsob, jak npm říct "přepsat pouze použití acorn v espree balíčku v eslint balíčku". Konkrétně se zaměřuje na ohrožený řetězec závislostí a je doporučeným způsobem přepsání verzí balíčků. Přepisování je nativní funkcionalitou npm. Poskytuje způsob, jak nahradit balíček ve stromu závislostí jinou verzí nebo zcela jiným balíčkem.

Po nastavení přepsání musíte odstranit package-lock.json a node_modules spustit npm install znovu.

Neměli byste nastavovat přepsání balíčku, na který přímo závisíte, pokud pouze závislost i samotné přepsání mají stejnou specifikaci. Řekněme například, že axios: "0.18.0" je zranitelná a hledáme upgrade na axios: "0.19.2". Přímo změňte verzi závislosti místo použití přepisu.

{
  "name": "npm-overrides",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.18.0"
  },
  "overrides": {
    // BAD, will throw an EOVERRIDE error
    // "axios": "0.19.2",
  }
}

Aktualizujte verzi závislosti bez nastavení překrytí.

{
  "name": "npm-overrides",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "axios": "0.19.2"
  }
}

Aktualizace závislostí pro Maven

Mechanismus řešení závislostí není tak sofistikovaný jako ten, který se používá v Yarnu. V důsledku toho můžete mít v projektu jenom jednu verzi závislosti. K vyřešení tohoto problému používá Maven algoritmus "nejbližší vyhrává". To znamená, že používá verzi nejbližší závislosti k vašemu projektu ve stromu závislostí.

Máte například následující graf závislostí:

your-project --- A:1.0.0 --- B:2.0.0
      \
       \__ B:1.0.0

your-project závisí na A:1.0.0tom , na kterém zase závisí B:2.0.0 , ale váš projekt má také přímou závislost na B:1.0.0. Proto máte v grafu závislostí B dvě různé verze závislostí B, ale verze 1.0.0 závislosti B vyhraje, protože je "nejbližší" k vašemu projektu.

V některých případech může tento scénář fungovat, pokud jsou verze kompatibilní. Pokud A:1.0.0 ale závisí na některé funkci B, která je k dispozici pouze ve verzi 2.0.0 , toto chování nefunguje. V nejhorším případě může tento projekt stále kompilovat, ale v době běhu selže.

Podívejme se na skutečný příklad.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.microsoft.customer360</groupId>
  <artifactId>maven-dependencies</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>maven-dependencies</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.jaxrs</groupId>
      <artifactId>jackson-jaxrs-json-provider</artifactId>
      <version>2.10.3</version>
    </dependency>
</project>

Řekněme, že verze com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider, na které závisíte, závisí na verzi com.fasterxml.jackson.core:jackson-databind, která má chybu zabezpečení deserializace nedůvěryhodných dat.

Tuto závislost můžete ověřit pomocí pluginu Maven dependency. V takovém případě byste spustili mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind a získali následující výstup:

> $ mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind
 [INFO] Scanning for projects...
 [INFO]
 [INFO] ------------< com.microsoft.customer360:maven-dependencies >------------
 [INFO] Building maven-dependencies 1.0-SNAPSHOT
 [INFO] --------------------------------[ jar ]---------------------------------
 [INFO]
 [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-dependencies ---
 [INFO] com.microsoft.customer360:maven-dependencies:jar:1.0-SNAPSHOT
 [INFO] \- com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:jar:2.10.3:compile
 [INFO]    \- com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:jar:2.10.3:compile
 [INFO]       \- com.fasterxml.jackson.core:jackson-databind:jar:2.10.3:compile
 [INFO] ------------------------------------------------------------------------
 [INFO] BUILD SUCCESS
 [INFO] ------------------------------------------------------------------------
 [INFO] Total time:  0.928 s
 [INFO] Finished at: 2020-04-27T14:30:55+02:00
 [INFO] ------------------------------------------------------------------------

Nejprve zkontrolujte, jestli existuje nová verze com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider , která nezávisí na ohrožené verzi com.fasterxml.jackson.core:jackson-databind. Pokud ano, můžete upgradovat com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider a tam se zastavit. Pokud ne, přepište verzi souboru com.fasterxml.jackson.core:jackson-databind.

Jak je znázorněno ve fragmentu kódu, při použití Mavenu platí, že "nejbližší má přednost", takže řešením je přidat přímou závislost na com.fasterxml.jackson.core:jackson-databind, která odstraní zranitelnost.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.microsoft.customer360</groupId>
  <artifactId>maven-dependencies</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>maven-dependencies</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.jaxrs</groupId>
      <artifactId>jackson-jaxrs-json-provider</artifactId>
      <version>2.10.3</version>
    </dependency>
    <!-- Dependency resolutions -->
    <!-- jackson-jaxrs-json-provider -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.10.4</version>
    </dependency>
  </dependencies>
</project>

Opětovným spuštěním mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind příkazu můžete ověřit, že řešení funguje.

$ mvn dependency:tree -Dincludes=com.fasterxml.jackson.core:jackson-databind
[INFO] Scanning for projects...
[INFO]
[INFO] ------------< com.microsoft.customer360:maven-dependencies >------------
[INFO] Building maven-dependencies 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-dependencies ---
[INFO] com.microsoft.customer360:maven-dependencies:jar:1.0-SNAPSHOT
[INFO] \- com.fasterxml.jackson.core:jackson-databind:jar:2.9.10.4:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.827 s
[INFO] Finished at: 2020-04-27T14:32:42+02:00
[INFO] ------------------------------------------------------------------------

Doporučujeme přidat komentář poblíž řešení závislostí, aby každý, kdo přijde později, věděl, proč závislost existuje. Je možné ji odebrat, jakmile kořenová závislost použije novou verzi; jinak se hromadí závislosti.

V reálném projektu přidejte závislost co nejvýše v hierarchii. Můžete například přidat rozlišení do nadřazeného souboru POM místo jednotlivě v každém souboru POM projektu.

Aktualizace závislostí pro NuGet

Algoritmus řešení závislostí použitý v NuGetu je podobný Mavenu, protože lze použít pouze jednu verzi závislosti. NuGet však nezafixuje verze závislostí.

Pokud máte například závislost <PackageReference Include="A" Version="1.2.3" />, můžete očekávat, že tento balíček bude ekvivalentní = 1.2.3, ale ve skutečnosti to znamená >= 1.2.3. Pokud chcete připnout přesnou verzi, měli byste použít Version="[1.2.3]". Další informace najdete v dokumentaci k rozsahu verzí NuGet.

Kromě výchozího chování rozsahu NuGet obnoví nejnižší platnou verzi, aby vyhovovala rozsahu. Toto chování znamená, že v mnoha případech musíte definovat rozsah.

Pojďme se podívat na tento ukázkový projekt, který má závislost na Microsoft.AspNetCore.App:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>NuGet.Dependencies</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.14" />
  </ItemGroup>
</Project>

Závisí na verziMicrosoft.AspNetCore.Http.Connections, která je zranitelná vůči ohrožení zabezpečení vzdáleného spuštění kódu (RCE).

Nejprve byste měli zkontrolovat, jestli existuje aktualizovaná verze Microsoft.AspNetCore.App , která závisí na novější verzi Microsoft.AspNetCore.Http.Connections. Pokud ano, můžete upgradovat Microsoft.AspNetCore.App a zastavit tady. Pokud ne, musíte přepsat verzi, na které Microsoft.AspNetCore.Http.Connections závisí.

NuGet nemá ekvivalent příkazů yarn why nebo mvn dependency:tree integrovaných, takže nejjednodušší způsob, jak zobrazit strom závislostí, je často navštívit nuget.org. Pokud navštívíte stránku NuGet pro Microsoft.AspNetCore.App, uvidíte, že závisí na Microsoft.AspNetCore.Http.Connectionsversion >= 1.0.4 && < 1.1.0. Nebo v rozsahu verzí NuGet je reprezentativní syntaxe [1.0.4,1.1.0).

Zranitelnost RCE byla ve Microsoft.AspNetCore.Http.Connections opravena ve verzi 1.0.15, takže je třeba přepsat rozsah verzí na[1.0.15, 1.1.0).

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>NuGet.Dependencies</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
  </ItemGroup>

  <ItemGroup Label="Dependency Resolutions">
    <!-- Microsoft.AspNetCore.App -->
    <PackageReference Include="Microsoft.AspNetCore.Http.Connections" Version="[1.0.15,1.1.0)" />
  </ItemGroup>
</Project>

Doporučujeme přidat komentář blízko řešení závislostí, aby každý, kdo přijde později, věděl, proč tam závislost existuje. Jakmile kořenová závislost použije novou verzi, je možné ji odebrat. Jinak se hromadí závislosti.

Co když není k dispozici žádná oprava?

Pokud není k dispozici žádná známá oprava, jsou k dispozici následující možnosti jako jiné metody nápravy, dokud nebude k dispozici upgradovaná komponenta:

  • Přestaňte komponentu používat a odeberte ji z kódu – toto odebrání se zjistí při příštím sestavení s nainstalovanou úlohou kontroly závislostí.
  • Přispějte k opravě samotné komponenty. Pokud má vaše organizace specifické pokyny týkající se opensourcových příspěvků, postupujte podle těchto pokynů.
  • Zavření výstrahy Výstrahy bez známé opravy ale stále můžou představovat bezpečnostní hrozbu pro vaši organizaci. Doporučujeme, abyste upozornění nezavřeli, protože neexistuje žádná známá oprava.

Zavření výstrah kontroly závislostí

Pokud chcete výstrahu zavřít, proveďte následující kroky:

  1. Přejděte na výstrahu, kterou chcete zavřít, a vyberte ji.

  2. Vyberte rozevírací seznam Zavřít upozornění.

  3. Pokud ještě nejsou vybrány, vyberte jako důvod uzavření buď Přijaté riziko nebo Falešně pozitivní.

  4. Do textového pole Komentář přidejte volitelný komentář.

  5. Výběrem možnosti Zavřít odešlete a zavřete výstrahu.

  6. Stav výstrahy se změní z otevření na uzavřeno a zobrazí váš důvod zamítnutí.

    Snímek obrazovky ukazující, jak zavřít výstrahu kontroly závislostí.

Tato akce odstraní výstrahu ve všech větvích. Ostatní větve, které obsahují stejnou chybu zabezpečení, budou také zamítnuty. Jakékoli upozornění, které jste dříve zavřeli, je možné znovu otevřít ručně.

Správa upozornění kontroly závislostí na požadavcích na přijetí změn

Pokud se v žádosti o přijetí změn vytvoří upozornění pro nové změny kódu, zobrazí se upozornění jako poznámka v části komentáře karty Přehled žádosti o přijetí změn a jako výstraha na kartě Úložiště advanced Security . Pro větev žádosti o přijetí změn je k dispozici nová položka pro výběr větví.

Můžete zobrazit manifest ovlivněného balíčku, zobrazit souhrn hledání a vyřešit poznámku v části Přehled.

Snímek obrazovky aktivní poznámky k pull requestu pro závislosti

Pokud chcete zavřít upozornění na žádosti o přijetí změn, musíte přejít do zobrazení podrobností upozornění, abyste je uzavřeli a vyřešili poznámku. V opačném případě jednoduše změna stavu komentáře (1) vyřeší poznámku, ale nezavře nebo neopraví podkladovou výstrahu.

Snímek obrazovky s anotací uzavřeného pull requestu k závislostem

Pokud chcete zobrazit celou sadu výsledků pro vaši větev pull requestu, přejděte do Úložiště>Rozšířené zabezpečení a vyberte svou větev pull requestu. Výběrem možnosti Zobrazit další podrobnosti (2) v anotaci vás přesměruje na zobrazení podrobností výstrahy na kartě rozšířeného zabezpečení.

Návod

Poznámky se vytvoří jen v případě, že ovlivněné řádky kódu jsou zcela jedinečné pro rozdíly v pull requestu ve srovnání s cílovou větví pull requestu.