9 puntos por GN⁺ 2025-12-19 | 1 comentarios | Compartir por WhatsApp
  • Un estudiante de preparatoria de 16 años publicó un análisis de un caso en el que fue posible realizar ataques de cross-site scripting (XSS) en sitios de documentación de grandes empresas como X, Vercel, Cursor y Discord aprovechando una vulnerabilidad en la plataforma Mintlify. Gracias a esta vulnerabilidad, recibió una recompensa por bugs de 11,000 dólares
  • La ruta interna de Mintlify /_mintlify/static/[subdomain]/[...route] estaba diseñada de forma que podía cargar archivos externos sin validación de dominio
  • El atacante pudo inyectar JavaScript dentro de archivos SVG, lo que permitía ejecutar scripts maliciosos en dominios de servicios importantes como Discord
  • La vulnerabilidad afectaba a casi todos los clientes que usaban Mintlify, y bastaba con un solo clic en un enlace para secuestrar cuentas
  • Este incidente se considera un caso que demuestra cómo una sola vulnerabilidad en la seguridad de la cadena de suministro puede provocar daños a gran escala

Descubrimiento en Discord

  • En noviembre de 2025, cuando Discord migró a Mintlify, una plataforma de documentación impulsada por IA, comenzó la búsqueda de vulnerabilidades
    • Justo después de la migración desde la plataforma personalizada anterior a Mintlify, el investigador analizó la estructura del nuevo sistema de documentación
  • El dominio de documentación de Discord (discord.mintlify.app) exponía directamente las rutas internas de Mintlify (/_mintlify/*)
    • Era necesario que estas rutas fueran accesibles para funciones clave como la autenticación

Estructura de la plataforma Mintlify

  • Mintlify es un servicio que permite escribir documentación basada en Markdown y convertirla automáticamente en documentación web
  • Todos los sitios de documentación operan en subdominios *.mintlify.app o en dominios personalizados
  • Internamente utiliza endpoints como /_mintlify/api/user, /_mintlify/markdown/ y /_mintlify/static/

Proceso de investigación de la vulnerabilidad

  • Se descubrió que el endpoint /_mintlify/_markdown/_sites/[subdomain]/[...route] devolvía archivos de otra documentación sin validación de dominio
    • Sin embargo, esta ruta solo devolvía texto Markdown sin renderizar, por lo que no era posible ejecutar código
  • Después, al analizar el paquete Mintlify CLI, se encontró adicionalmente el endpoint /_mintlify/static/[subdomain]/[...route]
    • Esta ruta devuelve archivos estáticos y aplica una lista blanca de extensiones de archivo
    • Los archivos HTML y JS estaban bloqueados, pero los archivos SVG sí estaban permitidos

Materialización del ataque

  • El atacante subió a su propia documentación de Mintlify un archivo SVG con JavaScript incrustado
  • Al invocar ese archivo desde el dominio de Discord (https://discord.com/_mintlify/_static/.../lmao.svg), el script se ejecutaba
  • Esto hacía posible ejecutar XSS no solo en Discord, sino en los dominios de documentación de todas las empresas que usaban Mintlify

Colaboración y reporte

  • El investigador colaboró con otros investigadores de seguridad para verificar la vulnerabilidad
  • Discord, justo después del reporte, desactivó toda su documentación para desarrolladores durante 2 horas y luego volvió a la plataforma anterior
  • Tras enterarse de la vulnerabilidad a través de Discord, Mintlify abrió un canal de Slack entre su equipo de ingeniería y los investigadores para trabajar de inmediato en la corrección

Alcance del impacto

  • La mayoría de los clientes de Mintlify, incluidos X (Twitter), Vercel, Cursor y Discord, estaban dentro del alcance del impacto
  • Existía la posibilidad de secuestro de cuentas mediante un solo enlace malicioso en los dominios oficiales de cada empresa
  • Una sola vulnerabilidad en la cadena de suministro puede provocar un riesgo encadenado para la seguridad de cientos de empresas

Recompensa y conclusión

  • El equipo de investigación recibió en total aproximadamente 11,000 dólares en bug bounty
    • Discord otorgó 4,000 dólares, y Mintlify entregó recompensas adicionales por vulnerabilidades individuales
  • Este caso queda como un ejemplo representativo de la importancia de la seguridad de la cadena de suministro y del alcance que puede tener la vulnerabilidad de una sola plataforma

1 comentarios

 
GN⁺ 2025-12-19
Comentarios en Hacker News
  • Este exploit es un caso realmente aterrador
    Con hacer clic en un solo enlace, por ejemplo uno como https://discord.com/_mintlify/static/evil/exploit.svg, se ejecuta JavaScript en el dominio de Discord
    Como resultado, pueden robar cookies de sesión o tokens, tomar control total de la cuenta, manipular apps de desarrollador o webhooks, o incluso borrar servidores mediante la API o usar la información de pago para comprar Nitro; el impacto es enorme
    Considerando la magnitud del daño posible, una recompensa de bug bounty de $4,000 se siente demasiado baja

    • Para robar cookies o tokens tendría que haber cookies que no sean HTTP-only o tokens en localStorage; me pregunto si Discord realmente está estructurado así
      Si las cookies de sesión siempre se configuran como HTTP-only, este tipo de ataque se vuelve mucho más difícil
      Sorprende cuántos desarrolladores frontend no conocen estos conceptos básicos de seguridad
    • Coincido con que “$4,000 es demasiado poco”
      En el mercado negro probablemente habría valido mucho más
  • Creo que permitir scripts dentro de archivos SVG ya era en sí mismo un error de seguridad
    Está bueno que se puedan hacer demos interactivas o juegos completos en un solo SVG, pero precisamente por eso también es un foco de vulnerabilidades
    Por eso muchas plataformas prohíben subir SVG o bloquean su vista previa
    En Discord, si subes un SVG, se muestra el código tal cual, y en Facebook Messenger o WeChat tampoco se puede compartir
    Aunque tiene ventajas como tamaño pequeño y resolución independiente, da pena que en la práctica los formatos de imagen rasterizada sigan usándose más

    • Todo SVG debería ser sanitizado a fondo tanto al subirse como al renderizarse
      Active Storage de Rails no sanitiza SVG por defecto, así que hay que tener cuidado
    • El problema de las entidades externas XML (XXE) fue un caso parecido
      Para más contexto, ver la documentación de OWASP
    • Me pregunto si bastaría con que las apps de mensajería simplemente ignoraran la etiqueta <script>
      Pero quizá eso por sí solo no sea suficiente
    • Esto hace recordar los bugs de seguridad de la época de Flash
    • Un problema aún mayor de SVG es que el resultado del renderizado cambia según el software
      En los formatos rasterizados casi no pasa eso
  • Este incidente parece mostrar una cara del actual ecosistema de startups de IA
    Una startup de documentación para IA, impulsada por capital de riesgo, consigue grandes clientes sin validaciones de seguridad y al final expone a millones de personas al riesgo
    Mintlify publicó hace poco un blog presumiendo una arquitectura de caché compleja, pero en la práctica parece que ni siquiera domina la seguridad básica
    Y en una situación así, la persona que encontró la vulnerabilidad recibe apenas $5,000
    Me parece un buen ejemplo de lo frágil que es hoy la cultura de desarrollo basada en IA

    • En realidad, que este tipo de ataque sea posible no es solo problema de las startups de IA, sino un problema estructural de todo el ecosistema JavaScript
      La raíz está en las cadenas de dependencias complejas y en el infierno de múltiples DLL de terceros
    • La mayoría de los XSS existen por una estructura de dominio único
      Si Discord no hubiera servido la documentación de la API directamente desde discord.com, esto no habría pasado
    • Me pregunto por qué un sitio de documentación necesita una arquitectura de caché tan compleja
      Parecería que con un CDN debería bastar
  • Es un bug que puede comprometer completamente las cuentas de clientes, y aun así la recompensa es demasiado baja
    A estas alturas no debería haber ninguna razón para permitir XSS

    • El XSS sigue sin desaparecer, y defensas como CSP o Trusted Types tampoco son perfectas
      En Anubis este año se encontraron dos XSS reflejados
      Hay que revisar sí o sí las dependencias de terceros
      Los avisos de seguridad relacionados están aquí y aquí
    • En general, las vulnerabilidades XSS casi no tienen valor de mercado
      Fuera de grandes redes sociales, es difícil monetizarlas
  • Me hace pensar que quizá sería buena idea contratar a este hacker de 16 años a tiempo completo o parcial para hacer revisiones de seguridad permanentes
    Con solo pagarle $50,000 al año parecería que la seguridad de la empresa mejoraría muchísimo

    • Pero una estructura contractual que le imponga presión por resultados al investigador no sería adecuada
      El bug bounty es más eficiente porque recompensa según los hallazgos
      Aunque si la recompensa es baja, también aparece la tentación de venderlo a un tercero
    • La mayoría de quienes participan en bug bounty tienen especialidades distintas
      XSS, IAM, exploits de shell y demás: cada quien se especializa en un área, así que una sola persona difícilmente cubriría todo
    • Siendo sinceros, a estas empresas no les importa demasiado la seguridad
  • Impresiona que alguien de 16 años haya encontrado esto
    Pero me resulta raro llamar ataque a la cadena de suministro (supply chain attack) a un XSS

    • El uso del término parece algo incorrecto, aunque por la edad se entiende
    • Aun así, visto desde la perspectiva de cadena de suministro, tiene algo de sentido
      Si el problema aparece en una capa intermedia como Mintlify, el usuario final no tiene ninguna forma de defenderse
      El código malicioso termina entregándose dentro de una cadena de confianza, así que podría verse como una especie de XSS a nivel de cadena de suministro
  • El informe del colaborador también incluye una vulnerabilidad de RCE aún más grave
    Más detalles en este blog

  • Casos como este muestran que,
    1️⃣ hay que configurar sí o sí Content Security Policy (CSP)
    2️⃣ en servidores NodeJS debería usarse por defecto la opción --disallow-code-generation-from-strings
    Proveedores de servicios como Vercel deberían mostrar una advertencia cuando no se use CSP
    Además, en este artículo se resumen otras flags de seguridad útiles para NodeJS

  • Hacer proxy desde el dominio principal, donde existe autenticación de usuario, hacia un servicio de terceros es la peor decisión posible
    Mintlify debió aislarse en un subdominio aparte, como dev-docs.discord.com

    • Yo también opero un producto parecido a Mintlify, pero no permito acceso al codebase ni integración con Git
      Aunque los clientes lo pidan, el riesgo de seguridad es demasiado alto
      Eso sí, por SEO hay mucha demanda para poner la documentación en el dominio principal
      Desde la perspectiva de Mintlify, esto también debe haber sido muy estresante
    • El punto central de esta vulnerabilidad es el fracaso en la separación de dominios
      Hay que usar un subdominio para terceros y restringir las cookies de autenticación de la app principal como host-only
      Si es posible, usar un dominio completamente distinto (por ejemplo, discorddocs.com) sería todavía más seguro
    • Las empresas ponen los sitios de documentación en el dominio principal para insertar automáticamente API keys reales en los ejemplos de código
      Pero comparado con el riesgo de seguridad, es una decisión demasiado peligrosa
  • A partir de ahora no voy a abrir jamás un archivo SVG
    Que alguien de 16 años haya encontrado esto es realmente legendario

    • Aun así, si hay que abrirlo, debería ser solo dentro de un entorno de navegador aislado (sandbox)