Vulnerabilidades do pacote npm

Vulnerabilidades em pacotes npm: como encontrá-las e corrigi-las antes do lançamento.

TL, DR

Encontrar vulnerabilidades em pacotes npm é fácil. npm audit Faz isso em quatro segundos e fornece 400 resultados. A parte difícil são as duas perguntas seguintes: qual delas pode ser efetivamente acessada em sua aplicação e qual atualização corrige o problema sem quebrar a compilação.

  • A maior parte da lista não é problema seu. Aplicar a acessibilidade e o contexto de tempo de execução às descobertas "críticas" deixa apenas uma pequena fração delas ainda crítica. A análise do grafo de chamadas é o que revela quais são essas descobertas.
  • npm audit fix --force Não é uma estratégia para resolver o problema. Ele resolve avisos pulando versões principais, e é assim que uma tarefa de segurança se transforma em uma interrupção.
  • As dependências transitivas são onde reside o volume. Você não os escolheu, muitas vezes não é possível melhorá-los diretamente e eles dominam a contagem de resultados.
  • Corrija antes da fusão, não depois do lançamento. Um portão em CI e um automatizado pull request custa minutos. Uma atualização de produção leva um fim de semana.

Por que a contagem de resultados não é o problema

Todo projeto Node, após o primeiro ano, apresenta a mesma experiência. Você executa uma varredura, obtém centenas de vulnerabilidades em pacotes npm, e a lista é tão grande que a resposta racional é fechar o terminal.

Essa reação está correta, e essa é a parte desconfortável. Quase três quartos das bases de código contêm componentes de código aberto de alto risco, e a maior parte do que um scanner reporta em um determinado dia está realmente presente na sua árvore de dependências. A lista é precisa. Só não é uma fila de trabalho.

A diferença entre uma lista precisa e uma lista que realmente funciona reside no contexto, e tudo se resume a algumas perguntas.

  • O código vulnerável é realmente acessível a partir da minha aplicação?
  • Alguém está explorando isso na prática?
  • O que é afetado por isso é relevante para o negócio?

Um scanner que não consegue responder a essas perguntas lhe entrega um inventário e chama isso de relatório.

Como verificar se os pacotes npm apresentam vulnerabilidades

Existem quatro maneiras práticas de verificar se os pacotes npm apresentam vulnerabilidades, e cada uma delas responde a uma pergunta diferente.

FormaO que isso te proporcionaOnde para
npm auditInstantâneo, integrado, sem necessidade de configuração. Avisos de dependência em toda a árvore de dependências.Sem possibilidade de acesso, sem contexto de exploração. Apenas gravidade, e --force vai quebrar coisas
Alertas do DependabotAlertas automáticos no seu repositório, com atualização. pull requestsOrientado por recomendações. Não sabe se o seu código chama a função vulnerável.
OSV ou de Banco de dados de recomendações do GitHubFonte confiável, gratuita e com possibilidade de consulta por pacote e versão. Ideal para verificações pontuais.Um banco de dados, não um fluxo de trabalho. Você ainda precisa triar e corrigir manualmente.
SCA com alcanceOs mesmos avisos, filtrados pela possibilidade de execução do código vulnerável, além da probabilidade de exploração e um caminho de atualização seguro.Requer uma ferramenta no pipeline

Começar com npm audit Porque não custa nada e leva segundos. Não pare por aí, porque a resposta que isso dá é "aqui está tudo", e nem tudo é um plano.

Um detalhe importante para quem depende de feeds de avisos: o Banco de Dados de Avisos do GitHub contém avisos de malware para o ecossistema npm, mas o Dependabot deliberadamente não os exibe, pois um usuário que utiliza o pacote geralmente não consegue resolvê-los com uma atualização. Essa é uma falha estrutural, não uma configuração que você pode ativar. Pacotes maliciosos exigem um controle diferente: detecção na publicação, e não após a divulgação. (Xygeni's) Alerta antecipado de malware Analisa pacotes recém-publicados no npm, PyPI, Maven e outros registros no momento em que aparecem, usando análise comportamental e de anomalias em vez de esperar por uma assinatura, e está incluído no plano gratuito para desenvolvedores. Abordamos esse recurso em malicioso Pacotes npm.

Os filtros que transformam 400 resultados em uma lista concisa.

Esta é a parte que muda a forma como uma equipe trabalha.

Filtrar A pergunta que respondeO que normalmente remove
AcessibilidadeÉ possível que a execução na minha aplicação realmente alcance a função vulnerável?O maior corte. A maioria dos avisos está em código que o aplicativo nunca chama.
Disponibilidade de exploraçãoExiste algum exploit público funcional, e ele está sendo explorado ativamente neste momento?Separa o risco teórico do risco de exploração. Uma descoberta com uma vulnerabilidade pública tem prioridade, independentemente da sua pontuação de gravidade.
Probabilidade de exploração (EPSS)Qual a probabilidade de exploração na natureza nos próximos 30 dias?Resultados de alta gravidade que ninguém está explorando, que raramente são o foco do trabalho desta semana.
Contexto empresarialO serviço afetado é relevante e está exposto?Resultados acessíveis e exploráveis ​​em sistemas que não apresentam riscos significativos.
Disponibilidade de correçãoExiste alguma versão que resolva isso sem causar problemas?Separa o que você pode fechar hoje do que precisa de uma solução alternativa.
  • Acessibilidade é o primeiro e maior corte. Uma vulnerabilidade em um pacote do qual você depende só é explorável se a execução puder de fato alcançar a função vulnerável. O rastreamento do grafo de chamadas responde a essa pergunta no nível da função, em vez de adivinhar a partir do manifesto, e distingue os componentes que você realmente usa daqueles que estão meramente presentes. A análise de alcançabilidade do Xygeni reduz os falsos positivos em até 70%.
  • Disponibilidade de exploração A segunda é um fato, não uma previsão. Uma exploração pública em andamento, ou uma exploração confirmada em ambiente real, altera a prioridade de uma descoberta, independentemente da sua pontuação de gravidade. Essa distinção deixou de ser uma boa prática e tornou-se uma obrigação: de acordo com a Lei de Resiliência Cibernética, um fabricante que toma conhecimento de uma vulnerabilidade ativamente explorada em seu produto tem um prazo de 24 horas para reportá-la. Um programa que não consegue diferenciar "ativamente explorada" de "alta pontuação CVSS" não consegue cumprir esse prazo.

  • A probabilidade de exploração é o terceiro fator, e trata-se da mesma questão, porém com a previsão reinserida. A pontuação EPSS avalia a probabilidade de uma vulnerabilidade ser explorada em ataques reais nos próximos 30 dias, o que é bem diferente de avaliar a gravidade da situação caso ela fosse explorada. Uma pontuação CVSS alta com uma pontuação EPSS insignificante raramente é um problema recente.

  • Contexto empresarial É a terceira, e é aquela que nenhum feed genérico pode fornecer. Uma vulnerabilidade acessível e explorável em um serviço de pagamento voltado para a internet não é a mesma descoberta que a mesma CVE em uma ferramenta de relatório interna.

Aplicados em conjunto, esses filtros transformam rotineiramente uma lista que ninguém lê em uma lista que alguém termina. O contexto de tempo de execução e de acessibilidade normalmente deixa apenas uma pequena minoria de descobertas "críticas" ainda críticas. O Xygeni trata a acessibilidade, a disponibilidade de exploits, o EPSS (Early Profit System and Access) e o contexto de negócios como estágios configuráveis ​​em um funil de priorização, com até oito etapas, de modo que "acessível e ativamente explorado" se torna uma fila permanente em vez de uma consulta executada manualmente.

Corrigindo vulnerabilidades de pacotes npm sem quebrar a compilação.

Encontrar é a parte fácil. O motivo pelo qual as vulnerabilidades dos pacotes npm permanecem sem solução por meses é que corrigi-las acarreta seus próprios riscos, e os desenvolvedores sabem disso.

Opção de correçãoQuando é certoO que verificar primeiro
npm audit fixO aviso é resolvido dentro de um intervalo compatível com o semver.Geralmente é seguro. Execute os testes novamente e, em seguida, faça o merge.
npm audit fix --forceQuase nunca, desprotegidoIsso afeta versões principais. Considere cada resultado como uma alteração incompatível até que se prove o contrário.
Atualização direta direcionadaVocê possui a dependência e existe uma versão corrigida.Quais vulnerabilidades desaparecem, quais novas surgem e se a mudança quebra seu código.
Resolução transitivaO pacote vulnerável está quatro níveis abaixo e não é seu.O caminho de atualização mais curto na árvore que resolve o problema, ou uma substituição caso não exista nenhum.
Nenhuma solução disponívelO responsável pela manutenção não aplicou a correção.Verifique se é possível acessar o dispositivo. Caso contrário, documente a situação e siga em frente, em vez de forçar uma atualização.
Remover a dependênciaA embalagem está praticamente sem uso ou abandonada.Ainda existe alguma coisa que se chame isso. Componentes não utilizados são as descobertas mais baratas para fechar.

A questão que importa antes de qualquer atualização não é "esta atualização corrige a CVE?". São três perguntas simultâneas: quais vulnerabilidades desaparecem com esta versão, quais novas surgem e se a mudança de versão quebra meu código.

Xygeni Mostra todas as três opções para cada dependência vulnerável, então a escolha é entre opções visíveis em vez de um salto no escuro. Em seguida, o Autofix gera o pull request Com a versão corrigida, a correção em massa aplica várias correções em uma única ação, e o Xygeni Bot é executado sob demanda. pull requests ou diariamente, de forma que o acúmulo de tarefas diminua sem que ninguém precise agendá-lo.

Para dependências transitivas, onde você não pode simplesmente atualizar uma versão que não escolheu, a saída útil é o caminho de atualização mais curto na árvore que resolve o aviso, e não um alerta informando que um pacote quatro níveis abaixo é vulnerável.

Antes do envio: Onde o cheque deve ser entregue

"Antes do envio" é uma afirmação referente ao cronograma, e se resume a três etapas.

  • Na IDEAssim, o desenvolvedor percebe o problema ao escolher a dependência, que é o momento mais barato para alterá-la.
  • No pull requestOnde um bot comenta sobre o que mudou e libera a correção, e onde um mecanismo de segurança pode bloquear uma compilação com base em descobertas acima de um limite predefinido. O bloqueio baseado apenas na gravidade é o que faz as equipes desativarem o mecanismo. O bloqueio baseado em descobertas alcançáveis ​​e exploráveis ​​é o que as faz mantê-lo.
  • Continuamente após a libertação, Porque uma dependência que estava limpa no momento da fusão torna-se vulnerável no dia em que um aviso é publicado. O monitoramento contínuo em todos os registros é o que detecta isso, sem que alguém precise se lembrar de fazer uma nova verificação.

E a saída dos três deve estar em uma fila priorizada junto com a sua. SAST, segredos! e achados do contêiner, incluindo aqueles ingeridos por ferramentas que você já executa. Um lista de vulnerabilidades Essa lista, que reside em seu próprio console, compete por atenção com o trabalho que deveria informar.

Envie a solução, não a descoberta.

Um scanner que lhe entrega 400 vulnerabilidades em pacotes npm não fez o trabalho. Ele apenas transferiu o trabalho.

A Xygeni refina as descobertas de dependências por acessibilidade, probabilidade de exploração e contexto de negócios, mostra o que cada atualização corrige e o que ela pode quebrar, e abre o pull request Com a versão corrigida. Ela roda no seu pipelineproduz SBOM e a saída do VDR no SPDX e no CycloneDX, as evidências que o CRA, o NIS2 e o DORA solicitam, e coloca as descobertas de dependência na mesma fila priorizada que o restante do seu risco, incluindo descobertas de scanners que você não está substituindo.

Comece de graça e examinar um repositório, ou Veja como a acessibilidade altera a lista..

Perguntas frequentes

Como faço para verificar se há vulnerabilidades em pacotes npm?

Execute npm audit Para uma visualização instantânea, utilize uma ferramenta de análise de acessibilidade para restringir a lista às ocorrências em que o código vulnerável pode ser efetivamente executado. Bancos de dados de avisos, como o OSV e o GitHub Advisory Database, são úteis para verificar um pacote e versão específicos.

Is npm audit fix É seguro correr?

A versão não forçada geralmente é segura, pois permanece dentro dos intervalos compatíveis com o versionamento semântico (semver). npm audit fix --force Não é bem assim: ele atualiza entre versões principais para resolver avisos, e é daí que vêm as alterações que quebram a compatibilidade.

Por que tenho tantas vulnerabilidades em pacotes npm?

Porque a maioria delas são transitivas. Você instala algumas dependências diretas e herda centenas de indiretas, cada uma com seu próprio histórico de recomendações. O volume é normal. O que falta é a triagem.

O que é análise de alcançabilidade?

Determinar se a execução em sua aplicação consegue realmente alcançar a função vulnerável em uma dependência é a forma mais eficaz de reduzir o ruído em segurança de dependências, pois a maioria das vulnerabilidades relatadas reside em código que sua aplicação nunca chama.

Devo usar CVSS ou EPSS para priorizar?

Ambos, para coisas diferentes. O CVSS descreve a gravidade de uma vulnerabilidade se explorada. O EPSS estima a probabilidade de exploração nos próximos 30 dias. A gravidade sem probabilidade produz uma fila ordenada pelo eixo errado.

Com que frequência devo verificar se há vulnerabilidades nos pacotes npm?

De forma contínua, não programada. Uma verificação sem erros na segunda-feira não significa nada na quarta-feira se um alerta for emitido para um pacote que você já enviou.

sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
Crie sua conta gratuita.
Nenhum cartão de crédito é necessário.

Garanta o desenvolvimento e a entrega do seu software.

com o Suíte de Produtos da Xygeni