Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Audity zabezpečení
Audit zabezpečení pro správce balíčků, jako je NuGet, je proces, který zahrnuje analýzu zabezpečení balíčků, které jsou součástí softwarového projektu. To zahrnuje identifikaci ohrožení zabezpečení, vyhodnocení rizik a vytváření doporučení pro zlepšení zabezpečení. Audit může zahrnovat kontrolu samotných balíčků a také všechny závislosti a související rizika. Cílem auditu je identifikovat a zmírnit všechna ohrožení zabezpečení, která by mohli útočníci zneužít, například injektáž kódu nebo skriptování mezi weby.
Dostupnost funkcí
| NuGet | .NET SDK | Visual Studio | Funkce |
|---|---|---|---|
| 5.9 | .NET 5 SDK (5.0.200) | – | dotnet list package --vulnerable |
| 6.8 | .NET 8 SDK (8.0.100) | Visual Studio 2022 17.8 | NuGetAudit pro PackageReference |
| 6.10 | – | Visual Studio 2022 17.10 | NuGetAudit pro packages.config |
| 6.11 | .NET 8 SDK (8.0.400) | Visual Studio 2022 17.11 | NuGetAuditSuppress pro PackageReference |
| 6.12 | Sada .NET 9 SDK (9.0.100) | Visual Studio 2022 17.12 | Zdroje auditu. NuGetAuditSuppress pro packages.config. |
| 7,0 | .NET 10 SDK (10.0.100) | Visual Studio 2026 |
Výchozí změny NuGetAuditMode pro .NET 10 dotnet package update --vulnerable |
Spuštění auditu zabezpečení s využitím restore
Příkaz restore se automaticky spustí při běžné operaci balíčku, jako je první načtení projektu, přidání nového balíčku, aktualizace verze balíčku nebo odebrání balíčku z projektu ve vašem oblíbeném integrovaném vývojovém prostředí (IDE).
Vaše závislosti se kontrolují v seznamu známých ohrožení zabezpečení poskytovaných zdroji auditu.
- Na příkazovém řádku přejděte do adresáře projektu nebo řešení.
- Spusťte
restorepomocí preferovaného nástroje (tj. dotnet, MSBuild, NuGet.exe, VisualStudio atd.). - Projděte si upozornění a vyřešte známá ohrožení zabezpečení.
Konfigurace auditu NuGetu
Audit lze nakonfigurovat prostřednictvím vlastností NÁSTROJE MSBuild v .csproj souboru MSBuild, který se vyhodnocuje jako součást projektu.
Doporučujeme nakonfigurovat audit na úrovni úložiště.
| MsBuild – vlastnost | Výchozí | Možné hodnoty | Poznámky |
|---|---|---|---|
| NuGetAuditMode | Viz 1 níže |
direct a all |
Pokud chcete auditovat pouze závislosti nejvyšší úrovně, můžete hodnotu nastavit na directhodnotu . NuGetAuditMode se nedá použít pro projekty packages.config. |
| NuGetAuditLevel | nízký |
low, moderate, higha critical |
Minimální úroveň závažnosti, která se má hlásit. Pokud chcete zobrazit moderate, higha critical poradce (vyloučit low), nastavte hodnotu na moderate |
| NuGetAudit | pravda |
true a false |
Pokud nechcete dostávat sestavy auditu zabezpečení, můžete se úplně odhlásit nastavením hodnoty na false |
-
NuGetAuditModemá výchozí hodnotuall, když se projekt cílí nanet10.0nebo vyšší. V opačném případěNuGetAuditModeje výchozí hodnotadirect. Když projekt pro více cílů vybereallněkterou cílovou architekturu, použije audit tuto hodnotu pro všechny cílové architektury.
Zdroje auditu
Obnovení stáhne prostředekVulnerabilityInfo a zkontroluje seznam balíčků, které jednotlivé projekty používají.
Seznam zdrojů je definován elementem auditSources v NuGet.Config a upozornění NU1905 je vyvolána, pokud některý ze zdrojů auditu neposkytuje žádné informace o ohrožení zabezpečení.
Pokud auditSources není definován nebo je vymazán bez přidání zdrojů, packageSources použije se a upozornění NU1905 se potlačí.
Vzhledem k tomu, že běžným zmírněním útoků na nahrazení balíčků je použití jednoho zdroje balíčku, který je nadřazený z nuget.org, takže NuGet není nakonfigurovaný tak, aby jako zdroj balíčku používal nuget.org, je možné zdroje auditu použít k použití nuget.org (nebo jakéhokoli jiného zdroje, který poskytuje informace o ohrožení zabezpečení), aniž by ho používal jako zdroj balíčku.
Zdrojem dat pro databázi ohrožení zabezpečení nuget.org je databáze GitHub Advisory Database. Mějte na paměti, že protokol V2 je zastaralý, takže pokud váš koncový bod nuget.config stále používá, musíte migrovat do koncového bodu V3.
<configuration>
<auditSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</auditSources>
</configuration>
Poznámka: Následující tabulka uvádí funkce, které podporují zdroje auditu.
| Představeno v | Funkce podporující zdroje auditu |
|---|---|
| NuGet 6.12, .NET 9.0.100 SDK a Visual Studio 2022 17.12 | Restore |
| NuGet 6.14, .NET 9.0.300 SDK | dotnet package list --vulnerable |
| NuGet 7.0 a Visual Studio 2026 | Podpora NuGet AuditSources v uživatelském rozhraní Správce balíčků sady Visual Studio |
Kódy upozornění
| Kód upozornění | Důvod |
|---|---|
| NU1900 | Při komunikaci se zdrojem balíčků došlo k chybě při získávání informací o ohrožení zabezpečení. |
| NU1901 | Zjištěn balíček s nízkou závažností |
| NU1902 | Balíček se střední závažností zjištěn |
| NU1903 | Balíček se zjištěnou vysokou závažností |
| NU1904 | Zjištěn balíček s kritickou závažností |
| NU1905 | Zdroj auditu neposkytuje databázi ohrožení zabezpečení. |
Sestavení můžete přizpůsobit tak, aby s těmito upozorněními zacházeli jako s chybami , abyste mohli s upozorněními zacházet jako s chybami, nebo považovat upozornění za chyby.
Pokud už například používáte <TreatWarningsAsErrors> k zacházení se všemi upozorněními (C#, NuGet, MSBuild atd.) jako s chybami, můžete zabránit <WarningsNotAsErrors>$(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors> ohrožením zabezpečení zjištěných v budoucnu, aby nedošlo k narušení sestavení.
Případně pokud chcete zachovat slabá a střední ohrožení zabezpečení jako upozornění, ale zacházet s velkými a kritickými chybami jako s chybami a nepoužíváte TreatWarningsAsErrors, můžete použít <WarningsAsErrors>$(WarningsAsErrors);NU1903;NU1904</WarningsAsErrors>.
Poznámka:
Vlastnosti nástroje MSBuild pro závažnost zprávy, například NoWarn a TreatWarningsAsErrors nejsou podporovány pro projekty packages.config.
Vyloučení informačních zpravodajů
Poradní upozornění můžete vyloučit přidáním nové NuGetAuditSuppress položky MSBuild pro každé upozornění.
NuGetAuditSuppress Definujte položku s metadaty nastavenými Include= na adresu URL poradce, kterou chcete potlačit.
<ItemGroup>
<NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>
Podobně jako u ostatních vlastností NuGetAuditSuppress konfigurace auditu NuGet je možné položky definovat na úrovni projektu nebo úložiště.
NuGetAuditSuppress je k dispozici pro projekty PackageReference počínaje sadou NuGet 6.11, Visual Studio 17.11 a sadou .NET 8.0.400 SDK.
Je k dispozici pro packages.config ze sady Visual Studio 17.12 a NuGet 6.12.
Kdy vyloučit poradce
Ve scénářích, ve kterých jste analyzovali konkrétní poradce a zjistili, že se buď nevztahuje na váš scénář, nebo jste obeznámeni s riziky, která představuje, můžete se rozhodnout vyloučit konkrétní poradce ze sestavy auditu.
Mějte na paměti, že by to zcela potlačovalo poradce, a to i u balíčků, které sdílejí rady, které nemusí být součástí vašeho projektu.
NuGetAuditSuppress by mělo být považováno za poslední možnost pro správu doporučení.
Akce při nahlášení balíčků se známými ohroženími zabezpečení
Upozornění na balíčky se známými ohroženími zabezpečení je pouze součástí procesu. Po zjištění je potřeba provést akci, která odebere potenciální ohrožení zabezpečení z vašeho řešení.
Nejjednodušším případem je, že balíček, na který odkazujete, má přímo známou chybu zabezpečení. V takovém případě aktualizujte verzi balíčku na verzi, která opravuje ohrožení zabezpečení.
Ohrožení zabezpečení balíčku můžou být hlášena v přímých i tranzitivních odkazech na balíčky. Akce, kterou provedete k vyřešení, se kvůli tomu může lišit.
Zjištěná ohrožení zabezpečení s aktualizacemi
Pokud jsou nalezena ohrožení zabezpečení a jsou pro balíček k dispozici aktualizace, můžete udělat jednu z těchto věcí:
-
.csprojUpravte umístění verze balíčku (Directory.Packages.props) s novější verzí obsahující opravu zabezpečení. - Pomocí uživatelského rozhraní správce balíčků NuGet v sadě Visual Studio aktualizujte jednotlivé balíčky.
- Spuštěním
dotnet package update --vulnerablepříkazu aktualizujte všechny ohrožené balíčky v projektu na první verzi bez známých ohrožení zabezpečení. - Spusťte příkazy
dotnet package updatenebodotnet package adds příslušným ID balíčku a aktualizujte ho na nejnovější verzi. Použijtepři používání .NET 9 nebo starší. - Použijte server MCP (NuGet Model Context Protocol), který má schopnost aktualizovat balíčky v projektu na verze, které řeší známé chyby zabezpečení. Další informace najdete v tématu Oprava ohrožení zabezpečení balíčku .
Tranzitivní balíčky
Zranitelnost je často v transitivní závislosti. Doporučujeme preferovat aktualizace balíčků, které jsou "nejblíže" vašim přímým odkazům. S upgradem balíčku s známým ohrožením zabezpečení ale není nic špatného.
Řekněme například, že projekt odkazuje na balíček A. Balíček A má závislost na balíčku B, který má zase závislost na balíčku C. V tomto příkladu se podíváme na to, že balíček C verze 1.0.0 má známou chybu zabezpečení opravenou ve verzi 2.0.0. Doporučujeme nejprve zkusit upgradovat balíček A. Pokud se tím upozornění auditu nevyřeší, zkuste upgradovat balíček B. Pokud se tím upozornění auditu nevyřeší, upgradujte C přímo. Abyste s tím mohli pomoct, budete muset najít tranzitivní cestu balíčku.
Pokud v přechodných závislostech balíčku nejvyšší úrovně existuje známé ohrožení zabezpečení, máte tyto možnosti:
- Zkontrolujte, jestli balíček nejvyšší úrovně obsahuje aktualizaci, která neobsahuje přechodné ohrožení zabezpečení, a aktualizujte ji.
- Aktualizujte nejbližší balíček na vaše přímé odkazy, které neodkazuje na ohrožení zabezpečení.
- Přidejte pevnou verzi balíčku jako přímý odkaz na balíček. Poznámka: Nezapomeňte odebrat tento odkaz, pokud bude k dispozici nová aktualizace verze balíčku, a nezapomeňte zachovat definované atributy pro očekávané chování.
- Použití správy centrálních balíčků s přechodnými funkcemi připnutí Mějte na paměti, že pokud projekt zabalíte do vlastního balíčku pro sdílení s ostatními, CPM s tranzitivním připnutím způsobí, že se balíčky stanou závislostmi, i když váš projekt přímo nevolá rozhraní API v daném balíčku.
- Potlačit radu , dokud ji nebude možné vyřešit.
- Vytvořte problém v sledování balíčku nejvyšší úrovně a požádejte o aktualizaci.
Vyhledání tranzitivní cesty k balíčku
Cestu k balíčku můžete najít několika způsoby. Která metoda, kterou dáváte přednost, závisí na tom, jaké nástroje běžně používáte při vývoji.
dotnet nuget příkaz 'why'
Na příkazovém řádku můžete pomocí dotnet nuget why příkazu zjistit, proč jsou tranzitivní balíčky zahrnuté do grafu balíčků projektu.
Průzkumník řešení sady Visual Studio
Projekty ve stylu SDK také poskytují úplný graf balíčků v uzlu Závislosti projektu. Je také prohledávatelný! Rozbalte možnosti hledání a povolte "prohledat externí soubory".
Vyhledejte název balíčku a zobrazí se všechny instance v uzlu závislosti každého projektu.
Uživatelské rozhraní Správce balíčků NuGet sady Visual Studio
Když se podíváte na kartu Nainstalovaná v uživatelském rozhraní správce balíčků sady Visual Studio, když projekt používá PackageReference pro správu balíčků, zobrazí se přímé i tranzitivní balíčky. V současné době k tomu dochází jenom v případě, že spravujete balíčky pro projekt, ne pro řešení.
Pokud najedete myší na balíček v seznamu balíčků, bude popis obsahovat název jednoho přímého balíčku, který způsobil zahrnutí tohoto přechodného balíčku do projektu.
Zjištěná ohrožení zabezpečení bez aktualizací
V případě, že v balíčku existuje známá chyba zabezpečení bez opravy zabezpečení, můžete provést následující kroky.
- Zkontrolujte všechny faktory zmírnění rizika uvedené v sestavě rady.
- Pokud je balíček označený jako zastaralý nebo opuštěný, použijte navrhovaný balíček.
- Pokud je balíček opensourcový, zvažte přispívání na opravu.
- Otevřete problém v sledování problémů balíčku.
Kontrola zmírňujících faktorů
Projděte si poradce pro zabezpečení a zkontrolujte všechny faktory, které by vám mohly umožnit pokračovat v používání balíčku s ohrožením zabezpečení. Ohrožení zabezpečení může existovat pouze v případě, že se kód používá v konkrétní rozhraní, operačním systému nebo speciální funkci.
Použití navrhovaného balíčku
V případě nahlášení poradce pro zabezpečení pro balíček, který používáte, a balíček je označený jako zastaralý nebo se zdá být opuštěný, zvažte použití jakéhokoli navrhovaného alternativního balíčku, který autor balíčku deklaroval, nebo balíček, který obsahuje podobné funkce, které jsou zachovány.
Přispívání opravy
Pokud pro poradce pro zabezpečení neexistuje oprava, můžete navrhnout změny, které řeší ohrožení zabezpečení v žádosti o přijetí změn v opensourcovém úložišti balíčku, nebo se obraťte na autora prostřednictvím Contact owners části na stránce podrobností balíčku NuGet.org.
Otevření problému
Pokud nechcete chybu zabezpečení opravit nebo nemůžete balíček aktualizovat nebo nahradit, otevřete problém v nástroji pro sledování problémů balíčku nebo upřednostňované metodě kontaktu.
Na NuGet.org můžete přejít na stránku s podrobnostmi balíčku a kliknout, Report package která vás provede kontaktem s autorem.
Nenašly se žádná ohrožení zabezpečení.
Pokud se nenajde žádná ohrožení zabezpečení, znamená to, že balíčky se známými ohroženími zabezpečení nebyly v grafu balíčků v současné době, kdy jste zkontrolovali, nalezeny.
Vzhledem k tomu, že poradní databázi je možné kdykoli aktualizovat, doporučujeme pravidelně kontrolovat dotnet restore výstup a zajistit to samé v procesu kontinuální integrace.
Spuštění auditu NuGet v CI
Oddělení chyb od upozornění pomocí vyhrazeného kanálu auditování
Podmíněné příkazy nástroje MSBuild můžete použít ke konfiguraci vyhrazeného kanálu CI pro spouštění auditů bez upozornění auditu, která se považují za chyby v jiných kanálech nebo v místních buildech. V závislosti na vašem systému CI a týmových procesech můžete v případě selhání spuštění kanálu auditu poslat týmu e-mail, nebo můžete mít řídicí panel, kde můžete zobrazit stav nejnovějšího spuštění potrubí.
Stejně jako mnoho věcí v programování existuje několik způsobů, jak dosáhnout výsledku. Jednou z možností je považovat varování NuGet Audit za chyby pouze v rámci auditního procesu.
<PropertyGroup>
<NuGetAuditCodes>NU1900;NU1901;NU1902;NU1903;NU1904;NU1905</NuGetAuditCodes>
<WarningsAsErrors Condition=" '$(AuditPipeline)' == 'true' ">$(WarningsAsErrors);$(NuGetAuditCodes)</WarningsAsErrors>
<WarningsNotAsErrors Condition=" '$(AuditPipeline)' != 'true' ">$(WarningsNotAsErrors);$(NuGetAuditCodes)</WarningsNotAsErrors>
</PropertyGroup>
Potom ve vašem kanálu spustíte obnovení s určením vlastnosti, kterou používá podmínka. Například pomocí syntaxe GitHub Actions:
- name: Restore with NuGet Auditing
run: dotnet restore -p:AuditPipeline=true
Název AuditPipeline vlastnosti je pouze příklad a můžete ho přizpůsobit podle potřeby, pokud je název stejný jak v podmínce MSBuild, tak v příkazovém řádku.
Nástroj MSBuild také používá proměnné prostředí při čtení vlastnosti, která ještě nebyla definována, takže proměnná prostředí je alternativou k parametru příkazového řádku.
Když použijete podmínky k selektivní příčině selhání obnovení v upozorněních auditu NuGet, můžete mít vyhrazený kanál pro kontrolu známých chyb zabezpečení a zároveň zabránit novým doporučením zabezpečení blokovat opravy chyb v nečekaných časech. Když necháte upozornění auditu NuGetu povolená pro místní buildy, mohou vývojáři získat neblokující oznámení o nových bezpečnostních doporučeních a může povzbudit aktualizaci verzí balíčků, aby opravili zranitelnosti rychleji než čekat na kontrolu stavu kanálu auditu.
Zajištění obnovení auditovaných projektů
NuGet v MSBuildu 17.13 a .NET 9.0.200 přidal výstupní vlastnosti RestoreProjectCountRestoreSkippedCount a RestoreProjectsAuditedCount pro úlohu obnovení.
To se dá použít k vynucení spuštění auditu během obnovení.
Všimněte si, že tyto výstupní vlastnosti nejsou k dispozici při obnovení statického grafu.
Vzhledem k tomu, že MSBuild je skriptovací jazyk, lze toho dosáhnout mnoha různými způsoby, ale má také stejná omezení jako MSBuild má. Jedním z příkladů je vytvoření souboru Directory.Solution.targets ve stejném adresáři jako soubor řešení, jehož obsah má cíl podobný následujícímu. Všimněte si, že Directory.Build.props se běžně používá, ale je importován projekty. Cíl obnovení NuGet a úloha se ale spouští na úrovni řešení, takže musí být v souboru rozšiřitelnosti řešení MSBuild, ne v souboru projektu nebo sestavení.
<Project>
<Target Name="AssertRestoreTaskOutputProperties"
AfterTargets="Restore"
Condition="'$(CI)' == 'true'">
<Error
Condition="'$(RestoreProjectsAuditedCount)' != '$(RestoreProjectCount)'"
Text=""Restore did not audit every project in the solution. Expected: $(RestoreProjectCount) Found: $(RestoreProjectsAuditedCount)"" />
</Target>
</Project>
V závislosti na vašem případu použití můžete chtít použít podmínku '$(RestoreProjectCount)' != '$([MSBuild::Add($(RestoreProjectsAuditedCount), $(RestoreSkippedCount))' chybové zprávy, abyste mohli zohlednit projekty, které byly přeskočeny při obnovování, protože už byly aktuální.
Podobně se zamyslete nad tím, jestli chcete, aby k této chybě docházelo všude, nebo jenom v kanálech CI, a na to, jaké proměnné prostředí jsou definované ve vašem prostředí CI, a zaměřte se na stav cíle.
Vzhledem k tomu, že MSBuild je skriptovací jazyk, můžete k přizpůsobení úložiště použít libovolnou jeho funkci.
Zobrazení metaproj a binlogů nástroje MSBuild je užitečné při vývoji a řešení potíží s cíli na úrovni řešení.
dotnet list package --vulnerable
dotnet list package
--vulnerable má argument pro filtrování balíčků na základě toho, které balíčky mají známé chyby zabezpečení.
Všimněte si, že --include-transitive není výchozí, proto by se měla zahrnout.