Auditando dependências de pacotes para vulnerabilidades de segurança
Sobre auditorias de segurança
Uma auditoria de segurança para gerenciadores de pacotes como o NuGet é um processo que envolve a análise da segurança dos pacotes incluídos em um projeto de software. Isso envolve identificar vulnerabilidades, avaliar riscos e fazer recomendações para melhorar a segurança. A auditoria pode incluir uma revisão dos próprios pacotes, bem como quaisquer dependências e seus riscos associados. O objetivo da auditoria é identificar e mitigar quaisquer vulnerabilidades de segurança que possam ser exploradas por invasores, como injeção de código ou ataques de script entre sites.
Também temos uma postagem de blog que discute nosso método recomendado para agir quando um pacote com uma vulnerabilidade conhecida é encontrado para ser usado pelo seu projeto, e ferramentas para ajudar a obter mais informações.
Disponibilidade de funcionalidades
NuGet | .NET SDK | Estúdio Visual | Funcionalidade |
---|---|---|---|
5,9 | SDK do .NET 5 (5.0.200) | N/A | dotnet list package --vulnerable |
6,8 | SDK do .NET 8 (8.0.100) | Visual Studio 2022 17.8 | NuGetAudit para PackageReference |
6.10 | N/A | Visual Studio 2022 17.10 | NuGetAudit para packages.config |
6.11 | SDK do .NET 8 (8.0.400) | Visual Studio 2022 17.11 | NuGetAuditSuppress para PackageReference |
6.12 | SDK do .NET 9 (9.0.100) | Visual Studio 2022 17.12 | Fontes de auditoria. NuGetAuditSuppress para packages.config. |
Executando uma auditoria de segurança com o restore
O comando restore
é executado automaticamente quando você faz uma operação de pacote comum, como carregar um projeto pela primeira vez, adicionar um novo pacote, atualizar uma versão do pacote ou remover um pacote do seu projeto no seu IDE favorito.
Suas dependências são verificadas em relação a uma lista de vulnerabilidades conhecidas fornecida pelas fontes de auditoria .
- Na linha de comando, navegue até o diretório do projeto ou da solução.
- Execute
restore
usando suas ferramentas preferidas (ou seja, dotnet, MSBuild, NuGet.exe, VisualStudio etc.). - Reveja os avisos e resolva as vulnerabilidades de segurança conhecidas.
Configurando a auditoria do NuGet
A auditoria pode ser configurada através das propriedades do MSBuild em um arquivo .csproj
ou num arquivo do MSBuild que está a ser avaliado como parte do seu projeto.
Recomendamos que a auditoria seja configurada em um nível de repositório.
Propriedade MSBuild | Padrão | Valores possíveis | Observações |
---|---|---|---|
Modo de Auditoria NuGet | direto |
direct e all |
Se quiser auditar apenas dependências de nível superior, você pode definir o valor como direct . NuGetAuditMode não é aplicável para projetos packages.config. |
Nível de Auditoria NuGet | baixo |
low , moderate , high e critical |
O nível mínimo de severidade a comunicar. Se você quiser ver moderate , high e critical avisos (excluir low ), defina o valor como moderate |
NuGetAudit | verdadeiro |
true e false |
Se desejar não receber relatórios de auditoria de segurança, você pode desativar totalmente a experiência definindo o valor como false |
Fontes de auditoria
Restaurar descarrega o recurso com auditSources
no NuGet.Confige aviso NU1905 é gerado se qualquer uma das fontes de auditoria não fornecer nenhuma informação de vulnerabilidade.
Se auditSources
não estiver definido ou for limpo sem adicionar fontes, packageSources
será usado e o aviso NU1905 será suprimido.
Como uma atenuação comum para ataques de substituição de pacotes é usar uma única fonte de pacotes que receba upstream do nuget.org, de modo que o NuGet não esteja configurado para usar o nuget.org como uma fonte de pacotes, podem ser utilizadas fontes de auditoria para consultar informações de vulnerabilidade no nuget.org (ou qualquer outra fonte), sem que sejam usadas também como fontes de pacotes.
A fonte de dados para o banco de dados de vulnerabilidades do nuget.org é GitHub Advisory Database. Observe que o protocolo V2 foi preterido, portanto, se seu nuget.config ainda estiver usando o ponto de extremidade V2, você deverá migrar para o ponto de extremidade V3.
<configuration>
<auditSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</auditSources>
</configuration>
As fontes de auditoria estão disponíveis em NuGet 6.12, .NET 9.0.100 SDK e Visual Studio 2022 17.12.
Antes desta versão, o NuGet Audit só usava fontes de pacotes para baixar informações sobre vulnerabilidades.
As fontes de auditoria não são usadas por dotnet list package --vulnerable
no momento.
Excluindo orientações
Você pode optar por excluir avisos específicos do relatório de auditoria adicionando um novo item NuGetAuditSuppress
MSBuild para cada aviso.
Defina um item de NuGetAuditSuppress
com os metadados Include=
definidos para a URL de aviso que você deseja suprimir.
<ItemGroup>
<NuGetAuditSuppress Include="https://github.com/advisories/XXXX" />
</ItemGroup>
Semelhante às outras propriedades de configuração de auditoria do NuGet, NuGetAuditSuppress
itens podem ser definidos no nível do projeto ou do repositório.
NuGetAuditSuppress
está disponível para projetos PackageReference a partir de NuGet 6.11, Visual Studio 17.11 e o .NET 8.0.400 SDK.
Está disponível para packages.config a partir do Visual Studio 17.12 e NuGet 6.12.
Códigos de advertência
Código de aviso | Justificação |
---|---|
NU1900 | Erro ao comunicar com a origem do pacote ao obter informações sobre vulnerabilidades. |
NU1901 | Pacote com baixa gravidade detetada |
NU1902 | Pacote com gravidade moderada detetada |
NU1903 | Pacote de alta severidade detetado |
NU1904 | Pacote com gravidade crítica detetada |
NU1905 | Uma fonte de auditoria não fornece um banco de dados de vulnerabilidade |
Você pode personalizar a sua compilação para tratar esses avisos como erros ou não tratá-los como erros.
Por exemplo, se você já estiver usando <TreatWarningsAsErrors>
para tratar todos os avisos (C#, NuGet, MSBuild, etc) como erros, poderá usá<WarningsNotAsErrors>$(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904</WarningsNotAsErrors>
para evitar que vulnerabilidades descobertas no futuro quebrem sua compilação.
Como alternativa, se você quiser manter vulnerabilidades baixas e moderadas como avisos, mas tratar vulnerabilidades altas e críticas como erros, e não estiver usando TreatWarningsAsErrors
, você pode usar <WarningsAsErrors>$(WarningsAsErrors);NU1903;NU1904</WarningsAsErrors>
.
Observação
As propriedades do MSBuild para gravidade da mensagem, como NoWarn
e TreatWarningsAsErrors
, não são suportadas para projetos packages.config.
dotnet list package --vulnerable
Depois que um projeto é restaurado com êxito, dotnet list package
tem um argumento --vulnerable
para filtrar os pacotes com base em quais pacotes têm vulnerabilidades conhecidas.
Observe que --include-transitive
não é padrão, portanto, deve ser incluído.
Ações quando pacotes com vulnerabilidades conhecidas são relatados
Também temos uma postagem de blog que discute o nosso método recomendado para agir quando se descobre que um pacote com uma vulnerabilidade conhecida está a ser utilizado pelo seu projeto, bem como ferramentas para ajudar a obter mais informações.
Vulnerabilidades de segurança encontradas com atualizações
Se forem encontradas vulnerabilidades de segurança e estiverem disponíveis atualizações para o pacote, você pode:
- Edite o
.csproj
ou outro local da versão do pacote (Directory.Packages.props
) com uma versão mais recente contendo uma correção de segurança. - Use a interface do usuário do gerenciador de pacotes NuGet no Visual Studio para atualizar o pacote individual.
- Execute o comando
dotnet add package
com o respetivo ID do pacote para atualizar para a versão mais recente.
Pacotes Transitivos
Se existir uma vulnerabilidade conhecida nas dependências transitivas de um pacote de nível superior, você terá estas opções:
- Adicione a versão fixa do pacote como uma referência direta. Nota: Certifique-se de remover essa referência quando uma nova atualização de versão do pacote estiver disponível e certifique-se de manter os atributos definidos para o comportamento esperado.
- Use Gerenciamento Central de Pacotes com a funcionalidade de fixação transitiva.
- Suprima o aviso até que possa ser resolvido.
- Registre um problema no rastreador do pacote de nível superior para solicitar uma atualização.
Vulnerabilidades de segurança encontradas sem atualizações
No caso de existir uma vulnerabilidade conhecida num pacote sem uma correção de segurança, pode fazer o seguinte.
- Verifique se há fatores atenuantes descritos no relatório consultivo.
- Use um pacote sugerido se o pacote estiver marcado como obsoleto ou abandonado.
- Se o pacote for de código aberto, considere contribuir com uma correção.
- Registe uma questão no sistema de acompanhamento de problemas do pacote.
Verifique se há fatores atenuantes
Analise o consultor de segurança para verificar se há fatores atenuantes que possam permitir que você continue usando o pacote com a vulnerabilidade. A vulnerabilidade só pode existir quando o código é usado em uma estrutura específica, sistema operacional ou uma função especial é chamada.
Use um pacote sugerido
No caso de um aviso de segurança ser relatado para o pacote que você está usando e o pacote for marcado como obsoleto ou parecer abandonado, considere usar qualquer pacote alternativo sugerido que o autor do pacote tenha declarado ou um pacote composto por funcionalidade semelhante que seja mantido.
Contribua com uma correção
Se não existir uma correção para o comunicado de segurança, você pode sugerir alterações que resolvam a vulnerabilidade em uma solicitação pull no repositório de código aberto do pacote ou entrar em contato com o autor através da seção Contact owners
na página de detalhes do pacote NuGet.org.
Abrir um problema
Se você não quiser corrigir a vulnerabilidade ou não conseguir atualizar ou substituir o pacote, abra um problema no rastreador de problemas do pacote ou no método de contato preferido.
No NuGet.org, você pode navegar até a página de detalhes do pacote e clicar em Report package
que irá guiá-lo para entrar em contato com o autor.
Nenhuma vulnerabilidade de segurança encontrada
Se nenhuma vulnerabilidade de segurança for encontrada, isso significa que os pacotes com vulnerabilidades conhecidas não foram encontrados no seu gráfico de pacotes no momento em que você verificou.
Uma vez que a base de dados de aconselhamento pode ser atualizada a qualquer momento, recomendamos que verifique regularmente os resultados do seu dotnet restore
e garanta o mesmo no seu processo de integração contínua.
Resumo
Os recursos de auditoria de segurança são cruciais para manter a segurança e a integridade dos projetos de software. Esses recursos fornecem uma camada adicional de proteção contra vulnerabilidades de segurança e garantem que você possa usar pacotes de código aberto com confiança.