Controllo delle dipendenze dei pacchetti per le vulnerabilità di sicurezza
Informazioni sui controlli di sicurezza
Un controllo di sicurezza per gli strumenti di gestione pacchetti come NuGet è un processo che prevede l'analisi della sicurezza dei pacchetti inclusi in un progetto software. Ciò implica l'identificazione delle vulnerabilità, la valutazione dei rischi e la creazione di raccomandazioni per migliorare la sicurezza. Il controllo può includere una revisione dei pacchetti stessi, nonché eventuali dipendenze e i relativi rischi associati. L'obiettivo del controllo è identificare e attenuare eventuali vulnerabilità di sicurezza che potrebbero essere sfruttate da utenti malintenzionati, ad esempio attacchi di inserimento di codice o scripting intersito.
È disponibile anche un post di blog che illustra il metodo consigliato per intervenire quando viene rilevato che un pacchetto con una vulnerabilità nota viene usato dal progetto e gli strumenti per ottenere altre informazioni.
Disponibilità di funzionalità
NuGet | .NET SDK | Visual Studio | Funzionalità |
---|---|---|---|
5.9 | .NET 5 SDK (5.0.200) | N/D | dotnet list package --vulnerable |
6.8 | .NET 8 SDK (8.0.100) | Visual Studio 2022 17.8 | NuGetAudit per PackageReference |
6.10 | N/D | Visual Studio 2022 17.10 | NuGetAudit per packages.config |
6.11 | .NET 8 SDK (8.0.400) | Visual Studio 2022 17.11 | NuGetAuditSuppress per PackageReference |
6.12 | .NET 9 SDK (9.0.100) | Visual Studio 2022 17.12 | Controlla le origini. NuGetAuditSuppress per packages.config. |
Esecuzione di un controllo di sicurezza con restore
Il restore
comando viene eseguito automaticamente quando si esegue un'operazione di pacchetto comune, ad esempio il caricamento di un progetto per la prima volta, l'aggiunta di un nuovo pacchetto, l'aggiornamento di una versione del pacchetto o la rimozione di un pacchetto dal progetto nell'IDE preferito.
Le dipendenze vengono controllate rispetto a un elenco di vulnerabilità note fornite dalle origini di controllo.
- Nella riga di comando passare alla directory del progetto o della soluzione.
- Eseguire
restore
usando gli strumenti preferiti, ad esempio dotnet, MSBuild, NuGet.exe, VisualStudio e così via. - Esaminare gli avvisi e risolvere le vulnerabilità di sicurezza note.
Configurazione del controllo NuGet
Il controllo può essere configurato tramite le proprietà MSBuild in un .csproj
file o MSBuild valutato come parte del progetto.
È consigliabile configurare il controllo a livello di repository.
Proprietà MSBuild | Predefiniti | Possibili valori | Note |
---|---|---|---|
NuGetAuditMode | all (1) | direct e all |
Se si desidera controllare sia le dipendenze di primo livello che le dipendenze transitive, è possibile impostare il valore su all . NuGetAuditMode non è applicabile ai progetti packages.config |
NuGetAuditLevel | low | low , moderate , high e critical |
Livello di gravità minimo da segnalare. Se si desidera visualizzare moderate gli avvisi , high e critical (escludere low ), impostare il valore su moderate |
NuGetAudit | true | true e false |
Se si desidera non ricevere report di controllo della sicurezza, è possibile rifiutare esplicitamente l'esperienza impostando il valore su false |
(1) NuGetAuditMode è stato direct
predefinito quando è stato introdotto in .NET 8.0.100 SDK e VS 17.8. In .NET 9.0.100 SDK e VS 17.12 il valore predefinito è stato modificato in all
.
Controlla origini
Il ripristino scarica la risorsa di VulnerabilityInfo
un server per verificare l'elenco dei pacchetti usati da ogni progetto.
L'elenco delle origini è definito dall'elemento in NuGet.Config e viene generato l'avviso auditSources
NU1905 se una delle origini di controllo non fornisce informazioni sulla vulnerabilità.
Se auditSources
non è definito o viene cancellato senza aggiungere origini, packageSources
verrà usato e verrà eliminato l'avviso NU1905.
Poiché una mitigazione comune per gli attacchi di sostituzione dei pacchetti consiste nell'usare un'unica origine di pacchetto da nuget.org, in modo che NuGet non sia configurato per l'uso di nuget.org come origine del pacchetto, le origini di controllo possono essere usate per usare nuget.org (o qualsiasi altra origine che fornisce informazioni sulla vulnerabilità) senza usarla anche come origine del pacchetto.
L'origine dati per il database di vulnerabilità di nuget.org è Database consultivo GitHub. Si noti che il protocollo V2 è deprecato, quindi se nuget.config usa ancora l'endpoint V2, è necessario eseguire la migrazione all'endpoint V3.
<configuration>
<auditSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</auditSources>
</configuration>
Le origini di controllo sono disponibili in NuGet 6.12, .NET 9.0.100 SDK e Visual Studio 2022 17.12.
Prima di questa versione, NuGet Audit userà solo le origini dei pacchetti per scaricare le informazioni sulla vulnerabilità.
Le origini di controllo non vengono usate in dotnet list package --vulnerable
questo momento.
Esclusione di avvisi
È possibile scegliere di escludere avvisi specifici dal report di controllo aggiungendo un nuovo NuGetAuditSuppress
elemento MSBuild per ogni avviso.
Definire un NuGetAuditSuppress
elemento con i Include=
metadati impostati sull'URL di avviso da eliminare.
<ItemGroup>
<NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>
Analogamente alle altre proprietà di configurazione del controllo NuGet, NuGetAuditSuppress
gli elementi possono essere definiti a livello di progetto o repository.
NuGetAuditSuppress
è disponibile per i progetti PackageReference a partire da NuGet 6.11, Visual Studio 17.11 e .NET 8.0.400 SDK.
È disponibile per packages.config da Visual Studio 17.12 e NuGet 6.12.
Codici di avviso
Codice di avviso | Motivo |
---|---|
NU1900 | Errore durante la comunicazione con l'origine del pacchetto, durante il recupero delle informazioni sulla vulnerabilità. |
NU1901 | Pacchetto con gravità bassa rilevata |
NU1902 | Pacchetto con gravità moderata rilevata |
NU1903 | Pacchetto con gravità elevata rilevata |
NU1904 | Pacchetto con gravità critica rilevata |
NU1905 | Un'origine di controllo non fornisce un database di vulnerabilità |
È possibile personalizzare la compilazione per considerare questi avvisi come errori per considerare gli avvisi come errori o considerare gli avvisi non come errori.
Ad esempio, se si usano <TreatWarningsAsErrors>
già per considerare tutti gli avvisi (C#, NuGet, MSBuild e così via) come errori, è possibile usare <WarningsNotAsErrors>NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors>
per evitare che le vulnerabilità individuate in futuro causano interruzioni della compilazione.
In alternativa, se si desidera mantenere le vulnerabilità basse e moderate come avvisi, ma considerare le vulnerabilità elevate e critiche come errori e non si usa TreatWarningsAsErrors
, è possibile usare <WarningsAsErrors>NU1903;NU1904</WarningsAsErrors>
.
Nota
Le proprietà di MSBuild per la gravità del messaggio, NoWarn
ad esempio e TreatWarningsAsErrors
non sono supportate per i progetti packages.config.
dotnet list package --vulnerable
Una volta ripristinato correttamente un progetto, dotnet list package
ha un --vulnerable
argomento per filtrare i pacchetti in base ai pacchetti in cui sono presenti vulnerabilità note.
Si noti che --include-transitive
non è predefinito, quindi deve essere incluso
Azioni quando vengono segnalati pacchetti con vulnerabilità note
È disponibile anche un post di blog che illustra il metodo consigliato per intervenire quando viene rilevato che un pacchetto con una vulnerabilità nota viene usato dal progetto e gli strumenti per ottenere altre informazioni.
Vulnerabilità di sicurezza rilevate con gli aggiornamenti
Se vengono rilevate vulnerabilità di sicurezza e gli aggiornamenti sono disponibili per il pacchetto, è possibile:
- Modificare il
.csproj
percorsoDirectory.Packages.props
della versione del pacchetto o altro () con una versione più recente contenente una correzione di sicurezza. - Usare l'interfaccia utente di Gestione pacchetti NuGet in Visual Studio per aggiornare il singolo pacchetto.
- Eseguire il
dotnet add package
comando con il rispettivo ID pacchetto per eseguire l'aggiornamento alla versione più recente.
Pacchetti transitivi
Se esiste una vulnerabilità nota nelle dipendenze transitive di un pacchetto di primo livello, sono disponibili queste opzioni:
- Aggiungere la versione fissa del pacchetto come riferimento diretto al pacchetto. Nota: assicurarsi di rimuovere questo riferimento quando diventa disponibile un nuovo aggiornamento della versione del pacchetto e assicurarsi di mantenere gli attributi definiti per il comportamento previsto.
- Usare Gestione pacchetti centrali con la funzionalità di aggiunta transitiva.
- Eliminare l'avviso fino a quando non può essere risolto.
- Inviare un problema nel tracker del pacchetto di primo livello per richiedere un aggiornamento.
Vulnerabilità di sicurezza rilevate senza aggiornamenti
Nel caso in cui esista una vulnerabilità nota in un pacchetto senza una correzione di sicurezza, è possibile eseguire le operazioni seguenti.
- Verificare la presenza di eventuali fattori di mitigazione descritti nel report consultivo.
- Usare un pacchetto suggerito se il pacchetto è contrassegnato come deprecato o viene abbandonato.
- Se il pacchetto è open source, prendere in considerazione la possibilità di contribuire a una correzione.
- Aprire un problema nello strumento di rilevamento dei problemi del pacchetto.
Verificare la presenza di fattori di mitigazione
Esaminare l'assistente alla sicurezza per eventuali fattori di mitigazione che potrebbero consentire di continuare a usare il pacchetto con la vulnerabilità. La vulnerabilità può esistere solo quando il codice viene usato in un framework specifico, in un sistema operativo o viene chiamata una funzione speciale.
Usare un pacchetto suggerito
Nel caso in cui venga segnalato un avviso di sicurezza per il pacchetto in uso e il pacchetto è contrassegnato come deprecato o sembra abbandonato, è consigliabile usare qualsiasi pacchetto alternativo suggerito dichiarato dall'autore del pacchetto o un pacchetto che comprende funzionalità simili mantenute.
Contribuire a una correzione
Se non esiste una correzione per l'avviso di sicurezza, è consigliabile suggerire modifiche che risolano la vulnerabilità in una richiesta pull nel repository open source del pacchetto o contattare l'autore tramite la Contact owners
sezione nella pagina dei dettagli del pacchetto NuGet.org.
Aprire un problema
Se non si vuole correggere la vulnerabilità o non è possibile aggiornare o sostituire il pacchetto, aprire un problema nel rilevatore dei problemi del pacchetto o nel metodo di contatto preferito.
In NuGet.org è possibile passare alla pagina dei dettagli del pacchetto e fare clic su Report package
quale guida per entrare in contatto con l'autore.
Nessuna vulnerabilità di sicurezza trovata
Se non vengono rilevate vulnerabilità di sicurezza, significa che i pacchetti con vulnerabilità note non sono stati trovati nel grafico del pacchetto al momento corrente della verifica.
Poiché il database consultivo può essere aggiornato in qualsiasi momento, è consigliabile controllare dotnet restore
regolarmente l'output e garantire lo stesso nel processo di integrazione continua.
Riepilogo
Le funzionalità di controllo della sicurezza sono fondamentali per mantenere la sicurezza e l'integrità dei progetti software. Queste funzionalità offrono un ulteriore livello di protezione dalle vulnerabilità di sicurezza e garantisce che sia possibile usare pacchetti open source con sicurezza.