Skip to main content

Plugins para levar segurança e observabilidade de aplicações Node.js ao seu IDE

Escrito por
blog feature javascript review

23 de agosto de 2021

0 minutos de leitura

Como desenvolvedores, passamos muito tempo nos IDEs escrevendo código, refatorando, adicionando testes, corrigindo bugs e muito mais. Nos últimos anos, os IDEs se tornaram ferramentas poderosas, que ajudam em tudo, desde interagir com solicitações HTTP até aumentar nossa produtividade. Então, vale perguntar: e se também pudéssemos evitar problemas de segurança no código antes de enviá-lo? E se pudéssemos ter visibilidade do que acontece dentro das nossas aplicações em produção, no nível do código e diretamente no IDE?

É aí que entra a magia das ferramentas criadas para desenvolvedores. Com o plugin certo para seu IDE, observabilidade e segurança podem fazer parte dos fluxos de trabalho diários dos desenvolvedores — exatamente onde são mais eficazes.

Nesta publicação, vamos ver:

  • Como obter observabilidade do código em tempo real para suas estruturas de dados diretamente no IDE

  • Como identificar entradas de usuário maliciosas em uma aplicação Node.js em produção

  • Como encontrar e corrigir problemas de segurança no código e nas dependências de código aberto

Como obter observabilidade de aplicações em tempo real no IDE

Veja o que você precisa para acompanhar esta publicação:

  1. IntelliJ IDEA (o suporte do Lightrun para Visual Studio Code será lançado em breve — inscreva-se aqui para a versão beta e seja um dos primeiros a ter acesso!)

  2. Uma conta Lightrun, o plugin Lightrun para IntelliJ e o Node.js Agent, que ainda está em versão beta

Depois de instalar o plugin do IntelliJ IDEA, clique no botão Register para iniciar um processo de cadastro simples pelo navegador:

IDE com tema escuro exibindo código JavaScript, um painel de boas-vindas do Lightrun com os botões Login e Register e um painel de análise de segurança do Snyk

Em seguida, precisamos instalar e configurar o agente Lightrun Node.js para a aplicação Node.js. Você verá as instruções durante o cadastro; caso não as tenha visto, elas estão aqui novamente:

  1. Instale o agente lightrun na pasta do projeto executando: npm install lightrun

  2. Inicialize o agente Lightrun no início do código-base da aplicação Node.js, no arquivo de entrada app.js, da seguinte forma (os valores de <YOUR-COMPANY-NAME> e <YOUR-COMPANY-SECRET> serão exibidos na tela durante o cadastro):

    require('lightrun').start({ company: '', apiEndpoint: 'app.lightrun.com', lightrunSecret: '', caPath: '',});

Eu não estaria fazendo justiça ao assunto se não destacasse o alerta de segredos no código. Portanto, a primeira coisa que quero apontar depois que você chegar a esta etapa é atualizar esta linha de código para que lightrunSecret fique assim:

require('lightrun').start({
    company: '<YOUR-COMPANY-NAME>',
    apiEndpoint: 'app.lightrun.com',
    lightrunSecret: '<YOUR-COMPANY-SECRET>',
    caPath: '',
});

Depois, ao iniciar a aplicação localmente, lembre-se de disponibilizar primeiro essa variável de ambiente. Se você estiver executando a aplicação pela linha de comando, faça assim:

lightrunSecret: process.env.LIGHTRUN_API_KEY

Observação: você só precisa executar o comando export uma vez. Ele ficará disponível na sessão do shell do terminal enquanto você continuar usando a mesma sessão.

Depois de iniciar a aplicação, você verá na barra lateral direita que o plugin Lightrun está configurado e conectado. Isso é indicado pelo nome da sua máquina (a minha é “Lirans-MBP”):

export LIGHTRUN_API_KEY=<YOUR-COMPANY-SECRET>
npm run start

Como identificar entradas de usuário maliciosas em uma aplicação Node.js em produção

A aplicação Node.js que vamos testar é o Goof TODO da Snyk, uma aplicação completa para criar e fazer anotações de tarefas, desenvolvida em JavaScript e Node.js.

Você pode obter uma cópia clonando o projeto no GitHub e seguir as instruções comuns de instalação de dependências de projetos npm para começar. Lembre-se de que ela também precisa se conectar a um banco de dados MongoDB ao iniciar.

Depois de iniciar a aplicação, a tela deverá ser parecida com a imagem abaixo. Você verá que ela tem um recurso interessante. Se eu enviar uma tarefa como Get my app secured in 15 minutes, ela usará o pacote de código aberto npm humanize-ms para transformar o texto 15 minutes em um formato como [15m]. O pacote humanize-ms tem cerca de 4.500.000 downloads semanais, então parece uma boa escolha.

Janela do navegador mostrando um app “Goof TODO” com tarefas de segurança de aplicações, um plugin de IDE e observabilidade, além de segurança.

Se você se preocupa com segurança e já trabalhou com desenvolvimento de aplicações de back-end, provavelmente garantiu que a entrada atendesse a algumas validações e ao esquema esperado.

No entanto, essa aplicação está em produção e, embora eu não saiba que tipo de entrada ela está recebendo, não quero comprometer nenhuma funcionalidade. Ainda assim, quero ter visibilidade sobre entradas de usuário potencialmente perigosas que ela possa receber. É aí que o Lightrun se destaca!

Quero capturar alertas caso alguém envie uma entrada de usuário com mais de 10.000 caracteres. Para isso, vou adicionar um log do Lightrun com uma condição no IntelliJ, diretamente na linha de código que analisa o texto de entrada. Veja:

Editor de código exibindo o menu do Lightrun com opções de logs, pontos de interrupção virtuais, métricas, snapshots, configurações e sair

Para fazer isso, escolha o tipo de anotação Log ao clicar com o botão direito na linha de código e configure a regra de registro assim: item.length>10000

Editor de código exibindo uma janela para criar um registro, configurada para a linha 162 de index.js, com a condição item.length > 10000.

Isso basicamente cria o que eu chamaria de alerta, agora configurado na minha aplicação Node.js em execução. Assim, qualquer solicitação que chegar a esse trecho de código e atender à condição — uma entrada com mais de 10.000 caracteres — vai acioná-lo.

Depois de adicionar a ação, aparece uma anotação nesse trecho de código, junto com o nome de quem a adicionou. É uma ótima forma de chamar a atenção e fornecer informações valiosas aos desenvolvedores responsáveis pela dívida técnica e pela refatoração no futuro:

Editor de código com tema escuro exibindo JavaScript que analisa a entrada do usuário e salva uma nova tarefa com conteúdo e data de atualização

Adicionar um alerta pelo IDE é ótimo, mas sabe o que é ainda melhor? Poder ver esses alertas diretamente no console do IDE, sem precisar abrir uma página da web para consultar os logs.

Para fazer isso, acesse a barra lateral direita do plugin Lightrun e, na entrada do agente, clique no ícone mais à direita, identificado como PIPE. Em seguida, clique no botão Both. Assim, os logs de alerta serão enviados tanto para o aplicativo SaaS da Lightrun quanto diretamente para a janela do console Lightrun no meu IDE. Boa!

Interface escura de um aplicativo mostrando o agente de produção Lirans-MBP, a linha 162 de index.js e um menu aberto com as opções App, Plugin e Both.

Agora que configuramos um alerta, vamos testar o envio de alguns payloads grandes. Para isso, vou usar algumas ferramentas úteis de linha de comando:

  1. Configuração do shell Oh My Zsh (quem não gosta de um prompt de shell estiloso?)

  2. A ferramenta HTTPie para enviar a solicitação HTTP que adiciona uma tarefa

  3. A ferramenta Unix seq para repetir facilmente um caractere um determinado número de vezes

Com elas, vou enviar o payload usando este comando:

echo 'content=Buy milk in 'seq -s "" -f "5" 60000 'minutes' | http --form http://localhost:3001/create -v

Isso cria o texto da tarefa Buy milk in 500000... minutes, em que o número 5 é seguido por mais 60.000 zeros — uma string bem grande.

Na interface da aplicação, o resultado é este:

Janela do navegador exibindo o app “Goof TODO” com tarefas como comprar leite, proteger um app, baixar um plugin para IDE e adicionar observabilidade e segurança.

Como você pode ver, a aplicação não travou, nem o banco de dados MongoDB. O único efeito colateral parece ser que o pacote npm humanize-ms simplesmente interpreta esse tempo como a palavra Infinity. No geral, faz sentido e não parece ser um problema de verdade.

Lembra que configuramos um alerta no IDE?

Vamos ver como ficou…

Está vendo a linha destacada na janela do Lightrun Console? Recebemos alertas que atendem a uma condição de registro para uma solicitação HTTP enviada a uma aplicação em produção, tudo diretamente no IDE. É muito útil — e ainda mais prático!

Editor de código com tema escuro exibindo JavaScript, um painel do Lightrun e o console com um alerta sobre uma entrada de usuário potencialmente longa e perigosa.

Mas por que tanto alarde em torno desse alerta? Continue lendo...

Como encontrar e corrigir problemas de segurança no código e nas dependências de código aberto

Aparentemente, aquela versão do pacote npm humanize-ms tem algumas vulnerabilidades indiretas de segurança. Os 4.500.000 downloads semanais eram enganosos! A vulnerabilidade nesse pacote pode ter consequências graves para qualquer aplicação web Node.js.

Como sei disso? Porque instalei o plugin Snyk para IntelliJ e pedi que verificasse meu projeto. Ele identificou essa e algumas outras vulnerabilidades. Vamos ver como executar uma análise e entender a gravidade dessa vulnerabilidade usando o alerta de payload de entrada grande do Lightrun.

Depois de instalar e autenticar o plugin Snyk para IntelliJ (veja este guia passo a passo de instalação do plugin), clique no botão verde Play na janela do plugin Snyk para iniciar uma análise de segurança.

A análise vai procurar os seguintes possíveis problemas de segurança:

  1. Vulnerabilidades de segurança em bibliotecas de código aberto de terceiros, como os pacotes npm que você importa para o código-base. Se você estiver analisando projetos em outras linguagens, como Java, Ruby e Python, a Snyk também detectará automaticamente os arquivos de manifesto dos pacotes e fará a análise.

  2. Problemas de segurança do código no seu próprio código. Atualmente, há suporte para JavaScript, TypeScript, Java e Python.

Veja os resultados da análise de segurança do Snyk Open Source para os pacotes npm de terceiros que adicionei como dependências a este projeto TODO:

Editor de código JavaScript exibindo uma função para salvar tarefas ao lado de um painel do Snyk que lista vulnerabilidades de segurança em código aberto

Ao percorrer os resultados, você verá que esta aplicação TODO tem várias vulnerabilidades de segurança. Ela foi criada intencionalmente com vulnerabilidades para que possamos demonstrá-las, praticar e aprender como corrigi-las.

Lembra do pacote npm humanize-ms que usamos para analisar e formatar strings de tempo? Ao que parece, ele traz uma vulnerabilidade de negação de serviço por expressão regular (ReDOS), pois depende de uma versão vulnerável do popular pacote npm ms:

Editor de código com tema escuro exibindo resultados de vulnerabilidades do Snyk, incluindo cross-site scripting, poluição de protótipo e negação de serviço por expressão regular.

Vamos voltar ao payload de exploração e analisá-lo novamente:

echo 'content=Buy milk in 'seq -s "" -f "5" 60000 'minutes' | http --form http://localhost:3001/create -v

Como você deve se lembrar, ao executar esse comando, enviamos uma string muito longa como tarefa, mas, pelo que conseguimos observar, ela não causou nenhum tipo de negação de serviço. A aplicação continuou processando as solicitações normalmente, e a aplicação Node.js respondeu quase imediatamente.

No entanto, expressões regulares são… complicadas. Se não forem escritas corretamente, podem estar sujeitas a backtracking catastrófico. Isso significa, basicamente, que o tempo de processamento de uma entrada linear pode crescer de forma superlinear.

Para que meu payload de exploração ataque essa aplicação de forma eficaz, só preciso trocar a palavra minutes por minutea e enviar o comando. Para mostrar o antes e o depois, veja esta captura de tela, feita antes de eu enviar a solicitação, com o comando htop mostrando o uso normal da CPU no meu notebook:

Espaço de trabalho de desenvolvimento com código JavaScript, processos no terminal e um painel da Snyk que detalha uma vulnerabilidade de negação de serviço por expressão regular.

Com uma vulnerabilidade ReDOS, espero que a aplicação Node.js leve bastante tempo para processar a expressão regular e, por causa da arquitetura de thread único do Node.js, todas as solicitações seguintes fiquem paradas. A CPU vai chegar a 100% enquanto todos os recursos disponíveis são consumidos, em vão, no processamento da expressão regular.

Vamos enviar nosso payload de exploração ReDOS:

echo 'content=Buy milk in 'seq -s "" -f "5" 60000 'minutea' | http --form http://localhost:3001/create -v

Veja só! O terminal no canto superior direito mostra a solicitação HTTP enviada, sem resposta imediata. No terminal inferior esquerdo, o processo Node.js aparece destacado em verde no topo da tabela, usando 98,4% dos recursos da CPU:

Ambiente de desenvolvimento em modo escuro com código JavaScript, processos no terminal, um console repleto de caracteres repetidos e detalhes de vulnerabilidades do Snyk.

O próximo passo, claro, é corrigir esse e os outros problemas de segurança que encontrei. Depois que você importar seus projetos para a aplicação Snyk, ela fará análises e monitoramento contínuos em segundo plano. Também abrirá automaticamente solicitações pull nos seus repositórios Git, no GitHub ou em outras plataformas, para atualizar as versões vulneráveis dos seus projetos. Saiba mais no artigo sobre como começar a usar o Snyk Open Source.

Segurança e observabilidade pensadas para desenvolvedores

Ferramentas pensadas para desenvolvedores, como Lightrun e Snyk, ajudam a aumentar a produtividade no dia a dia ao levar os dados até eles, em vez de tirá-los dos fluxos de trabalho.

Usar observabilidade e segurança diretamente no IDE IntelliJ ou na linha de comando ajuda os desenvolvedores a monitorar o tráfego em tempo real e encontrar e corrigir problemas de segurança antes mesmo que cheguem ao servidor de integração contínua — quanto mais à produção.

Para começar a usar as duas soluções, confira estes recursos:

  1. Comece a usar o Snyk

  2. Comece a usar o Lightrun

Comece a participar de desafios de Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.