Neutron, nuestro motor de IA, obtuvo un 97.1% en el benchmark CyberGym de UC Berkeley. Más información

Análisis a fondo

Análisis a fondo

ChatGPT: toma de control de cuenta mediante un enlace compartido y MathLive

Un enlace compartido de ChatGPT ejecutaba el JavaScript del atacante en la sesión de la víctima vía MathLive; OpenAI lo corrigió el 26 de octubre.

Resumen

  • Un enlace público de ChatGPT malicioso podía ejecutar el JavaScript del atacante dentro de la sesión iniciada de quien lo abriera, lo que permitía actuar como esa cuenta de ChatGPT. Parameter Security reportó la cadena a OpenAI el 18 de octubre de 2026.
  • Cualquiera que abriera una conversación compartida por un atacante antes del 26 de octubre de 2026 era una víctima potencial: no hacía falta instalar una app, unirse a un espacio de trabajo ni iniciar sesión a través del atacante, solo abrir el enlace.
  • OpenAI clasificó el reporte como P1, y lo corrigió del lado del servidor el 26 de octubre de 2026 en ambas versiones del frontend web. No se asigna ninguna CVE y no se reporta abuso real.
  • La corrección de ChatGPT está desplegada. Los equipos que integran MathLive deben auditar sus propios gestores de mensajes; la publicación no determina su estado de corrección.

¿Estoy afectado?

Como usuario de ChatGPT, todas estas condiciones debían cumplirse a la vez:

  • Abrió una conversación de ChatGPT compartida mediante un enlace público /share/ proveniente de una fuente no confiable, antes del 26 de octubre de 2026.
  • La conversación estaba diseñada para contener tanto un gráfico como una vista previa HTML (Preview).
  • En la versión más fiable del ataque, hizo clic una vez en el botón Preview de ChatGPT tras abrir la página. En una versión posterior, abrir el enlace era el único paso; Parameter reprodujo esa ruta automática tres veces, incluso tras un refresco completo.

La falla estaba en el frontend web de ChatGPT y allí está corregida, de modo que abrir un share manipulado hoy no ejecuta la carga. Parameter realizó su prueba de conversación privada entre cuentas distintas que controlaba, y no reporta ningún uso real de la falla.

Si desarrolla una aplicación web que integra MathLive, la biblioteca usada para mostrar los gráficos interactivos de ChatGPT, se aplica una exposición distinta:

  • Su página carga MathLive, que instala un listener postMessage para su teclado matemático en pantalla.
  • Contenido influible por un atacante puede ejecutarse en un marco de la misma página: una vista previa embebida, un widget aislado o HTML escrito por usuarios.
  • El listener procesa un mensaje que cambia la configuración del teclado, porque el controlador de nivel superior de MathLive aceptaba el mensaje desde cualquier origen.

Compruebe si sus proyectos integran MathLive:

grep -A1 '"node_modules/mathlive"' package-lock.json
grep -rn "mathlive" --include=*.ts --include=*.js --include=*.vue --include=*.tsx src | head -20

¿Cómo lo soluciono?

Los usuarios de ChatGPT no tienen nada que instalar ni restablecer. OpenAI desplegó la corrección en las dos versiones del frontend web, y al 26 de octubre de 2026 ambas rechazan los mensajes MathLive entre marcos de los que dependía el ataque.

Para sus integraciones de MathLive, la publicación no identifica una versión corregida del proyecto original. El registro npm indica v0.111.1 como última versión, mientras que GitHub Releases aún muestra v0.100.0: esa página no es un inventario completo del paquete. No dé por hecho que una actualización bloquea esta cadena sin comprobar los gestores de mensajes. Aplique las medidas defensivas de Parameter en la integración:

  1. Verifique el emisor antes de procesar cualquier mensaje que cambie estado: compruebe tanto event.origin, la dirección web del emisor, como event.source, la ventana exacta que recibió el permiso.
  2. Trate la configuración entre ventanas como datos, nunca como HTML: las distribuciones de teclado y estructuras similares no deben asignarse a innerHTML en la página receptora.
  3. Mantenga aislados los documentos creados dinámicamente cuando su contenido pueda influir un marco no confiable, para que un iframe srcdoc manipulado no herede la identidad de su página.
  4. Considere la política de seguridad de contenido un control de respaldo, nunca la única barrera después de que el HTML controlado por el atacante llegue a la página principal.

Estas medidas abordan el límite de la integración. Consulte los avisos de seguridad y las notas de versión de la biblioteca, y verifique el comportamiento de los gestores de mensajes pertinentes en la versión que despliegue.

¿Cuál es la causa raíz?

El sandbox del Preview funcionó; una segunda característica de la misma página, el teclado en pantalla de MathLive, dejó una puerta abierta a través de él. El writeup de Parameter documenta la cadena de principio a fin.

ChatGPT muestra un bloque de código HTML mediante su función Preview dentro de un marco restringido en una dirección web distinta, así que el marco no puede leer la página con sesión iniciada que lo rodea. Un gráfico interactivo de la misma conversación carga MathLive, una biblioteca de composición matemática, en la página principal chatgpt.com. Cargar MathLive instala un listener para los mensajes de su teclado virtual. Parameter descubrió que ese listener aceptaba de cualquier emisor un mensaje que cambiaba la distribución del teclado, y que esa distribución podía llevar HTML sin procesar. El flujo de control desminificado era equivalente a:

window.addEventListener("message", (event) => {
  if (event.data?.type !== "mathlive#virtual-keyboard-message") return;
  if (!validateOrigin(event.origin, this.originValidator)) return;
  this.handleMessage(event.data, event.source);
});

if (message.action === "update-setting" && message.layouts) {
  this.layouts = message.layouts;
}

Parameter indica que el controlador de nivel superior usaba una política de origen none, lo que significa que cualquier dirección web podía enviar el mensaje. Tampoco exigía que el mensaje update-setting viniera de una ventana aprobada previamente. La normalización de la distribución conservaba el campo markup, así que el HTML del atacante sobrevivía. Cuando se muestra el teclado, la distribución llega a un punto de inserción HTML en la verdadera página de ChatGPT:

keyboardContainer.innerHTML = MathfieldElement.createHTML(keyboardHtml);

El auxiliar createHTML parecía un sanitizador pero actuaba como un envoltorio de identidad que marcaba la cadena como confiable y la dejaba pasar sin cambios. En el resumen de Parameter, tres decisiones de diseño convirtieron esto en un exploit completo:

  • MathLive aceptaba un mensaje que cambia estado sin demostrar qué marco lo envió.
  • El formato del mensaje permitía HTML sin procesar como datos de distribución de teclado.
  • Ese HTML podía crear un documento sin aislamiento que heredaba la identidad chatgpt.com.

¿Cómo se explota?

  1. El atacante redacta una conversación de ChatGPT que contiene un gráfico interactivo genuino y, más adelante, un bloque HTML redactado por el asistente. El gráfico carga MathLive en la página principal; el bloque HTML se muestra como Preview.
  2. El atacante publica la conversación mediante la función de uso compartido normal de ChatGPT y envía a la víctima el enlace público /share/<id> por correo, mensaje, ticket o red social.
  3. La víctima abre el enlace. El marco Preview envía dos mensajes a la página principal: un mensaje update-setting reemplaza una distribución del teclado virtual por el HTML del atacante y un mensaje show hace que MathLive la muestre.
  4. MathLive escribe el HTML en el innerHTML de la página principal chatgpt.com. El HTML insertado es un iframe con un atributo srcdoc y sin atributo sandbox, así que el navegador crea un documento nuevo que hereda la identidad chatgpt.com.
  5. La política de seguridad de contenido de ChatGPT bloquea los scripts en línea pero permite los de www.youtube.com. El marco carga una URL oEmbed de YouTube cuyo parámetro de callback tipo JSONP lleva el JavaScript del atacante, y el punto de acceso lo devuelve dentro de su propia respuesta de error de validación.
  6. El callback se ejecuta en el nuevo marco como chatgpt.com, con la sesión iniciada de la víctima, y puede llamar directamente a las API autenticadas de ChatGPT.

El código que envía los mensajes y la URL de YouTube están publicados en el writeup de Parameter, y los dos extractos anteriores provienen de él.

¿Cómo fluye el ataque?

Un enlace compartido carga un gráfico que instala un listener de confianza, y el Preview aislado lo usa para empujar HTML del atacante hacia la página principal, donde un script de YouTube permitido termina el trabajo.

flowchart LR A["El atacante comparte una conversación
con un gráfico y un Preview"] --> B["La víctima abre el
enlace público /share"] B --> C["El gráfico carga MathLive
en chatgpt.com"] C --> D["El Preview envía update-setting
por postMessage (origen sin verificar)"] D --> E["MathLive escribe el HTML de la distribución
en innerHTML (sin sanitizar)"] E --> F["iframe srcdoc sin sandbox
hereda la identidad chatgpt.com"] F --> G["Se ejecuta el script JSONP de YouTube
(la CSP permite youtube)"] G --> H["El JS del atacante actúa como la víctima:
lee chats privados, cualquier acción"]

¿Qué puede hacer un atacante?

La carga se ejecutaba con el mismo acceso autenticado que la verdadera página de ChatGPT, así que su alcance no se limitaba a lo que hubiera en pantalla. Parameter demostró tres capacidades concretas:

  • Enumerar las conversaciones recientes de la víctima llamando a GET /backend-api/conversations.
  • Recuperar el contenido de una conversación privada nunca compartida con el atacante, mediante el punto de acceso de detalle de conversación.
  • Enviar un fragmento elegido de esa conversación a un servidor controlado por los investigadores, mediante una petición de imagen ordinaria.

La carga analizaba los propios datos de arranque de la página para obtener el token de acceso de la sesión y el identificador de cuenta, y los usaba en cabeceras de petición. La valoración de Parameter es que esto equivalía a control total de la cuenta de la víctima mediante la aplicación web. Los investigadores escribieron: «essentially, we could perform any action on behalf of the victim's ChatGPT account». El límite es lo que el frontend autenticado puede hacer, no los puntos de acceso elegidos por la prueba.

Las condiciones eran modestas: una cuenta ChatGPT ordinaria para que el atacante redactara la conversación, un canal de distribución del enlace y, como mucho, una interacción de la víctima. OpenAI clasificó el reporte como P1 tras reproducir tanto la ejecución de código como la prueba de lectura de conversación privada.

¿Por qué funciona la corrección?

La corrección de OpenAI hace que la página principal deje de confiar en el emisor. Ambas versiones del frontend web ahora rechazan los mensajes MathLive entre marcos que usaba el reporte. Un Preview no confiable ya no puede sustituir una distribución de teclado ni inyectar HTML en la página con sesión. La corrección es del lado del servidor; los usuarios no instalan nada. Durante el despliegue, OpenAI también cambió la política de seguridad de contenido, lo que bloqueó parte de la cadena mientras una versión del frontend aún esperaba su actualización.

El paso de YouTube era un rodeo de la política de seguridad de contenido, no la causa, como señala Parameter. Bloquear solo ese punto de acceso habría eliminado un camino hacia JavaScript dejando que un Preview no confiable siguiera empujando HTML a la página principal. La corrección apunta por eso a la frontera de mensajes, que toda variante de la carga tenía que cruzar.

¿Cómo compruebo si estuve comprometido?

Parameter no publica un procedimiento fiable de detección retrospectiva de este ataque. La carga utilizaba la sesión existente del navegador, por lo que un historial normal no descarta una explotación. Si sospecha actividad no autorizada, revise las sesiones activas en los ajustes de seguridad de ChatGPT y siga la guía de seguridad de OpenAI. Investigue los secretos potencialmente expuestos y los registros disponibles según su proceso de respuesta a incidentes; no dé por hecho que leer una conversación privada genera un evento de exportación.

Para sus propias integraciones de MathLive, la auditoría es de código, no de registros: busque cada listener postMessage que gestione configuración y confirme que cada uno verifica el emisor. Un listener que procesa un mensaje sin verificar event.origin y event.source pertenece a la misma clase de falla, sea cual sea la página.

Cronología de la divulgación, desde la primera confirmación el 13 de octubre hasta la corrección de OpenAI el 26 de octubre y el writeup público el 28 de octubre.
Figura 1: Parameter confirmó el camino de inyección el 13 de octubre de 2026, lo reportó cinco días después, y OpenAI corrigió ambas versiones del frontend web el 26 de octubre. Fuente: writeup de Parameter Security, comprobado el 31 de octubre de 2026.

Cronología

  • 2026-10-13: Parameter confirma el camino de mensaje a HTML de MathLive contra el código de producción de ChatGPT.
  • 2026-10-14: La cadena se reproduce por la interfaz normal y se eleva a JavaScript arbitrario.
  • 2026-10-16: Se confirma la entrega por share público entre cuentas y espacios distintos, con un clic en Preview.
  • 2026-10-17: Se confirma el Preview automático desde la navegación del share y se reproduce tras un refresco completo.
  • 2026-10-18: Parameter presenta el reporte al programa de recompensas de OpenAI.
  • 2026-10-19: Se añade la prueba controlada de divulgación de conversación privada.
  • 2026-10-21: OpenAI reproduce el problema y eleva la gravedad de P2 a P1.
  • 2026-10-22: OpenAI informa de un frontend web corregido mientras el segundo sigue actualizándose.
  • 2026-10-23: Cambios en la política de seguridad de contenido bloquean parte de la cadena mientras queda una actualización.
  • 2026-10-26: OpenAI confirma que ambos frontends rechazan los mensajes reportados, resuelve el caso y abona una recompensa total de 5,000 dólares.
  • 2026-10-28: Parameter publica el writeup técnico.

Preguntas frecuentes

¿Deben hacer algo los usuarios de ChatGPT?

No. La corrección está del lado de OpenAI, desplegada en ambas versiones del frontend web, y no hay nada que instalar ni restablecer.

¿Se explotó en entornos reales?

No se reporta uso real. Parameter realizó la prueba de conversación privada entre sus propias cuentas distintas, y The Hacker News reportó el 31 de octubre de 2026 que la empresa no reporta ningún uso real. La gravedad venía de la capacidad demostrada, no de abusos observados.

¿Está corregido MathLive en sí?

La publicación no identifica una versión corregida de MathLive. Compruebe el paquete instalado y su gestión de mensajes; GitHub Releases no enumera todas las versiones de npm. Aplique las comprobaciones de integración anteriores.

¿Por qué el sandbox del Preview no lo detuvo?

El sandbox sí detuvo el acceso directo: el código dentro del Preview no podía leer la página principal de ChatGPT. La entrada era una segunda característica de la misma página. El gráfico cargaba MathLive, y el listener del teclado de MathLive aceptaba instrucciones de cualquier marco, lo que permitía al Preview no confiable entregar HTML a la página de confianza.

¿Cuál era la magnitud de la exposición?

El frontend web de ChatGPT es una de las aplicaciones más usadas de la web; la propia OpenAI reportó 700 millones de usuarios activos semanales en septiembre de 2025. Todo usuario con sesión iniciada que pudiera abrir un enlace compartido estaba en el alcance hasta el 26 de octubre de 2026. Alcance no significa impacto aquí: no se reporta abuso real.

¿Podía la carga hacer más que leer chats?

Sí. La carga llamaba a las API autenticadas de ChatGPT con la sesión de la víctima, así que alcanzaba todo lo que el frontend normal alcanza, no solo conversaciones. Parameter demostró la lectura de un chat privado y la exfiltración de un fragmento elegido, y valoró la primitiva como la capacidad de actuar en nombre de la cuenta.

Encuentre dónde integran MathLive sus propias aplicaciones con Ostorlab

Si sus aplicaciones web integran MathLive, la primera pregunta es dónde. El análisis de composición de software de Ostorlab construye el inventario de dependencias de sus proyectos: un escaneo le dice qué aplicaciones dependen de MathLive y dónde debe ocurrir la revisión de integración de «¿Cómo lo soluciono?».

Referencias

  • Parameter Security, Do the Math: How We Took Over ChatGPT Accounts, 28 de octubre de 2026: https://www.parameter.ai/labs/we-found-a-gap-at-openai (comprobado el 31 de octubre de 2026)
  • The Hacker News, A Shared ChatGPT Link Could Run Attacker Code in Your Session and Read Private Chats, 31 de octubre de 2026: https://thehackernews.com/2026/10/a-shared-chatgpt-link-could-run.html (comprobado el 31 de octubre de 2026)
  • Avisos de seguridad de MathLive: https://github.com/arnog/mathlive/security/advisories (comprobado el 31 de octubre de 2026)
  • MathLive: https://registry.npmjs.org/mathlive/latest ; https://github.com/arnog/mathlive/releases
  • Página del paquete MathLive con las cifras de descargas semanales: https://www.npmjs.com/package/mathlive (comprobado el 31 de octubre de 2026)
  • OpenAI, How people are using ChatGPT (2025-09-15): https://openai.com/index/how-people-are-using-chatgpt/