Pular para o conteúdo
Guide

Axios foi backdoor: pacotes de 5 npm para substituir por APIs HTTP

| 9 min read

Um ator ligado à Coreia do Norte enviou um RAT dentro do eixo 1.14.1 para 70 milhões de instaladores semanais. Cinco pacotes npm de propósito único que você pode excluir hoje e substituir por chamadas de API HTTP.

Server room with network cables representing supply chain infrastructure
Photo by Taylor Vick on Unsplash

Em 31 de março de 2026, uma operadora ligada à Coreia do Norte publicou duas versões backdoored do axios para npm. As versões 1.14.1 e 0.30.4 são fornecidas com uma dependência pós-instalação chamada plain-crypto-js que retirou um implante RAT específico da plataforma de sfrclak[.]com:8000. Os pacotes ficaram no ar por três horas. Axios recebe 70 milhões downloads semanais. Faça as contas.

Cada trabalho de CI executado npm install durante essa janela enviou uma carga útil para sua construção ambiente. Os segredos nas variáveis ​​de ambiente foram exfiltrados; tokens privados do GitHub se acostumaram novos lançamentos subsequentes; laptops de desenvolvedor em execução npm install localmente obteve um RAT. O incidente contornou o 2FA porque a máquina do mantenedor já estava comprometida por meio de um campanha direcionada de engenharia social. 2FA na conta npm não faz nada quando o invasor possui o terminal que executa npm publish.

Você não pode eliminar esta classe de ataque, mas pode diminuir o raio de sua explosão. Cada pacote npm isso faz uma pequena coisa; validar um e-mail, analisar um número de telefone, remover HTML, gerar um código QR, assinando um JWT; é um pacote que você pode excluir e substituir por uma chamada HTTPS para uma API que você controle via chave rotativa. Um pacote comprometido é executado antes que você possa reagir. Uma chave de API comprometida para de funcionar em segundos.

Aqui estão cinco pacotes npm que você pode substituir esta semana, pela API HTTP que faz a mesma coisa, além de um protetor de CI que impede que novos ganchos pós-instalação cheguem ao seu arquivo de bloqueio.

Audite sua superfície de dependência npm atual

Antes de excluir qualquer coisa, saiba o que você tem. Este passe de shell revela dependências de produção com ganchos de instalação e verifica se as versões envenenadas do axios estão em algum lugar da sua árvore:

Se alguma das versões do axios aparecer em seu arquivo de bloqueio, gire cada segredo para a máquina ou CI afetado trabalho teve acesso. Não "verifique os registros". Girar. Suponha que a exfiltração aconteceu nos 180 minutos entre publicação e remoção. Segredos que vazaram não podem ser revelados.

O Google Threat Intelligence atribui a operação ao UNC1069, o mesmo ator que executou mais cedo WAVESHAPER campanhas. Seu manual tem como alvo laptops de manutenção por meio de phishing e, em seguida, usa as credenciais do mantenedor para publicar. Sua defesa tem que assumir que pelo menos um mantenedor de pelo menos um dep transitivo está a um phishing de ser um implante sistema de entrega.

Substituição 1: validador de e-mail → /v1/e-mail/validar

validator, email-validator, deep-email-validator, e disposable-email-domains aparecem em uma grande parcela dos fluxos de inscrição. Juntos eles adicionam aproximadamente meio megabyte de peso de instalação, suas próprias árvores transitivas e uma lista mantida de domínios descartáveis que ficam obsoletos em semanas.

A API verifica a sintaxe, os registros DNS MX e uma lista ativa de domínios descartáveis ​​em uma chamada. Troca os dois pacotes ficam assim:

Você perde a capacidade de validar offline. Você ganha uma verificação MX mantida, uma lista descartável ativa, e zero pacotes com ganchos pós-instalação em sua árvore. Para inscrição, checkout e webhook campos de e-mail, essa compensação favorece a API.

Substituição 2: libphonenumber-js → /v1/telefone

libphonenumber-js é uma porta do Google libphonenumber. Ele pesa 147 KB minificado. A versão “mini” cai para 79 KB, mas perde metadados para a maioria dos países. Os metadados completos pacote traz o peso de volta para 2 MB descompactado. Em Cloudflare Workers ou em um Lambda frio, isso é latência real que você paga em cada invocação.

Um POST retorna formato E.164, país, número nacional, tipo de linha e fuso horário. Se o número é inválido, data.valid é false e o resto é nulo. Seu lado do servidor o fluxo de inscrição chama isso entre "ler formulário" e "gravar no banco de dados". A viagem de ida e volta da API de 60 ms fica dentro da janela de gravação do banco de dados existente.

Substituição 3: qrcode → /v1/qr/gerar

O qrcode O pacote npm em si é bom: 34 KB, sem gancho pós-instalação. O que não está bem é o canvas dependência de pares que metade dos tutoriais leva você, o que envolve código nativo, instala node-gyp e tem dez anos de CVEs em sua cadeia de ferramentas de construção. Todo nativo npm dep é uma costura da cadeia de suprimentos.

A resposta é SVG bruto. Canalize-o para um arquivo, coloque-o em um modelo de fatura ou renderize-o in-line em um componente React com dangerouslySetInnerHTML. Sem módulos nativos, sem compilação conjunto de ferramentas, sem árvore transitiva.

Substituição 4: jsonwebtoken → /v1/jwt/generate e /v1/jwt/decode

jsonwebtoken é uma das bibliotecas JWT mais copiadas no Node. É também a biblioteca a maioria das pessoas configura incorretamente: algoritmo errado, declaração de público ausente, sem expiração. Um algoritmo errado verificar chamada mais um cabeçalho controlado pelo invasor reintroduz o JWT da era 2015 none vulnerabilidade. A API impõe listas de permissões de algoritmos e rejeita tokens não assinados no endpoint:

Use isto para tokens de curta duração emitidos por um serviço de back-end: links de redefinição de senha, únicos URLs de download, tokens de portador serviço a serviço. Não use um serviço externo para sessão do usuário JWTs no caminho ativo de cada solicitação autenticada; para aqueles, mantenha uma biblioteca verificada em processo e bloqueie o algoritmo.

Substituição 5: html para texto → /v1/html-para-texto/converter

html-to-text, sanitize-html, node-html-parser, e seus amigos existem porque toda API que aceita conteúdo do usuário eventualmente precisa retirar o HTML para texto simples visualizações, resumos de e-mail ou indexação de pesquisa. Seu peso combinado é de 500 KB a 1,2 MB; eles puxam parse5 ou htmlparser2 pela porta, que cada um tem o seu superfície mantenedora.

Para uma produção mais rica, /v1/html-to-markdown retorna Markdown com sabor do GitHub e /v1/html-sanitize retorna HTML limpo com uma lista de permissões configurável. Escolha aquele que corresponda à forma como o consumidor downstream deseja armazenar o conteúdo.

Adicione um protetor de CI que bloqueie novos ganchos pós-instalação

Excluir pacotes é um trabalho único. Permanecer magro é contínuo. Esta verificação de ações do GitHub falha o PR se uma atualização do lockfile introduzir um novo postinstall ou preinstall gancho em qualquer lugar da árvore:

O cheque é barato, executado em todos os PR e força uma revisão humana antes que qualquer novo gancho de script chegue. Combine com npm config set ignore-scripts true em CI e listas de permissões explícitas para pacotes que você sabe que precisa esbuildpós-instalação de estilo (TypeScript, Puppeteer, bcrypt).

Do que você desistiu e quando colocar de volta

Mover a validação para uma chamada HTTP tem custos reais. Você os está trocando por uma dependência menor superfície:

Troca pacote npm API HTTP
Latência Microssegundos 50 a 150 ms da borda
Uso off-line Sim Não
Risco de instalação Postinstall executa código arbitrário Nenhuma etapa de instalação
Revogação Reconstruir, republicar, reimplantar Gire a chave de API em segundos
Trilha de auditoria Nenhum por padrão Solicitar registro por chamada
Desvio de versão Fixar ou renovar Cabeçalho da versão, contrato estável

A resposta certa é “ambos, com intenção”. Mantenha as bibliotecas de caminho crítico em processo (sessão JWT verificação, primitivas criptográficas, middleware de autenticação). Mova a longa cauda dos utilitários de propósito único fora do seu arquivo de bloqueio e em um endpoint HTTPS assinado que você pode revogar.

Principais conclusões

  • Suponha que um mantenedor esteja a um phishing de um implante. Axios obteve 70 milhões semanais downloads e ainda teve sua conta npm comprometida por meio de um ataque de engenharia social a um laptop pessoal.
  • Audite os ganchos pós-instalação hoje. Qualquer dependência que execute código arbitrário durante npm install é uma costura da cadeia de suprimentos. Faça um inventário deles e exclua-os ou coloque-os na lista de permissões.
  • Exclua primeiro os pacotes de propósito único. E-mail, telefone, QR, assinatura JWT, HTML conversão; cada um tem uma substituição HTTP de uma linha com uma chave revogável.
  • Gire, não investigue, após a exposição. Se axios envenenados pousaram em seu árvore, gire todos os segredos tocados pelo ambiente afetado. A exfiltração acontece em minutos.
  • Adicione um guarda CI. Bloquear novo postinstall ganchos de pousar em seu lockfile sem revisão humana. O compromisso do axios teria feito tropeçar esta guarda.

Botoi fornece substituições HTTP para os cinco pacotes acima e cerca de 145 mais de propósito único utilitários: hashing, geração de UUID, teste de regex, conversão de carimbo de data/hora, validação de esquema JSON, geração de código de barras, renderização de PDF e o resto. Uma chave de API, 5 req/min no nível gratuito, não instale ganchos. Navegue pelo documentos interativos ou ligue o Servidor MCP em seu Agente de codificação de IA para chamar os mesmos endpoints do Claude Code ou Cursor sem sair do editor.

FAQ

O que aconteceu com o pacote axios npm em março de 2026?
Entre 31 de março de 2026, 00h21 e 03h20 UTC, um invasor usou uma conta de mantenedor comprometida para publicar os axios 1.14.1 e 0.30.4 com uma dependência pós-instalação maliciosa chamada plain-crypto-js. A dependência baixou implantes RAT específicos da plataforma de sfrclak[.]com:8000. O Google Threat Intelligence atribui a operação ao UNC1069, um ator do nexo da Coreia do Norte. Os pacotes ficaram no ar por cerca de três horas, tempo suficiente para pousar em caches de CI e laptops de desenvolvedores em todo o mundo.
A substituição de pacotes npm por APIs HTTP reduz o risco?
Ele reduz a superfície de ataque de duas maneiras. Primeiro, você remove um gancho pós-instalação que executa código arbitrário em seu servidor de compilação. Em segundo lugar, você move a lógica de validação do laptop do desenvolvedor para um endpoint assinado somente HTTPS que você controla por meio da rotação de chaves de API. Um pacote envenenado é executado antes que você possa reagir; uma chave de API revogada para de funcionar em segundos.
Uma chamada HTTP é mais lenta que um pacote npm local?
Para uma única ligação em uma solicitação não solicitada, sim; a latência típica da API botoi é de 50 a 150 ms de um cliente na América do Norte até a borda da Cloudflare. Para a maioria dos fluxos do lado do servidor (inscrição, checkout, processamento de webhook) que se sobrepõem às chamadas de banco de dados que você já faz, não acrescenta nada mensurável. Para caminhos de alto rendimento, armazene em cache a resposta por hash de entrada para o mesmo perfil de latência de um pacote local.
Como faço para auditar meu repositório em busca de pacotes npm arriscados agora?
Execute npm audit --omit=dev para revelar dependências de produção e, em seguida, inspecione qualquer pacote com um gancho de pós-instalação ou pré-instalação usando os scripts npm ls e npm view {name}. Pacotes que fazem uma pequena coisa (validação de e-mail, geração de QR, assinatura JWT, análise de telefone, remoção de HTML) são fortes candidatos para migrar para uma chamada HTTP. Pacotes que fazem criptografia ou buscam ativamente conteúdo de rede são os alvos de auditoria de maior prioridade.
E se um provedor de API HTTP for comprometido em vez do npm?
O raio de explosão é menor e a detecção mais rápida. Você controla a chave de API e pode revogá-la em uma chamada. Seu provedor expõe uma página de status, um RSS de incidente e respostas assinadas por HTTPS. Compare isso com um pacote em execução dentro de sua compilação, onde a detecção requer a leitura de todos os ganchos pós-instalação em sua árvore de dependência transitiva. Nem o risco é zero; um lhe dá alavancas, o outro não.

Comece a construir com botoi

150+ endpoints de API para consultas, processamento de texto, geração de imagens e utilitários para desenvolvedores. Plano gratuito, sem cartão de crédito.