npm install e reza: a crise de confiança que ninguém quer admitir
Toda semana é um pacote diferente, uma sanitização que faltou, um CVE que apareceu. O TanStack foi só o último da fila. O problema é a fila.
O pacote mais hypado do ecossistema React esqueceu de sanitizar um HTML. CVSS 8.2. Em 2024. E a galera já tinha jogado em produção.
TL;DR
🔓 O @tanstack/react-query-next-experimental tinha um XSS clássico: dados entravam crus no HTML, sem escape nenhum. CVSS 8.2, complexidade baixa, zero autenticação necessária.
💀 53 milhões de downloads por semana, 1,3 milhão de repos dependentes. Não era pacote obscuro, era o crossover mais popular do frontend: React + Next.js + SSR.
🤡 “Experimental” no nome não impediu ninguém de jogar em produção. Disclaimer legal não é controle de segurança.
🛠️ A correção saiu (5.18.0), mas a pergunta real é: quantos projetos atualizaram?
🏠 A casa da sogra do ecossistema JavaScript
O ecossistema JavaScript é tipo construir em cima da casa da sogra. Cê gasta uma grana, faz acabamento bonito, forro de gesso, iluminação embutida. Aí a velha toma raiva de você, cê perde a esposa, perde a casa, e ainda fica devendo o pedreiro.
É isso que é usar JavaScript em 2026, mano. Cê bota em produção, tá rodando liso, e um dia acorda e a lib que cê confiou tua aplicação esqueceu de sanitizar um HTML.
Janeiro de 2024. Sai um advisory de segurança no GitHub do TanStack Query. CVE-2024-24558 (NVD, jan/2024). Cross-Site Scripting. XSS. O ataque mais velho do manual. Aquele que cê aprende na primeira semana de curso de segurança.
🚨 O que aconteceu: constrangedoramente simples
O pacote afetado é o @tanstack/react-query-next-experimental. Versões 5.0.0 até a 5.17. Qualquer app que usava esse pacote pra fazer Server-Side Rendering com streaming hydration tava com a porta escancarada.
E como o ataque funciona? O pacote renderiza a página no servidor, pega os dados, monta o HTML, manda pro browser. Até aqui beleza. Só que na hora de colocar esses dados dentro do HTML, não tinha escape nenhum. Zero. Nada. O dado entrava cru, puro, como churrasco sem sal.
Sanitizar input é tipo lavar a mão antes de comer. Cê aprende com cinco anos de idade. Mas no ecossistema JavaScript, aparentemente, isso é feature avançada.
Os detalhes do CVSS (Vulert, jan/2024) são de chorar: Attack Vector: Network. Attack Complexity: Low. Privileges Required: None. User Interaction: None. Confidentiality Impact: High. Session hijacking, roubo de cookie, keylogging, phishing. Buffet liberado pro atacante.
E o workaround? Não existia. A única solução era atualizar pra 5.18.0.
🤔 “Ah, mas era experimental”: a maior mentira piedosa do JavaScript
Sim, paizão. O nome do pacote tem “EXPERIMENTAL” nele. E eu sei que cê tá pensando que isso diminui o problema. Mas me acompanha aqui.
O TanStack hoje não é projetinho de garagem. São 4 bilhões de downloads acumulados (TanStack Blog, 2024). 112 mil stars no GitHub. Mais de 9 mil empresas usando em produção. O @tanstack/react-query sozinho faz 53 milhões de downloads por semana (npm).
Quando o ecossistema mais hypado do momento lança um pacote que integra com o Next.js, que é o framework que todo Front Enzo tem tatuado no braço, cê acha que o cara vai ler “experimental” e pensar “melhor esperar a versão estável”?
Claro que não. O Front Enzo viu “TanStack + Next.js + streaming hydration” e o cérebro desligou. Já tava fazendo npm install antes de terminar de ler o README. O cara tá lá no Twitter postando “migrei meu app pra streaming SSR com TanStack em 30 minutos” e os 47 likes já vieram. Agora pede pra ele achar o escape do HTML no pipeline de renderização. Silêncio. Grilo. Tumba.
“Experimental” no ecossistema JavaScript é um disclaimer legal pra quando dá merda, mas na prática? O dev testa na sexta, funciona no staging, e segunda já tá em produção servindo milhares de usuários. Ninguém lê. Ninguém respeita. É tipo placa de “não pise na grama” em parque público. Tá lá, todo mundo viu, ninguém liga.
E nesse exato período, a galera tava migrando do Next puro pro TanStack Query em massa. O T3Chat migrou (CrazyStack, mar/2025). O State of React 2025 confirmou o êxodo. Era o Black Friday do npm install. E o pacote que fazia a ponte entre os dois mundos? Porta aberta com tapete vermelho pro atacante.
💡 E daí? (O Que Fazer Com Isso)
Checklist prático, anota aí.
Primeiro: abre teu package.json e procura qualquer pacote com “experimental”, “beta”, “canary”, “alpha”, “rc” no nome. Se tiver em produção, acende o alerta. Se tiver em produção E você não sabia, acende o extintor.
Segundo: se você usa @tanstack/react-query-next-experimental, verifica a versão. 5.18.0 ou superior. Se não é, atualiza agora. Não depois do almoço. Agora.
Terceiro: configura npm audit no teu CI se ainda não tem. Uma flag:
npm audit --audit-level=high. Se acusar, bloqueia o deploy. É o mínimo. É lavar a mão antes de comer.Quarto: teu projeto TanStack roda SSR? Review toda sanitização de dados que vem de API e vai parar no HTML. Defesa em profundidade nunca é demais. Porque se tem uma coisa que o JavaScript ensina é que onde teve um XSS, vai ter outro.
E o ponto que eu mais quero que cê leve daqui: para de tratar “experimental” como “funciona mas sem garantia de suporte”. Trata como “pode explodir e levar teus dados junto”. Porque o Front Enzo que jogou em produção sem ler o rótulo não vai ser o Front Enzo que acorda de madrugada quando o atacante explorar.
🔗 Referências
🎥 Assiste o vídeo completo
Se preferir vídeo, tá tudo aqui: os dados na tela e a cara de indignação na hora certa.
📍 Continua a resenha
Lives: terça e quinta, 10h da manhã (puro suco de chorume)
Instagram: @manodeyvin
X/Twitter: @manodeyvin
LinkedIn: linkedin.com/company/chorume
Vai lá no teu projeto agora. Roda o npm audit. Volta aqui e me conta nos comentários o que encontrou. Aposto um café que tem surpresa. 👇

