Skip to main content

Como proteger aplicações JavaScript diretamente pela CLI

Escrito por
Headshot of Gideon Idoko

Gideon Idoko

feature secure js cli

24 de outubro de 2023

0 minutos de leitura

Segundo o relatório State of Open Source Security 2022 da Snyk, um projeto médio de JavaScript tem 49 vulnerabilidades, incluindo problemas comuns como dependências inseguras, cross-site scripting (XSS), validação de entrada fraca e cross-site request forgery (CSRF). E, considerando o uso generalizado do JavaScript, medidas de segurança robustas são cada vez mais importantes para proteger suas aplicações contra ataques cibernéticos. Embora implementar essas medidas durante o desenvolvimento seja essencial, também é importante começar cedo — e fazer isso pela CLI facilita o processo.

Por isso, este artigo mostra como proteger suas aplicações JavaScript usando a Snyk CLI.

O que é a Snyk CLI?

A Snyk CLI é uma ferramenta poderosa que analisa e monitora aplicações, contêineres e infraestrutura como código (IaC) em busca de vulnerabilidades de segurança. Como se integra perfeitamente ao seu fluxo de desenvolvimento, você pode executá-la localmente ou no pipeline de integração e entrega contínuas (CI/CD). Assim, é possível lidar proativamente com questões de segurança desde o início do processo de desenvolvimento.

Ao analisar seu projeto JavaScript com a Snyk CLI, ela verifica as dependências do projeto em um vasto banco de dados de vulnerabilidades de segurança e informa os problemas encontrados. Além disso, apresenta recomendações para corrigi-los. Isso pode envolver atualizar um pacote vulnerável para uma versão segura ou usar alternativas sem vulnerabilidades.

Benefícios de usar a Snyk CLI durante o desenvolvimento

Com a Snyk CLI, você pode melhorar a segurança, a confiabilidade e a velocidade de lançamento dos seus projetos. Veja alguns dos principais benefícios:

  • Análise de segurança do código e das dependências: A Snyk CLI analisa sua base de código e suas dependências em busca de vulnerabilidades conhecidas e fornece detalhes sobre os problemas de segurança, incluindo níveis de gravidade e correções recomendadas.

  • Detecção antecipada de vulnerabilidades: Com a Snyk CLI, você detecta vulnerabilidades no início do ciclo de desenvolvimento e pode corrigi-las mais cedo, com menos custo e esforço.

  • Orientações para corrigir vulnerabilidades: Além de identificar vulnerabilidades, a Snyk CLI sugere atualizações para dependências vulneráveis ou bibliotecas alternativas, facilitando a correção dos problemas encontrados.

  • Suporte a requisitos de conformidade e boas práticas: Além de ajudar você a seguir as boas práticas, os relatórios gerados pela Snyk CLI permitem realizar auditorias de segurança e avaliar a conformidade.

  • Suporte a linguagens e ecossistemas: Com suporte a várias linguagens, a Snyk CLI pode testar uma ampla variedade de projetos, como Java, Python, .NET, Ruby, PHP e muitos outros, sendo uma ótima opção para equipes poliglotas.

  • Experiência voltada para desenvolvedores: Os comandos intuitivos de terminal da Snyk CLI facilitam a integração das verificações de segurança ao fluxo de desenvolvimento. Além da CLI, você também pode usar a Snyk no seu IDE por meio de plugins e extensões.

Como instalar a Snyk CLI

Há várias maneiras de instalar a Snyk CLI na sua máquina, desde usar os executáveis independentes disponíveis até gerenciadores de pacotes, como o Homebrew no macOS e o Scoop no Windows.

No entanto, a maneira mais fácil de instalar a Snyk CLI para sua aplicação JavaScript é fazer uma instalação global com npm ou Yarn, já que você provavelmente já tem o Node.js instalado. Certifique-se de usar a versão 12 ou posterior do Node.js e execute o comando a seguir para instalar a Snyk CLI como um pacote npm global:

npm i -g snyk

Como alternativa, você pode fazer a instalação global com Yarn executando yarn global add snyk. Para mais informações, consulte o guia de instalação da Snyk CLI.

Como corrigir vulnerabilidades em JavaScript com a Snyk CLI

Agora que você instalou a Snyk CLI, explore os recursos disponíveis testando um projeto JavaScript de exemplo.

Configure localmente um projeto JavaScript de exemplo

Para ajudar você a configurar rapidamente um projeto para testar com a Snyk CLI, disponibilizamos este repositório do GitHub com um projeto JavaScript de exemplo e todos os arquivos de manifesto necessários. O projeto é uma API simples de citações que usa Lodash e Express como dependências. A API de citações tem um endpoint GET /, que retorna uma lista de citações, e um endpoint GET /random, que retorna uma citação aleatória.

O projeto usa Docker para conteinerização e Kubernetes como parte da infraestrutura. A maneira mais fácil de configurar Docker e Kubernetes na sua máquina local é instalar o Docker Desktop e ativar o Kubernetes nas configurações:

Configurações do Docker Desktop abertas na seção Kubernetes, exibindo a versão 1.25.4, o Kubernetes ativado e o botão Aplicar e reiniciar.

Para configurar o projeto JavaScript de exemplo, clone o repositório na sua máquina local:

git clone https://github.com/IamGideonIdoko/vulnnode.git

Em seguida, acesse o diretório do projeto e instale as dependências:

cd vulnnode

npm install

O código JavaScript do projeto está no arquivo server.js. Execute npm start para iniciar a aplicação na porta 3000:

Janela escura do navegador em localhost:3000 exibindo uma resposta de API JSON com uma mensagem de sucesso e citações obtidas, acompanhadas dos nomes dos autores.

Agora, crie e inicie um contêiner para a aplicação executando o seguinte comando do Docker:

docker compose up --detach app

Isso cria uma imagem Docker vulnnode a partir do Dockerfile, executa a imagem e expõe o contêiner na porta 4000.

Por fim, crie um recurso do Kubernetes para a aplicação:

kubectl create -f kube.yml 

Este código usa o arquivo de manifesto kube.yml e disponibiliza a aplicação na porta 5000. Agora está tudo configurado e você pode começar a analisar o projeto.

Autentique sua máquina

A Snyk CLI precisa estar vinculada a uma conta Snyk. Por isso, você deve autenticar sua máquina antes de usá-la. Se ainda não tiver uma conta, crie uma conta gratuita na Snyk para acompanhar as etapas. Depois de entrar na sua conta, abra o terminal e autentique a Snyk CLI com este comando:

snyk auth

Uma página da web será aberta no navegador. Clique no botão Authenticate para autenticar sua Snyk CLI.

Se esse método de autenticação não funcionar, você pode usar seu token de API diretamente. Acesse Configurações da conta > Geral > Token de API e copie o token. Em seguida, autentique-se com ele no terminal:

snyk auth <YOUR_API_TOKEN>

Agora, você deve receber uma mensagem informando que sua conta foi autenticada e que a CLI está pronta para uso. Confira os comandos da Snyk CLI que ajudarão você a testar seu projeto JavaScript.

snyk test

O comando snyk test verifica se há problemas de segurança e licenciamento em softwares de código aberto. Ele analisa as dependências do projeto para identificar vulnerabilidades conhecidas e informa detalhes sobre elas, como tipos, descrições, caminhos dos arquivos vulneráveis e etapas para corrigi-las.

Ao executar snyk test , a Snyk CLI tenta detectar automaticamente os arquivos de manifesto que contêm dependências, como o arquivo package.json do projeto configurado, e testá-las. Observação: a Snyk procura dependências locais para verificar se há vulnerabilidades. Por isso, baixamos as dependências do projeto durante a configuração.

Para analisar o projeto, execute o comando de teste no mesmo diretório:

snyk test

Você verá uma saída semelhante a esta:

Saída do terminal do comando `snyk test`, que informa nove problemas e 10 caminhos vulneráveis em 51 dependências de JavaScript.

A Snyk testou as dependências do projeto, encontrou alguns problemas e os relatou com uma descrição, incluindo o ID e a gravidade do problema, além de um link para saber mais.

Todos os problemas são agrupados na seção Problemas a corrigir com atualização. Isso significa que a atualização das bibliotecas relacionadas elimina uma ou mais vulnerabilidades. Mais adiante, você verá em detalhes como corrigir esses problemas.

Os problemas encontrados no teste também podem aparecer agrupados nas seguintes seções:

  • Problemas corrigíveis com patch significa que não há uma atualização disponível para corrigir o problema, mas você pode usar um patch como alternativa.

  • Problemas sem atualização ou patch direto significa que não há uma atualização nem um patch disponível para corrigir o problema. Você pode manter a dependência ou substituí-la por uma alternativa.

Observação: se preferir receber a saída em um arquivo JSON, basta adicionar a flag --json-file-output=./path/to/file.json ao comando da Snyk CLI.

Em um pipeline de CI/CD, você pode executar snyk test para interromper o pipeline se o projeto tiver vulnerabilidades, ou seja, quando o código de saída do comando de teste for diferente de 0.

snyk monitor

Ao executar o comando snyk monitor, ele captura um snapshot do projeto e envia os dados à Snyk. É importante entender que snyk monitor não substitui snyk test, pois seu principal objetivo é criar um snapshot e acompanhá-lo ao longo do tempo. Essa é uma ferramenta valiosa para usar antes de implantar em produção. Além disso, a Snyk mantém você informado: envia notificações pelo canal de contato de sua preferência sempre que identifica uma nova vulnerabilidade ou correção relevante para seu projeto.

Para garantir que o snapshot seja salvo no local correto, recomendamos especificar informações adicionais, como a organização (--org) e o nome do projeto (--project-name).

Para ver o snyk monitor em ação, execute o seguinte comando:

snyk monitor --file=package.json  --project-name=vulnnode --org=<YOUR_ORG>

Substitua <YOUR_ORG> pela organização onde você quer salvar o snapshot do projeto. Depois de executar o comando, você receberá um link para o snapshot na resposta, como neste exemplo:

Saída do terminal de um comando monitor do Snyk mostrando o URL de um snapshot do projeto, notificações sobre problemas em dependências e o tempo de execução.

Acesse o link para ver o snapshot no seu painel da Snyk:

Painel do projeto Snyk exibindo vulnerabilidades de alta gravidade de poluição de protótipo no Lodash e envenenamento de protótipo no qs, com pontuações de 731 e 696.

snyk ignore

Há situações em que não existe um patch ou uma atualização para corrigir uma vulnerabilidade, ou em que você acredita que ela não pode ser explorada na sua aplicação. Nesses casos, você pode instruir a Snyk a ignorar a vulnerabilidade por um período determinado. Com o comando snyk ignore, você gerencia problemas conhecidos ou falsos positivos que talvez não possam ser corrigidos de imediato ou não sejam relevantes no contexto do seu projeto.

Ao usar snyk ignore, você precisa identificar o problema pelo ID da vulnerabilidade, que pode ser obtido na saída do comando snyk test. Por exemplo, a vulnerabilidade de negação de serviço por expressão regular (ReDoS) associada à versão atual do pacote Lodash do projeto tem o ID SNYK-JS-LODASH-1018905. Para ignorá-la, execute:

snyk ignore --id=SNYK-JS-LODASH-1018905 --expiry=2023-07-27 --reason="Not that severe"  

A flag --expiry especifica por quanto tempo o problema deve ser ignorado, e a flag --reason informa o motivo. Esse comando cria um arquivo de políticas .snyk no diretório raiz com informações sobre a vulnerabilidade. Assim, ela não será sinalizada em futuras execuções de snyk test.

snyk container

A Snyk CLI tem dois comandos para contêineres (test e monitor) que testam e monitoram imagens de contêineres locais ou remotas, como imagens Docker, em busca de vulnerabilidades conhecidas. A sintaxe dos dois comandos é:

snyk container test <image>:<tag>
snyk container monitor <image>:<tag>

Como você criou a imagem durante a configuração com o nome vulnnode, teste-a usando:

snyk container test vulnnode

Você verá uma saída semelhante a esta:

Terminal mostrando um teste do Snyk Container para vulnode, com várias vulnerabilidades de gravidade média no OpenSSL/libcrypto e versões corrigidas.

Mais adiante neste artigo, você verá como corrigir esses problemas. Assim como no comando snyk monitor, você pode monitorar e capturar snapshots da imagem do contêiner vulnnode com o seguinte comando:

snyk container monitor vulnnode

snyk iac

Com IaC, recursos de nuvem, redes e configurações não são definidos manualmente: eles são gerenciados e provisionados por meio de código. O comando snyk iac identifica vulnerabilidades de segurança nos arquivos de configuração. Assim, você pode corrigir configurações incorretas antes que representem um risco à segurança.

Analise o arquivo IaC do Kubernetes com o seguinte comando:

snyk iac test kube.yml

Você verá uma saída semelhante a esta:

Saída do terminal mostrando os resultados do teste do Snyk Infrastructure as Code para kube.yml, incluindo quatro problemas de segurança de baixa gravidade no Kubernetes.

Agora que você analisou o projeto JavaScript, veja como corrigir alguns dos problemas identificados.

Como corrigir problemas de segurança no seu projeto JavaScript

Ao executar o comando snyk test, a Snyk CLI indica na saída que os problemas identificados podem ser corrigidos atualizando express da versão 4.17.1 para a 4.18.2 e lodash da versão 4.17.4 para a 4.17.21. Atualize as versões no seu package.json e reinstale usando npm install.

Depois de reinstalar, execute snyk test novamente. Você verá uma saída como esta:

Saída do terminal do Snyk test mostrando 51 dependências testadas e nenhum caminho vulnerável encontrado em um projeto npm.

E é só isso que você precisa fazer para corrigir as vulnerabilidades do projeto. Observação: se você conectar seu repositório Git à Snyk pelo app.snyk.io, a Snyk criará automaticamente novas pull requests com atualizações de dependências que corrigem problemas de segurança no arquivo de manifesto package.json.

No comando de teste snyk container, os problemas detectados são causados pelo aplicativo na imagem e pela imagem base usada:

Saída do terminal listando vulnerabilidades em dependências e recomendações para atualizar imagens base do Node.js.

A imagem base atual tem um problema crítico, quatro de alta gravidade e três de média gravidade. É recomendável corrigir rapidamente os problemas críticos e de alta gravidade, pois eles podem afetar seriamente seu aplicativo se forem explorados.

Para corrigir os problemas do contêiner, você pode atualizar a imagem base no Dockerfile para uma das opções sugeridas, como node:20.5-bookworm-slim:

+ FROM node:20.5-bookworm-slim AS development
- FROM node:16.15-alpine3.14 AS development

WORKDIR /app

# …

Observação: se você conectar seu repositório Git à Snyk pelo app.snyk.io, a Snyk criará automaticamente novas pull requests com atualizações no Dockerfile que corrigem os problemas de segurança, para você mesclar.

Recrie a imagem do contêiner usando o comando a seguir:

docker compose build app

Execute o teste do contêiner novamente. Desta vez, você verá uma saída como esta:

Resultado da análise de segurança da imagem Docker vulnnode, mostrando 28 problemas em dependências, incluindo uma vulnerabilidade de baixa gravidade em libapt-pkg6.0.

Essa correção elimina os problemas críticos e de alta gravidade. Os 28 problemas restantes são todos de baixa prioridade, então você pode continuar trabalhando normalmente.

Por fim, no comando snyk iac test, os problemas detectados são causados por algumas configurações que não foram incluídas no arquivo de manifesto kube.yml:

A verificação de segurança no terminal aponta problemas de escalonamento de privilégios no Kubernetes e resume oito problemas no total: quatro de gravidade média e quatro baixa.

Os problemas aqui são de média prioridade. Tente corrigir dois deles usando a solução recomendada pela Snyk CLI. Abra o arquivo kube.yml e atualize o contêiner:

#...      
    spec:
      containers:
      - name: nodeserver
        image: vulnnode:latest
        ports:
        - containerPort: 3000
        imagePullPolicy: Never
        resources:
          requests:
            memory: "64Mi"
            cpu: "500m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        securityContext:
          runAsNonRoot: true
          allowPrivilegeEscalation: false

# …

Execute snyk iac test kube.yml novamente. Você deverá ver o seguinte:

Relatório de análise de segurança que mostra dois problemas de gravidade média no Kubernetes e um resumo do teste com seis problemas no total.

Com isso, restaram dois problemas de média gravidade, que podem ser ignorados.

Para concluir

Neste artigo, você aprendeu como proteger seus aplicativos JavaScript: faça uma análise para identificar vulnerabilidades usando a Snyk CLI.

Gosta do terminal? Agora você pode usar a Snyk CLI para proteger facilmente seu código, seus aplicativos, contêineres e arquivos de IaC. A Snyk CLI é uma grande aliada dos desenvolvedores: ajuda a proteger os projetos contra possíveis ameaças e se integra perfeitamente ao fluxo de trabalho de desenvolvimento que você já usa. Cadastre-se grátis hoje mesmo.

Comece a proteger seus aplicativos JavaScript

Encontre e corrija vulnerabilidades em JavaScript gratuitamente com o Snyk.

Não é necessário informar um cartão de crédito.

Ou cadastre-se com o Azure AD Docker ID Bitbucket

Ao usar o Snyk, você concorda em cumprir nossas políticas, incluindo os Termos de Serviço e a Política de Privacidade.

Leia mais

blog feature snyk container custom base recommendations
Blog

Conheça o Evo Agentic AppSec: segurança que acompanha o ritmo do desenvolvimento com IA

O desenvolvimento impulsionado por IA está avançando mais rápido do que os fluxos de trabalho de segurança tradicionais. O AppSec agentivo da Snyk usa agentes de segurança para encontrar, corrigir e verificar vulnerabilidades continuamente, enquanto as pessoas definem os critérios.

blog feature ai violet
Blog

VulnBump: agentes de IA conseguem corrigir dependências vulneráveis sem quebrar o build?

O VulnBump testa agentes de IA em 307 atualizações reais de dependências. Uma correção só é considerada válida se eliminar a vulnerabilidade e mantiver o build e os testes funcionando.

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.