9 pontos por GN⁺ 2025-12-19 | 1 comentários | Compartilhar no WhatsApp
  • Um estudante do ensino médio de 16 anos documentou e divulgou um caso em que era possível realizar ataques de cross-site scripting (XSS) em sites de documentação de grandes empresas como X, Vercel, Cursor e Discord explorando uma vulnerabilidade na plataforma Mintlify. Com essa falha, ele recebeu US$ 11.000 em bug bounty
  • O caminho interno da Mintlify /_mintlify/static/[subdomain]/[...route] tinha uma estrutura que permitia carregar arquivos externos sem validação de domínio
  • O atacante podia injetar JavaScript em um arquivo SVG e executar scripts maliciosos em domínios de grandes serviços, como o Discord
  • A vulnerabilidade afetava quase todos os clientes que usam Mintlify, e um único clique em um link podia permitir o sequestro de conta
  • O caso é avaliado como um exemplo de como uma única falha de segurança na cadeia de suprimentos pode levar a um impacto em larga escala

Descoberta no Discord

  • Em novembro de 2025, quando o Discord migrou para a plataforma de documentação Mintlify com IA, começou a busca pela vulnerabilidade
    • Logo após a migração da plataforma personalizada anterior para a Mintlify, o pesquisador analisou a estrutura do novo sistema de documentação
  • O domínio de documentação do Discord (discord.mintlify.app) expunha diretamente os caminhos internos da Mintlify (/_mintlify/*)
    • Esse caminho precisava permanecer acessível por ser essencial para recursos importantes, como autenticação

Estrutura da plataforma Mintlify

  • A Mintlify é um serviço que oferece criação de documentação baseada em Markdown e a converte automaticamente em documentação web
  • Todos os sites de documentação operam em subdomínios *.mintlify.app ou em domínios personalizados
  • Internamente, usa endpoints como /_mintlify/api/user, /_mintlify/markdown/ e /_mintlify/static/

Processo de busca da vulnerabilidade

  • Foi descoberto que o endpoint /_mintlify/_markdown/_sites/[subdomain]/[...route] retornava arquivos de outra documentação sem validação de domínio
    • Porém, esse caminho retornava apenas texto Markdown não renderizado, então não era possível executar código
  • Depois, ao analisar o pacote Mintlify CLI, foi descoberto adicionalmente o endpoint /_mintlify/static/[subdomain]/[...route]
    • Esse caminho retornava arquivos estáticos e aplicava uma whitelist de extensões de arquivo
    • Arquivos HTML e JS eram bloqueados, mas arquivos SVG eram permitidos

Execução do ataque

  • O atacante enviou para sua própria documentação da Mintlify um arquivo SVG com JavaScript injetado
  • Ao chamar esse arquivo a partir do domínio do Discord (https://discord.com/_mintlify/_static/.../lmao.svg), o script era executado
  • Com isso, era possível executar XSS não só no Discord, mas também nos domínios de documentação de todas as empresas que usam Mintlify

Colaboração e reporte

  • O pesquisador trabalhou em conjunto com outros pesquisadores de segurança para validar a vulnerabilidade
  • O Discord, logo após o reporte, desativou toda a documentação de desenvolvedores por 2 horas e depois retornou à plataforma anterior
  • Depois de tomar conhecimento da falha por meio do Discord, a Mintlify abriu um canal no Slack entre a equipe de engenharia e os pesquisadores para realizar a correção imediatamente

Escopo do impacto

  • A maior parte dos clientes da Mintlify, como X (Twitter), Vercel, Cursor e Discord, estava dentro da área afetada
  • Havia a possibilidade de sequestro de conta com um único link malicioso nos domínios oficiais de cada empresa
  • Uma única vulnerabilidade na cadeia de suprimentos pode causar um risco em cascata para a segurança de centenas de empresas

Recompensa e conclusão

  • A equipe de pesquisa recebeu no total cerca de US$ 11.000 em bug bounty
    • O Discord pagou US$ 4.000, e a Mintlify concedeu recompensas adicionais por vulnerabilidades individuais
  • Este caso permanece como um exemplo representativo da importância da segurança da cadeia de suprimentos e do alcance de uma vulnerabilidade em uma plataforma única

1 comentários

 
GN⁺ 2025-12-19
Comentários do Hacker News
  • Este exploit é um caso realmente assustador
    Basta clicar em um único link, por exemplo https://discord.com/_mintlify/static/evil/exploit.svg, para que JavaScript seja executado no domínio do Discord
    Como resultado, cookies de sessão ou tokens podem ser roubados, permitindo o controle total da conta, a manipulação de apps de desenvolvedor ou webhooks, ou até a exclusão de servidores via API e a compra de Nitro usando informações de pagamento
    Considerando a dimensão do dano, uma bug bounty de $4.000 parece uma recompensa pequena demais

    • Para roubar cookies ou tokens, é preciso que existam cookies sem HTTP-only ou tokens no localStorage; fico na dúvida se o Discord realmente é estruturado assim
      Se os cookies de sessão fossem sempre definidos como HTTP-only, esse tipo de ataque seria muito mais difícil
      É surpreendente como muitos desenvolvedores frontend ainda não conhecem esses conceitos básicos de segurança
    • Concordo com a ideia de que $4.000 é pouco demais
      No mercado negro isso provavelmente teria um valor bem maior
  • Acho que o simples fato de ser possível colocar scripts dentro de arquivos SVG já foi um erro de segurança
    É legal poder criar demos interativas ou jogos inteiros em um único SVG, mas isso também o torna um terreno fértil para vulnerabilidades
    Por isso, muitas plataformas bloqueiam upload de SVG ou impedem a pré-visualização
    No Discord, ao enviar um SVG, ele aparece como código puro, e em plataformas como Facebook Messenger ou WeChat o compartilhamento também não é permitido
    Mesmo com vantagens como tamanho reduzido e independência de resolução, ainda é uma pena que os formatos de imagem raster continuem sendo mais usados

    • Todo SVG deveria ser rigorosamente sanitizado tanto no upload quanto na renderização
      O Active Storage do Rails, por padrão, não sanitiza SVG, então é preciso tomar cuidado
    • O problema de XML External Entity (XXE) foi um caso parecido
      Veja a documentação da OWASP
    • Fico curioso se bastaria fazer os apps de mensageria simplesmente ignorarem a tag <script>
      Mas talvez isso por si só não seja suficiente
    • Isso faz lembrar os bugs de segurança da era do Flash
    • Um problema ainda maior com SVG é que o resultado da renderização varia de software para software
      Em formatos raster isso quase não acontece
  • Este caso parece mostrar um retrato do atual ecossistema de startups de IA
    Uma startup de documentação de IA que cresceu com dinheiro de VC conquista grandes clientes sem validação adequada de segurança e, no fim, expõe milhões de pessoas a risco
    A Mintlify publicou recentemente um post no blog se gabando de uma arquitetura complexa de cache, mas na prática parece não dominar nem o básico de segurança
    E quem encontrou a vulnerabilidade recebeu apenas $5.000
    Acho que isso mostra o quão frágil é a atual cultura de desenvolvimento baseada em IA

    • Na verdade, esse tipo de ataque não é um problema só de startups de IA, mas sim um problema estrutural de todo o ecossistema JavaScript
      A causa raiz está nas cadeias complexas de dependências e no inferno de múltiplas DLLs de terceiros
    • A maior parte dos XSS existe por causa de uma estrutura de domínio único
      Se o Discord não servisse a documentação da API diretamente em discord.com, esse problema não existiria
    • Fico me perguntando por que um site de documentação precisaria de uma arquitetura de cache complexa
      Um CDN não deveria ser suficiente?
  • É um bug que permite tomar completamente a conta do cliente, mas a recompensa é baixa demais
    E hoje em dia não deveria haver motivo para permitir XSS

    • XSS ainda não desapareceu, e defesas como CSP ou Trusted Types também não são perfeitas
      No Anubis, duas falhas de XSS refletido foram encontradas só este ano
      Dependências de terceiros precisam ser auditadas obrigatoriamente
      Veja os avisos de segurança aqui e aqui
    • Em geral, vulnerabilidades de XSS quase não têm valor de mercado
      Fora de grandes redes sociais, costuma ser difícil transformá-las em ganho financeiro
  • Ao ver que foi um hacker de 16 anos quem encontrou isso, pensei: por que não contratá-lo em tempo integral ou parcial para fazer auditoria contínua de segurança?
    Mesmo pagando $50.000 por ano, parece que a segurança da empresa melhoraria drasticamente

    • Mas uma estrutura contratual que coloque pressão por resultados sobre o pesquisador não é adequada
      Bug bounty é mais eficiente porque recompensa pelos resultados
      Ainda assim, se o valor for baixo, surge a tentação de vender para terceiros
    • A maioria dos participantes de bug bounty tem especialidades diferentes
      XSS, IAM, exploits de shell etc.; cada um atua melhor em uma área, então é difícil uma única pessoa cobrir tudo
    • Sinceramente, essas empresas não ligam muito para segurança
  • Impressionante que um jovem de 16 anos tenha encontrado isso
    Mas chamar XSS de ataque à cadeia de suprimentos (supply chain attack) ainda soa estranho para mim

    • O uso do termo parece um pouco incorreto, mas, por ele ser jovem, dá para entender
    • Ainda assim, olhando pela ótica da cadeia de suprimentos, faz algum sentido
      Quando o problema acontece em uma camada intermediária como a Mintlify, o usuário final não tem nenhum meio de defesa
      Como o código malicioso é entregue dentro de uma cadeia confiável, dá para ver isso como uma espécie de XSS em nível de supply chain
  • O relatório do colaborador também inclui uma vulnerabilidade de RCE ainda mais grave
    Veja mais detalhes neste blog

  • Casos assim mostram que:
    1️⃣ Content Security Policy (CSP) deve ser configurada obrigatoriamente
    2️⃣ Em servidores NodeJS, a opção --disallow-code-generation-from-strings deveria ser usada por padrão
    Provedores de serviço como a Vercel deveriam exibir avisos quando o CSP não estiver em uso
    Outros flags de segurança do NodeJS que valem a pena conferir estão reunidos neste artigo

  • Fazer proxy para um serviço de terceiros no domínio principal que usa autenticação de usuário é a pior escolha possível
    A Mintlify deveria ter sido isolada em um subdomínio separado, como dev-docs.discord.com

    • Eu também opero um produto parecido com a Mintlify, mas não ofereço acesso ao codebase nem integração com Git
      Mesmo quando o cliente quer isso, o risco de segurança é grande demais
      Ainda assim, por causa de SEO, existe muita demanda para manter a documentação no domínio principal
      Do ponto de vista da Mintlify, isso tudo também deve estar sendo extremamente estressante
    • O ponto central dessa vulnerabilidade é a falha na separação de domínios
      Deve-se usar um subdomínio para terceiros, e os cookies de autenticação do app principal devem ficar restritos como host-only
      Se possível, usar um domínio totalmente diferente (por exemplo, discorddocs.com) é ainda mais seguro
    • As empresas colocam sites de documentação no domínio principal para inserir automaticamente chaves de API reais nos exemplos de código
      Mas, comparado ao risco de segurança, é uma escolha perigosa demais
  • A partir de agora, nunca mais vou abrir arquivos SVG
    O fato de um jovem de 16 anos ter descoberto isso é realmente lendário

    • Ainda assim, se for abrir, que seja apenas em um ambiente de navegador com sandbox