RCE por llamada de voz en Telegram para Android, corregida en 12.10.4
Telegram para Android 8.6.2 a 12.10.3 permitía a quien llamaba ejecutar código si la víctima respondía. Sin explotación conocida. Corregido en 12.10.4.
Resumen
- Una falla en Telegram para Android permitía a un atacante ejecutar código en el teléfono de una víctima mediante una llamada de voz en cuanto la víctima respondía, según divulgó la empresa de seguridad NebuSec el 29 de octubre de 2026. El atacante solo necesitaba una cuenta ordinaria de Telegram, y NebuSec confirmó la ejecución en teléfonos ARM64. No existe identificador CVE ni puntuación CVSS al 29 de octubre de 2026.
- Todas las versiones desde 8.6.2, publicada en marzo de 2022, hasta 12.10.3, publicada en septiembre de 2026, están afectadas, según NebuSec. Telegram para iOS incluyó la corrección en 12.7 en mayo y Telegram Desktop en 7.0.1 en julio, así que Android fue la última plataforma en recibirla.
- No se conoce explotación en ataques reales: The Hacker News preguntó a NebuSec y a Telegram si la falla se había usado, y ninguna de las dos había respondido públicamente al 29 de octubre. No había análisis técnico ni código de prueba de concepto públicos en esa fecha; la demostración es el vídeo de NebuSec.
- Actualice Telegram para Android a 12.10.4 o posterior ahora. El número de versión aparece al final de la página de Ajustes de la aplicación.
¿Estoy afectado?
Está afectado si usa Telegram para Android en una versión de 8.6.2 a 12.10.3. Esas versiones salieron entre marzo de 2022 y septiembre de 2026, así que cualquier instalación que no se haya actualizado desde finales de septiembre de 2026 está en el rango.
Compruebe la versión en el teléfono: abra Telegram, abra Ajustes y lea el número de versión impreso al final de la página. En un teléfono con una versión anterior, la ficha de Telegram en Google Play muestra un botón Actualizar.
La falla está en el código que las dos aplicaciones de una llamada se intercambian, así que la exposición requiere una llamada de voz que la víctima responda.
Telegram para iOS y Telegram Desktop publicaron la corrección de la biblioteca antes que Android (iOS 12.7 en mayo de 2026, Desktop 7.0.1 en julio de 2026). NebuSec no tiene evidencia de que la falla les afecte ni a las llamadas de grupo (vea las preguntas frecuentes).
¿Cómo lo corrijo?
Actualice Telegram para Android a través de Google Play:
- Instale la versión 12.10.4 o posterior.
- Abra Ajustes y confirme el número de versión al final de la página.
Telegram no había publicado aviso ni solución alternativa al 29 de octubre de 2026, y ninguna configuración distinta de la actualización elimina la falla.
Rechazar llamadas de cuentas desconocidas evita el desencadenante, porque la falla necesita que la víctima responda. No corrige la falla y no es una recomendación del proveedor.
Para flotas de dispositivos, lea la versión instalada en el informe de aplicaciones de su herramienta de gestión de dispositivos móviles para el paquete org.telegram.messenger, el nombre de paquete de Telegram para Android en Google Play.
¿Cuál es la causa raíz?
El código que analiza un mensaje de llamada MediaState validaba un campo y luego leía el iterador de otro campo opcional, de modo que un mensaje que omitía el segundo campo hacía que el analizador desreferenciara el iterador de fin del mapa y tocara memoria que no debía.
Durante una llamada de Telegram, las dos aplicaciones se envían mensajes cortos para establecer la llamada e informar de su estado. Uno de ellos, MediaState, indica si el micrófono está silenciado, si la cámara está activa y cómo se rota el vídeo.
El código de análisis está en la copia incluida de tgcalls, la biblioteca que las apps de Android, iOS y escritorio de Telegram usan para las llamadas, en TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp. Usa json11, cuyo Json::object es un std::map<std::string, Json>, y object.find() devuelve el iterador end() del mapa cuando el campo está ausente.
El analizador empieza bien: busca el campo opcional videoState y, si el campo está ausente, pasa a un valor por omisión, dejando el iterador videoState apuntando a end():
const auto videoState = object.find("videoState");
if (videoState != object.end()) {
...
} else {
message.videoState = MediaStateMessage::VideoState::Inactive;
}
La falla está en el bloque siguiente, que analiza la rotación del vídeo. Busca videoRotation, comprueba que el valor es un número y luego lee la rotación desde el iterador equivocado: cada comparación lee videoState->second, el iterador del campo opcional que puede no existir, en lugar del iterador videoRotation que acaba de validar. Este es el código de la versión 12.10.3:
const auto videoRotation = object.find("videoRotation");
if (videoRotation != object.end()) {
if (!videoRotation->second.is_number()) {
RTC_LOG(LS_ERROR) << "Signaling: videoRotation must be a number";
return absl::nullopt;
}
if (videoState->second.int_value() == 0) { // reads videoState, not videoRotation
message.videoRotation = MediaStateMessage::VideoRotation::Rotation0;
} else if (videoState->second.int_value() == 90) { // reads videoState, not videoRotation
message.videoRotation = MediaStateMessage::VideoRotation::Rotation90;
} else if (videoState->second.int_value() == 180) { // reads videoState, not videoRotation
message.videoRotation = MediaStateMessage::VideoRotation::Rotation180;
} else if (videoState->second.int_value() == 270) { // reads videoState, not videoRotation
message.videoRotation = MediaStateMessage::VideoRotation::Rotation270;
} else {
...
}
}
Un mensaje MediaState que lleva un número videoRotation pero ninguna cadena videoState, una forma que el propio código de análisis está escrito para tolerar, hace que las comparaciones desreferencien end(). La descripción de NebuSec coincide: el código «no gestionaba correctamente los campos ausentes y accedía a memoria a la que no debía». Cómo convirtió NebuSec esa lectura en ejecución de código en teléfonos ARM64 no se había publicado al 29 de octubre de 2026.
¿Cómo se explota?
No hay código de prueba de concepto público, así que los pasos siguientes siguen la divulgación de NebuSec y su vídeo de demostración según los relató The Hacker News.
- El atacante, que solo necesita una cuenta ordinaria de Telegram, realiza una llamada de voz a la víctima desde la aplicación.
- La víctima responde. Desde ese momento, las dos aplicaciones intercambian los mensajes cortos de establecimiento y estado que sostienen la llamada.
- El cliente del atacante envía un mensaje MediaState confeccionado para la falla: un número
videoRotationpresente y el campo opcionalvideoStateomitido. - La app de la víctima analiza el mensaje, valida el número de rotación y luego lee la rotación a través del iterador
videoState, que apunta más allá de los campos del mensaje. - El analizador lee memoria que no debía, y la demostración de NebuSec muestra el teléfono bajo el control del atacante: alrededor de medio minuto después de empezar la llamada, el teléfono de la víctima cambia a su pantalla de inicio, los iconos de las aplicaciones caen por la pantalla y aparece un logotipo «HACKED BY NEBUSEC».
¿Cómo se desarrolla el ataque?
La cadena cabe en un mensaje: la víctima responde a una llamada, el atacante envía un mensaje MediaState con un campo presente y otro ausente, y el analizador lee a través de un iterador de fin hacia memoria que no debía tocar.
llamada de voz de Telegram"] --> B["La víctima responde a la llamada"] B --> C["El atacante envía un mensaje MediaState:
videoRotation presente,
videoState omitido"] C --> D["El analizador valida videoRotation,
y luego lo lee a través del
iterador videoState"] E["La búsqueda de videoState devolvió end():
el campo está ausente"] --> D D --> F["Lectura fuera de límites a través
del iterador de fin"] F --> G["Ejecución de código en el teléfono
ARM64 de la víctima, según NebuSec"]
¿Qué puede hacer un atacante?
Un atacante puede ejecutar código en el teléfono de la víctima desde una llamada que la víctima responde, sin más privilegio que una cuenta ordinaria de Telegram en el lado que llama. NebuSec confirmó la ejecución en llamadas entre dos personas en teléfonos ARM64. El vídeo muestra el dispositivo cambiando de pantalla y mostrando el logotipo del atacante.
Las condiciones que el ataque necesita:
- Una versión de Telegram para Android de 8.6.2 a 12.10.3 en el teléfono de la víctima. El código de llamadas que usa este mensaje se activó en la versión 8.6.2, la primera versión que cita NebuSec.
- La víctima responde a una llamada de voz entrante. La interacción del usuario es la única barrera: la falla se dispara tras responder, no al sonar.
- Una llamada entre dos personas en Android: ninguna evidencia extiende el impacto a Telegram para iOS, a Telegram Desktop ni a las llamadas de grupo (vea las preguntas frecuentes).
NebuSec divulgó la falla el 29 de octubre de 2026. The Hacker News preguntó a NebuSec y a Telegram si la falla se había usado en ataques reales. También preguntó qué podía alcanzar el código de un atacante en un teléfono. Ninguna de las dos empresas había publicado respuesta al 29 de octubre.
¿Por qué funciona la corrección?
La corrección, en la versión 12.10.4, lee la rotación desde el iterador que validó. Cada comparación del bloque cambia de videoState->second.int_value() a videoRotation->second.int_value():
if (videoRotation->second.int_value() == 0) {
message.videoRotation = MediaStateMessage::VideoRotation::Rotation0;
} else if (videoRotation->second.int_value() == 90) {
message.videoRotation = MediaStateMessage::VideoRotation::Rotation90;
} else if (videoRotation->second.int_value() == 180) {
message.videoRotation = MediaStateMessage::VideoRotation::Rotation180;
} else if (videoRotation->second.int_value() == 270) {
message.videoRotation = MediaStateMessage::VideoRotation::Rotation270;
} else {
...
}
El bloque ya había comprobado que videoRotation->second es un número antes de la primera comparación, así que leer ese mismo valor ya no puede salir de los campos del mensaje. El mismo cambio de cuatro líneas se hizo en la segunda copia del analizador que compila la aplicación, v2_4_0_0/Signaling_4_0_0.cpp, que tenía el mismo error. Un campo videoState ausente sigue tomando su valor por omisión, Inactive.
La corrección llegó a las plataformas en momentos distintos. La misma corrección se hizo en la biblioteca compartida tgcalls el 21 de abril de 2026, en un commit titulado «Fix camera rotation», y las plataformas la tomaron una a una: Telegram para iOS la incluyó desde la versión 12.7, publicada en mayo de 2026, y Telegram Desktop desde la versión 7.0.1, publicada en julio de 2026. Telegram para Android la recibió en 12.10.4 en septiembre de 2026, porque la aplicación de Android lleva su propia copia de la biblioteca, en TMessagesProj/jni/voip/tgcalls, que cada plataforma actualiza por separado.
¿Cómo compruebo si he sufrido una intrusión?
No existen indicadores de compromiso, porque no se ha informado de explotación. La divulgación de NebuSec describe la falla, y ni la empresa ni Telegram habían dicho al 29 de octubre de 2026 que se hubiera usado contra nadie.
Tampoco aporta la divulgación nada que un defensor pueda rastrear: el ataque viaja en los mismos mensajes MediaState que un intercambio de llamada ordinario, y la lectura fuera de límites del analizador no deja ningún artefacto citado en una fuente pública. Trate la actualización como la respuesta, y trate cualquier teléfono todavía en 12.10.3 o anterior como expuesto, no como comprometido.
Cronología
- Marzo de 2022: sale la versión 8.6.2, primera versión citada como afectada por NebuSec y, según el análisis de código de The Hacker News, la versión que activó el código de llamadas que usa este mensaje.
- 2026-04-21: la corrección llega a la biblioteca compartida tgcalls, en el commit «Fix camera rotation».
- Mayo de 2026: Telegram para iOS incluye la biblioteca corregida desde la versión 12.7.
- Julio de 2026: Telegram Desktop incluye la biblioteca corregida desde la versión 7.0.1.
- 2026-09-17: se sube Telegram para Android 12.10.3, la última versión afectada.
- 2026-09-24: se sube Telegram para Android 12.10.4, que corrige la falla, en una versión que The Hacker News fecha a finales de septiembre.
- 2026-10-29: NebuSec divulga la falla.
Preguntas frecuentes
¿Qué versiones de Telegram para Android están afectadas?
Todas las versiones de 8.6.2 a 12.10.3, según NebuSec, es decir, todas las publicadas de marzo de 2022 a septiembre de 2026. La versión 12.10.4, subida el 24 de septiembre de 2026, es la primera corregida, y la versión a comprobar es 12.10.4 o posterior.
¿Están afectados Telegram para iOS o Telegram Desktop?
No demostradamente. Las tres aplicaciones comparten la biblioteca de llamadas tgcalls donde vivía la falla, pero iOS incluyó la biblioteca corregida desde la versión 12.7 en mayo de 2026 y Desktop desde 7.0.1 en julio de 2026, antes que Android en septiembre. NebuSec no tiene evidencia de que la falla afecte directamente a esas apps ni a las llamadas de grupo, y The Hacker News afirma que no se ha demostrado que el código anterior pudiera explotarse en ellas.
¿Existe un CVE o una puntuación CVSS?
No. La falla no tenía identificador CVE al 29 de octubre de 2026, y tampoco se había publicado ninguna puntuación CVSS. La declaración de impacto viene de la divulgación de NebuSec: el código del atacante se ejecuta en el teléfono de la víctima cuando esta responde a la llamada.
¿Se está explotando la falla en ataques reales?
No se ha informado de ningún uso real al 29 de octubre de 2026; ni NebuSec ni Telegram han dicho públicamente si la falla se usó. La falla no está en el catálogo CISA Known Exploited Vulnerabilities, que solo rastrea identificadores CVE.
¿Hay una prueba de concepto con la que probar?
Solo un vídeo. La demostración de NebuSec muestra dos teléfonos, uno marcado como atacante y otro como víctima, con el teléfono de la víctima bajo el control del atacante alrededor de medio minuto después de empezar la llamada. El vídeo no muestra qué versión de Telegram o de Android ejecutaba el teléfono de la víctima, y no había análisis técnico de la falla en el sitio de NebuSec al 29 de octubre de 2026.
¿Exponen las llamadas de grupo el mismo camino?
Ninguna evidencia lo dice. La divulgación de NebuSec cubre llamadas entre dos partes, donde las aplicaciones intercambian mensajes MediaState directamente, y la empresa no tiene evidencia de que las llamadas de grupo estén afectadas.
Analice sus aplicaciones Android con Ostorlab
Ejecute un escaneo móvil de Ostorlab en las aplicaciones Android que desarrolla o distribuye: analiza el paquete de la aplicación, incluidas las bibliotecas nativas que incorpora, para que los componentes vulnerables se señalen antes de que una versión llegue a los usuarios.
Referencias
- The Hacker News, «Telegram Android Flaw Lets Attackers Run Code When Users Answer Voice Calls», 29 de octubre de 2026, con el rango afectado de NebuSec, la confirmación ARM64, las versiones corregidas de iOS y escritorio y la revisión del código fuente defectuoso y corregido: https://thehackernews.com/2026/10/telegram-android-flaw-lets-attackers.html (consultado el 29 de octubre de 2026)
- Divulgación de NebuSec en X, 29 de octubre de 2026, citada por The Hacker News: https://x.com/nebusecurity/status/2115601122727702634 (consultada el 29 de octubre de 2026)
- Código fuente de Telegram para Android versión 8.6.2, commit «Update to 8.6.2» del 20 de marzo de 2022, que añade
tgcalls/v2/Signaling.cppa la compilación y el protocolo de llamada 4.0.0 a las versiones disponibles: https://github.com/DrKLO/Telegram/commit/0abe4541ddbafa65bb79beff5d81c452c7e9626d (consultado el 29 de octubre de 2026) - Código fuente de Telegram para Android versión 12.10.3, el
MediaStateMessage_parsedefectuoso en la copia incluida de tgcalls, commit «update to 12.10.3 (7089)» del 17 de septiembre de 2026: https://github.com/DrKLO/Telegram/blob/9552e5541e1274b9557c9832b204dbfcaf44b3dc/TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp#L720-L740 (consultado el 29 de octubre de 2026) - Código fuente de Telegram para Android versión 12.10.4, el bloque de análisis corregido, commit «update to 12.10.4 (7099)» del 24 de septiembre de 2026: https://github.com/DrKLO/Telegram/blob/c84801762fd5f936c8296ecf09a14a48ebfc4fe4/TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp#L727-L747 (consultado el 29 de octubre de 2026)
- El commit de corrección en tgcalls, «Fix camera rotation», 21 de abril de 2026, que modifica
v2/Signaling.cppyv2_4_0_0/Signaling_4_0_0.cpp: https://github.com/TelegramMessenger/tgcalls/commit/a6ea40ebf18233fad5aae29aa3d30561f839a6a8 (consultado el 29 de octubre de 2026) - Telegram para iOS versión 12.7, cuyo submódulo tgcalls apunta al commit de corrección: https://github.com/TelegramMessenger/Telegram-iOS/tree/release-12.7/submodules/TgVoipWebrtc (consultado el 29 de octubre de 2026)
- Telegram Desktop 7.0.1, publicada el 14 de julio de 2026, la primera versión de escritorio cuyo submódulo tgcalls incluye la corrección: https://github.com/telegramdesktop/tdesktop/releases/tag/v7.0.1 (consultado el 29 de octubre de 2026)
- Telegram para Android en Google Play, el botón Actualizar de la ficha: https://play.google.com/store/apps/details?id=org.telegram.messenger (consultada el 29 de octubre de 2026)
- Feed JSON del catálogo CISA Known Exploited Vulnerabilities, comprobado el 29 de octubre de 2026 para la ausencia de identificador de esta falla: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json