← back
CVE-2025-54313highunder attackCWE-506

CVE-2025-54313

71Vexday Risk Score

Prioritize patching. It under exploitation confirmed by CISA and has a public proof of concept.

ssvc Actcvss 7.5epss 4.3%
from disclosure to weapon7 days
Published on NVDJul 19
1st PoC+7d
CISA KEV+187d
exploitation probability
4.3%top 9% of all CVEs
observed exploitation
yesCISA + VulnCheck
2 public exploit(s)
What the vendors declare (VEX)

Official vendor statements in CSAF/VEX format: whether their product is affected, already fixed, or ruled out — and why. These are the vendor's assertions, not Vexday's judgment.

Not affected
19 products (122 components)because the vulnerable code is not present in the product
Red Hat OpenShift AI (RHOAI) · Red Hat Enterprise Linux 8 · Red Hat Enterprise Linux 9 · Red Hat Enterprise Linux 10 · OpenShift Pipelines · and others 14
Action required by CISAfederal deadline: 2026-02-12

Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.

Summary

Quatro versões do pacote npm eslint-config-prettier (8.10.1, 9.1.1, 10.1.6 e 10.1.7) foram publicadas por um atacante que roubou o token npm do mantenedor via phishing, e continham um script de pós-instalação que tenta executar uma DLL maliciosa em máquinas Windows. O pacote tem mais de 30 milhões de downloads semanais e é puxado automaticamente por praticamente qualquer projeto que usa Prettier + ESLint, o que torna o alcance potencial enorme mesmo sendo um ataque pontual e já contido pelo mantenedor.

Technical detail

Não é uma falha de lógica no código do eslint-config-prettier — é um comprometimento de cadeia de suprimentos (CWE-506, código embutido malicioso) via roubo de credencial de publicação. O mantenedor (JounQin) recebeu um e-mail de phishing convincente, com remetente falsificado como 'support@npmjs.com', apontando para o domínio typosquat 'npnjs.com'. Ao inserir credenciais nesse site, seu token de publicação no registro npm foi roubado e usado para publicar quatro versões sem nenhum commit ou PR correspondente no repositório GitHub — sinal que expôs o ataque rapidamente.

As versões maliciosas incluem um arquivo 'install.js' registrado como hook 'postinstall' no package.json. Dentro dele há uma função chamada 'logDiskSpace()' que, a despeito do nome, não monitora disco: ela invoca o binário do sistema Windows 'rundll32.exe' para carregar uma DLL chamada 'node-gyp.dll' embutida no pacote. Essa DLL é um trojan reconhecido (detecção de 19/72 engines no VirusTotal no momento da divulgação), com potencial de execução remota de código no host onde o pacote foi instalado.

O mesmo mantenedor teve outros pacotes seus comprometidos com a mesma técnica: eslint-plugin-prettier (4.2.2, 4.2.3), synckit (0.11.9), @pkgr/core (0.2.8) e napi-postinstall (0.3.1). Um pacote de terceiros não relacionado, 'got-fetch' (versões 5.1.11 e 5.1.12), foi comprometido de forma quase idêntica, com uma DLL chamada 'crashreporter.dll' — indício de que se trata do mesmo grupo atacante rodando uma campanha mais ampla contra mantenedores npm.

How it’s exploited

O vetor de exploração não depende de nada que o usuário final da vítima faça além de instalar o pacote: o payload roda automaticamente via hook 'postinstall' do npm no momento do 'npm install' (ou equivalente em pnpm/yarn/bun), sem interação adicional. É por isso que o vetor CVSS marca UI:N — a 'interação' já é o ato normal de instalar dependências. A complexidade de ataque (AC:H) reflete o pré-requisito real: o atacante precisa primeiro comprometer as credenciais de publicação de um mantenedor legítimo, o que aqui aconteceu por phishing direcionado, não por falha técnica no npm.

O payload é condicionado à plataforma: só é efetivo em máquinas Windows. Ambientes Linux e macOS que instalaram as mesmas versões não executam o carregamento da DLL, conforme confirmado por equipes que analisaram o incidente. Isso limita bastante o impacto prático em ambientes de produção baseados em containers Linux, mas afeta diretamente estações de desenvolvimento Windows e pipelines de CI/CD que rodam em runners Windows — que é onde 'devDependencies' como linters normalmente são instaladas.

A janela de exploração ativa foi curta: os pacotes maliciosos foram publicados em 18 de julho de 2025, detectados pela comunidade horas depois via diff suspeito entre versões npm sem commits correspondentes no GitHub, e o mantenedor revogou o token e depreciou as versões no mesmo dia. Ferramentas de atualização automática de dependências (Dependabot, Renovate) e pipelines fixados em 'latest' aumentaram o risco de ingestão automática durante essa janela.

Versions

Affected
eslint-config-prettier: 8.10.1, 9.1.1, 10.1.6 e 10.1.7 (versões maliciosas publicadas sem commits correspondentes no repositório). Pacotes relacionados do mesmo mantenedor também comprometidos na mesma campanha: eslint-plugin-prettier 4.2.2 e 4.2.3; synckit 0.11.9; @pkgr/core 0.2.8; napi-postinstall 0.3.1. Pacote de terceiro afetado por ataque similar (mesmo autor da ameaça, suspeita): got-fetch 5.1.11 e 5.1.12.
Fixed in
Não há número de versão de correção oficial confirmado nas fontes analisadas. O mantenedor depreciou as versões maliciosas no registro npm e coordenou sua remoção; a orientação prática registrada foi fazer rollback para eslint-config-prettier 10.1.5 ou versão anterior — comprovadamente limpa por preceder o incidente — e verificar, para qualquer versão publicada após 18/07/2025, se há commit/PR correspondente no GitHub antes de confiar nela.

How to protect

Não instale nem mantenha em lockfiles as versões afetadas: eslint-config-prettier 8.10.1, 9.1.1, 10.1.6, 10.1.7. O mantenedor marcou essas versões como 'deprecated' no registro npm e coordenou a remoção junto ao suporte do npm; segundo o próprio ecossistema, o caminho seguro é fazer rollback para 10.1.5 ou uma versão anterior conhecida como limpa, ou para uma versão publicada após a remediação do incidente — verifique a data de publicação e a existência de commit correspondente no GitHub antes de confiar em qualquer versão nova. Não há, nas fontes analisadas, um número de versão específico anunciado pelo fornecedor como 'a correção oficial'; trate qualquer versão 8.10.1/9.1.1/10.1.6/10.1.7 como definitivamente comprometida e qualquer versão publicada com correspondência de commit no repositório como confiável.

Ação imediata recomendada: auditar package-lock.json, pnpm-lock.yaml, yarn.lock e bun.lock em busca das versões listadas (inclua também eslint-plugin-prettier 4.2.2/4.2.3, synckit 0.11.9, @pkgr/core 0.2.8, napi-postinstall 0.3.1 e, se usado, got-fetch 5.1.11/5.1.12). Se instalação ocorreu após 18 de julho de 2025 em máquina Windows, apague node_modules, limpe o cache do npm e reinstale a partir de um lockfile limpo; considere a máquina potencialmente comprometida até análise, e rotacione segredos que possam ter sido expostos durante builds executados nesse período.

Controle compensatório estrutural, não específico desta CVE: fixar versões exatas em CI/CD em vez de usar tags 'latest' ou ranges semver amplos, exigir 2FA em contas npm de mantenedores (mitigação do lado do fornecedor, fora do seu controle direto, mas relevante para avaliar risco de dependências), e usar ferramentas de escaneamento de pacote que alertem sobre scripts de instalação inesperados ou novas versões sem histórico de commit correspondente. Atualizar 'apenas' para a versão mais recente não é garantia — o mito a evitar é assumir que 'a última versão publicada é sempre a mais segura'; neste incidente, era exatamente o contrário.

How to detect

Procure pelo hook 'postinstall' apontando para um arquivo 'install.js' contendo uma função chamada 'logDiskSpace()' nas dependências instaladas — esse nome de função é a assinatura reportada do payload. Em nível de sistema Windows, procure por processos 'rundll32.exe' sendo filhos de processos node/npm/pnpm/yarn, especialmente carregando uma biblioteca chamada 'node-gyp.dll' (ou, no caso do pacote relacionado got-fetch, 'crashreporter.dll') fora dos caminhos esperados de instalação nativa do node-gyp legítimo.

Em nível de dependências, faça grep nos lockfiles por eslint-config-prettier@8.10.1, @9.1.1, @10.1.6 ou @10.1.7 (e nas versões correlatas listadas em versions_affected) — a presença de qualquer uma delas é evidência direta de exposição, independente de ter sido explorada. Não há um indicador de rede confiável e público (C2, domínio de callback) documentado nas fontes consultadas; o risco maior é local, via execução da DLL, e a ausência de tráfego de rede suspeito não descarta comprometimento.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
eslint-config-prettier 8.10.1, 9.1.1, 10.1.6, and 10.1.7 has embedded malicious code for a supply chain compromise. Installing an affected package executes an install.js file that launches the node-gyp.dll malware on Windows.
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:H/A:N
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.