La arquitectura de cifrado local de Telegram está diseñada para ser hermética. Los datos de sesión del usuario están protegidos mediante una clave de cifrado de datos (DEK), la cual a su vez se resguarda bajo una clave de cifrado de claves (KEK) derivada del código de acceso del usuario. Sin embargo, en entornos Windows de escritorio, un simple enlace malicioso bastó para derribar toda esta línea defensiva. El investigador de seguridad beaksec reveló la vulnerabilidad CVE-2026-107181 en Telegram Desktop: al inducir a la víctima a hacer clic en un enlace manipulado, la aplicación sube en silencio los archivos maestros de sesión a un grupo específico, consumando la toma de control de la cuenta sin confirmación.
VulnCheck, en calidad de CNA, asignó a esta vulnerabilidad una puntuación CVSS 4.0 de 8.6, frente al 8.1 obtenido bajo el estándar CVSS 3.1. Esta discrepancia obedece a que el nuevo estándar otorga un peso mayor al impacto sistémico desencadenado a partir de una interacción mínima del usuario. La cadena de explotación prosperó porque Telegram Desktop unificó llamadas internas de confianza y entradas externas no confiables dentro de una misma vía de comunicación carente de validación. Cuando los puntos iniciales del flujo de datos no tratan las entradas externas como no confiables, la fortaleza criptográfica más sólida resulta inútil ante el quiebre de los perímetros de seguridad.
Delimitador sin escapar activa una puerta trasera privilegiada interna
El eslabón inicial de la cadena radica en la neutralización inadecuada de los delimitadores de registros en el socket local de instancia única (CWE-143). Cuando un usuario pulsa un enlace externo mientras Telegram Desktop ya está en ejecución, el sistema operativo transfiere el enlace a un nuevo proceso. Este proceso se comunica mediante un socket local con la instancia principal enviando el enlace formateado como OPEN:<url>;, y el receptor fragmenta el flujo dividiendo los comandos por puntos y comas. El fallo de ingeniería reside en que los puntos y comas de la URL entrante no se escapaban. Ni la lógica de ensamblado en sandbox.cpp:295-297 ni la de división en sandbox.cpp:453-463 imponían restricciones sobre caracteres especiales. Como resultado, un enlace como tg://x?a=1;CMD:quit se divide en dos instrucciones independientes, permitiendo que datos no confiables escapen de inmediato hacia el flujo de control interno.
Diagrama: Cadena de ataque desde el clic en un enlace hasta la exfiltración de la sesión. Fuente: beaksec.github.io
La orden inyectada toma entonces el control del segundo eslabón: el esquema URI interno interpret:. De acuerdo con la implementación en application.cpp:1162-1164, la aplicación añade la ruta indicada a la cola de ejecución. Posteriormente, la función InterpretSendPath (ubicada en support_helper.cpp:673-680) lee el archivo local especificado en el archivo de instrucciones y lo envía a un canal o supergrupo predeterminado, sin ejecutar comprobación alguna de autorización ni mostrar ventanas de confirmación. Este protocolo formaba parte originalmente del conjunto de herramientas de actualización oficial utilizado por el script build/updates.py. El archivo de instrucciones contemplaba un campo from: destinado a comprobar la cuenta activa, pero si dicha línea se omitía, el analizador pasaba por alto la verificación. Esta total falta de defensas cedió de facto el control de funciones privilegiadas internas a atacantes externos.
La descarga automática ensambla una cadena de explotación determinista
La vulnerabilidad por sí sola constituía una puerta de entrada; transformarla en una toma de control de cuenta requirió un minucioso ensamblaje de estados. El atacante crea inicialmente un supergrupo y agrega a la víctima, aprovechando la configuración de privacidad por defecto de Telegram que permite añadir miembros sin requerir su aprobación previa. A continuación, el atacante envía al grupo tres archivos de instrucciones en texto plano que contienen directivas interpret: dirigidas a archivos confidenciales locales de la víctima. Gracias a la función de Telegram que descarga automáticamente adjuntos menores a 8 MiB, los tres archivos se guardan silenciosamente en C:\Users\<user>\Downloads\Telegram Desktop\.
El protocolo interpret: admite rutas relativas calculadas respecto al directorio de trabajo de Telegram en Windows (%APPDATA%\Telegram Desktop). Valiéndose de la ruta ../../../Downloads/Telegram%20Desktop/instructions.txt, el atacante puede alcanzar con precisión los archivos maliciosos descargados sin necesidad de conocer el nombre de usuario del sistema operativo. Posteriormente, publica un enlace HTTP en el grupo que realiza una redirección 302 hacia el enlace tg:// especialmente diseñado; en cuanto la víctima pulsa el enlace, la inyección se ejecuta de inmediato.
Los tres archivos de instrucciones leen y transmiten los datos fundamentales para usurpar la sesión: el archivo tdata/key_datas con el salt sin cifrar, el archivo D877F783D5D3EF8Cs ubicado en una carpeta derivada del nombre por defecto, y el correspondiente archivo de índices maps. El identificador de directorio D877F783D5D3EF8C no es aleatorio: se obtiene de manera determinista a partir de la cadena data, como se observa en storage_file_utilities.cpp:241-250, generando el mismo resultado en cualquier instalación habitual. Cuando no se ha configurado un código de acceso local, este opera internamente como una cadena vacía. Con el salt obtenido de key_datas, el atacante puede recalcular la KEK con algoritmos públicos, descifrar la DEK y reconstruir localmente la sesión de autorización MTProto de la víctima. La descarga automática, las rutas relativas y la ausencia de contraseña por omisión son funciones comprensibles de forma aislada, pero convergieron en el mismo contexto para articular un ataque devastador.
Cuatro modificaciones de código para reconstruir los límites de comunicación
Frente a esta cadena de explotación, Telegram optó por eliminar de raíz los mecanismos heredados. En el commit db3405699f del 16 de septiembre de 2026, el equipo de desarrollo aplicó cuatro modificaciones clave. En primer lugar, eliminó por completo el esquema interpret:// y la función auxiliar de envío Support::InterpretSendPath. En segundo término, aplicó escape porcentual en formato hexadecimal a los delimitadores de comunicación por socket, erradicando la inyección de comandos compuestos. Asimismo, incorporó dos aserciones de protección: ignorar los registros CMD: y CTRL: si en la misma conexión se presenta OPEN:, y descartar peticiones posteriores de rutas locales en caso de detectar una URL no local.
La versión 7.2.9, publicada al día siguiente, incorporó la totalidad de estos parches. No obstante, las notas de lanzamiento se limitaron a mencionar mejoras en el renderizado, prescindiendo de avisos de seguridad o explicaciones sobre el impacto del fallo. El historial revela que ZDI recibió el reporte el 25 de junio de 2026, el fabricante corrigió el código discretamente el 16 de septiembre, ZDI cerró el reporte el 30 de septiembre, el investigador beaksec publicó su análisis técnico el 3 de octubre y el CVE no fue asignado formalmente hasta el 7 de octubre. Esta política de parches silenciosos priva a los equipos de seguridad empresarial de la información requerida para evaluar el riesgo en sus puestos de trabajo. En la actualidad, el marco SSVC de CISA califica el estado de explotación como “poc”, manteniéndose fuera del catálogo KEV.
Tres líneas de defensa para neutralizar el ataque sin actualizar
Las pruebas del exploit se ejecutaron en Windows sobre la versión 6.9.3. Para aquellos usuarios que no puedan actualizar de inmediato a la versión 7.2.9 o posterior, las propias opciones del cliente ofrecen barreras de contención eficaces. Habilitar en los ajustes avanzados la opción «Preguntar dónde guardar cada archivo» desbarata la dependencia de rutas predecibles, impidiendo que los archivos del atacante lleguen a la carpeta esperada. Restringir el permiso «Quién puede añadirme a grupos» únicamente a «Mis contactos» cierra la puerta a que actores maliciosos fuercen la entrada de la víctima a grupos atacantes. Asimismo, conviene extremar la cautela ante advertencias del navegador del tipo «Abrir Telegram» y auditar periódicamente las sesiones activas en busca de accesos no reconocidos.
La salvaguarda más importante reside en el plano criptográfico: establecer un código de acceso local en Telegram. El exploit presupone que el código de acceso local está vacío, lo que permite descifrar la información combinando parámetros por defecto con el salt sustraído. Al fijar una contraseña local, el sistema exige ingresar la clave en texto claro para derivar una KEK válida. Así, aun cuando el atacante consiga sustraer key_datas y el resto de los archivos, le resultará imposible descifrar su contenido sin conocer la clave. Cuando la lógica interna quiebra los límites de confianza, una configuración rigurosa constituye el último baluarte contra la toma de control de cuentas.
Enlaces de referencia:
- Análisis de vulnerabilidad de toma de control con un clic en Telegram Desktop (beaksec)
- Evaluación de vulnerabilidad y puntuación en VulnCheck