Estes não são os pacotes npm que você está procurando
DeveloperSteve Coochin
4 de maio de 2022
0 minutos de leituraAo longo dos anos, como desenvolvedor, criei e implantei muitas aplicações em agências digitais, projetos paralelos, startups e trabalhos como freelancer. Com prazos apertados, expectativas dos clientes e datas de entrega em jogo, a segurança geralmente não era uma prioridade ao instalar um pacote de código aberto com npm. Isso muitas vezes levava a retrabalho e ajustes em implantações que haviam incluído vulnerabilidades conhecidas, aumentando os prazos e a insatisfação dos clientes.
No início do ano, mais de 500 pacotes maliciosos foram publicados no ecossistema npm para criar confusão de dependências nas aplicações. Esses pacotes injetavam diretamente código e funcionalidades indesejados ou introduziam código malicioso por meio da injeção de uma biblioteca de código aberto direta ou de uma dependência.
Assim como nos filmes originais de Star Wars, esses pacotes maliciosos tentavam usar um truque mental Jedi para entrar nas nossas aplicações. Como casos desse tipo estão aumentando, é importante reservar o tempo necessário e tomar precauções para proteger nossas implantações.
Veja algumas maneiras de ajudar a proteger aplicações contra a injeção de dependências.
Faça sua lição de casa
É sempre importante entender o que sua aplicação usa em cada etapa do desenvolvimento. Cerca de 80% das vulnerabilidades no ecossistema npm surgem por caminhos vulneráveis na injeção de dependências. Por isso, é fundamental fazer sua lição de casa. Para manter a segurança, precisamos entender como os pacotes de código aberto escolhidos foram criados e que tipo de suporte existe para eles.
Uma forma de fazer isso é analisar as funcionalidades da biblioteca, usando a página do pacote no npm ou o repositório Git. Isso ajuda a descobrir o número de versões lançadas, avaliar o suporte e ver que tipos de dependências o pacote exige.

Outra maneira prática é usar o Snyk Advisor, que oferece informações úteis sobre a integridade do pacote e os tipos de vulnerabilidade encontrados ao longo de sua história.
Uma das melhores coisas da página do Snyk Advisor é que ela oferece uma visão abrangente do projeto, incluindo uma pontuação de integridade baseada na comunidade, popularidade, segurança e manutenção.

Nessa página, você também encontra gráficos práticos que mostram estatísticas de popularidade ao longo do tempo, como downloads por semana, o número de commits feitos pela comunidade e a quantidade de problemas em aberto. Isso ajuda a avaliar a atividade da comunidade e a adoção no ecossistema.

Esses dois gráficos ajudam a mostrar com que rapidez a comunidade se mobilizaria para corrigir problemas de segurança que surgissem no projeto.
Criando árvores de dependências
Um único npm install pode incluir centenas de bibliotecas na sua aplicação Node. O Electron, por exemplo, tem três dependências principais, algumas das quais têm dependências próprias que serão adicionadas automaticamente a uma aplicação baseada em Electron.
As árvores de dependências ajudam a identificar pacotes incluídos por meio de uma biblioteca ou dependência. Mais importante ainda, elas facilitam a criação de um SBOM (inventário de materiais de software), identificando os componentes usados na sua aplicação.
Há várias maneiras de gerar uma árvore de dependências, como:
Usando uma ferramenta de mapeamento visual
As ferramentas de mapeamento visual são práticas para gerar mapas de dependências, pois mostram visualmente todos os componentes de código aberto usados pela sua aplicação.
Uma ferramenta de mapeamento visual que já usei é o npmgraph.an, que cria uma visualização de árvore de dependências em 2D a partir de uma única biblioteca npm. Depois de gerada, você pode clicar nos nós da árvore que representam dependências para exibir mais informações em um painel à esquerda.

Usando npm na linha de comando
Adoro a versatilidade do npm: dá para instalar uma biblioteca global, como a Snyk CLI, e também gerar uma lista de bibliotecas e dependências.
Para gerar uma árvore, acesse o diretório raiz de um projeto que tenha um manifesto de pacote e digite npm list. O comando exibirá, em formato de texto, todas as bibliotecas de nível superior usadas por uma aplicação baseada em npm. Você também pode obter mais informações sobre um pacote específico digitando npm list [package].

No entanto, o comando anterior não exibe as dependências aninhadas. Para isso, precisamos usar a opção --depth. Por exemplo, executar npm list --depth=5 no diretório raiz de um projeto npm exibirá uma árvore mais completa.

Também é possível especificar a profundidade de um pacote específico usando npm list [package] --depth=5. Uma desvantagem desse método de organização de pacotes é que pode ser difícil navegar por ele. É fácil se perder na árvore, principalmente ao trabalhar com mapas de dependências grandes.
Usando Snyk Open Source
Este método combina a visualização em árvore da linha de comando com o mapeamento visual e ainda oferece a detecção de vulnerabilidades.
Para começar, crie uma conta gratuita da Snyk e faça login. Em seguida, conecte à Snyk o repositório onde sua aplicação está armazenada e execute uma verificação. Para isso, clique no botão Adicionar projeto e selecione o repositório desejado.

Siga as etapas para conectar o repositório e conceda à Snyk permissão para acessá-lo.
Dica útil: Na maioria das plataformas, a verificação funciona com repositórios públicos ou privados.
Depois de conectar, encontre e selecione o repositório da aplicação para o qual você quer gerar uma árvore. Em seguida, clique no botão Adicionar repositórios selecionados, no canto superior direito, para iniciar a verificação.

Quando a verificação for concluída, você verá uma visão consolidada dos resultados. Ao expandir o nível superior usando a seta suspensa, será exibido um detalhamento de cada item detectado pela verificação.

Neste exercício, estamos procurando alguns itens encontrados no manifesto de pacote npm package.json. Clique na linha package.json para expandir a lista e ver caminhos vulneráveis detectados em bibliotecas específicas, mais informações sobre as correções recomendadas e muito mais.

E é aqui que a magia Jedi acontece de verdade. Clique na aba Dependências para ver uma lista das dependências do projeto. Clique no ícone da estrutura em árvore, no canto superior direito, para ver detalhes como a relação entre as bibliotecas e a localização das vulnerabilidades detectadas.

Agora, você tem uma árvore interativa de bibliotecas e dependências que mostra onde começam os caminhos vulneráveis.
A melhor parte de gerar uma árvore de dependências com a Snyk são as verificações contínuas, que alertam você sobre novas vulnerabilidades e sugerem correções, como atualizar versões ou aplicar patches personalizados. Você também pode configurar pull requests automáticos no seu repositório para corrigir vulnerabilidades ainda mais rapidamente.
Que o código (aberto) esteja com você
Revisar regularmente seus componentes de código aberto é uma parte importante da segurança das aplicações. As árvores de dependências são um ótimo ponto de partida para entender o que você está usando, mas também é fundamental verificar continuamente sua aplicação com uma ferramenta de análise de composição de software (SCA), como Snyk Open Source.
Comece a resolver desafios de capture the flag
Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.



