Partilhar via


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 .

  1. Na linha de comando, navegue até o diretório do projeto ou da solução.
  2. Execute restore usando suas ferramentas preferidas (ou seja, dotnet, MSBuild, NuGet.exe, VisualStudio etc.).
  3. 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, highe critical O nível mínimo de severidade a comunicar. Se você quiser ver moderate, highe 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 de um servidor para verificar a lista de pacotes que cada projeto está a utilizar. A lista de fontes é definida por o elemento 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.