Un XSS en las exportaciones HTML de Telegram Desktop sigue vivo en ficheros sin parchear
Un bot podía inyectar JavaScript oculto en las exportaciones HTML de un chat. Telegram lo parcheó en julio, pero los ficheros generados antes siguen llevando el script.

Un fallo de escapado en el código de exportación de Telegram Desktop permitía que un bot colara JavaScript oculto dentro de un chat. El script no se ejecutaba en la aplicación, sino al abrir el fichero HTML exportado en un navegador, y desde ahí podía copiar todos los mensajes de ese fichero a un servidor del atacante. Telegram publicó el parche en julio, pero actualizar la aplicación no reescribe las exportaciones hechas antes: esos ficheros siguen llevando el código.
Los investigadores Denis Rostilov y Aleksander Rostilov, de ExPatch, publicaron el análisis el 12 de septiembre. El problema está en cómo se generan las exportaciones HTML, que guardan un chat como páginas que se abren en el navegador. Los bots pueden colgar filas de botones bajo sus mensajes, lo que Telegram llama inline keyboards, y el texto de cada botón lo elige el bot. Hasta el arreglo, ese texto se escribía en la página sin escapado, mientras que sí se escapaban el cuerpo de los mensajes, los nombres de remitente y otros campos. Escapar convierte caracteres como < en entidades para que el navegador los muestre como texto y no los interprete como código.
El bot podía meter así una etiqueta script en el texto de un botón, rellenada con caracteres invisibles para que el botón pareciera vacío en la versión que probaron. Tampoco hace falta que el bot esté en el chat objetivo: un mensaje cuyos únicos botones son enlaces web conserva esos botones al reenviarse, así que cualquiera que lo reenvíe a un grupo arrastra el script. El mensaje se queda en el historial como cualquier otro hasta que alguien lo borre, y puede exportarse meses o años después.
Al abrir el HTML, el script se ejecutaba sin ningún clic adicional. Leía todos los mensajes del fichero —remitentes, marcas de tiempo— más el nombre, tipo y número de miembros del chat y la ruta local del propio fichero, y lo enviaba todo fuera. Como el exportador parte las salidas largas en ficheros de 1.000 mensajes, cada uno expone solo su contenido, no el chat completo ni la cuenta. El mismo control permitía reescribir la página: en su demostración sustituyeron toda la exportación por un formulario falso de verificación de Telegram.
Parcheado sin avisar
Los Rostilov puntuaron el fallo con un 8,2 sobre 10 en CVSS 3.1. No hay CVE ni aviso de seguridad en el repositorio. El parche, el commit 8457d13a de John Preston, añade el escapado que faltaba y llegó a la beta 6.9.4 el 3 de julio y a la 7.0.1 estable el 14 de julio. La línea sin escapar llevaba en versiones estables desde la 4.15.1 de marzo de 2024, unos dos años y cuatro meses.
Afectadas de la 4.15.1 a la 6.9.3; corregidas la 6.9.4 beta y la 7.0.1 en adelante. Los investigadores piden actualizar, volver a exportar los chats hechos antes del arreglo o abrir los ficheros viejos solo con JavaScript desactivado, y tratar cualquier exportación anterior como no fiable. Telegram confirmó el fallo el 1 de julio y ofreció 500 dólares de recompensa, que los Rostilov rechazaron y pidieron que se donaran.
Lo llamativo es lo de siempre: el parche existe, pero nadie ha avisado a quien tiene ficheros antiguos. Telegram no ha publicado ninguna guía para ellos, y el arreglo no aparece en las notas de versión ni en el changelog.
