Descubren un exploit de 1 clic en la app de chat móvil más grande de Corea
(stulle123.github.io)- En la app Android de KakaoTalk, la combinación de deep links, WebView y XSS podía hacer que con un solo clic en un enlace malicioso se llegara hasta la filtración del token de acceso y la toma de control de la cuenta
- El punto de entrada clave era el WebView de
CommerceBuyActivityen KakaoTalk10.4.3, donde se combinaron validación insuficiente de deep links, JavaScript habilitado y exposición del encabezadoAuthorization - La cadena de ataque aprovechaba una redirección de
buy.kakao.comy un DOM XSS enm.shoppinghow.kakao.compara ejecutar JavaScript arbitrario dentro del WebView - El token filtrado podía usarse para acceder a Kakao Mail, restablecer la contraseña y registrar clientes de KakaoTalk para PC/Mac o el cliente KiwiTalk
- La vulnerabilidad fue asignada como CVE-2023-51219 y, tras el reporte, Kakao Corp. dio de baja
buy.kakao.comy eliminó tanto las redirecciones relacionadas como elCommerceBuyActivityvulnerable
Alcance y supuestos de la vulnerabilidad
- KakaoTalk es la principal app de chat de Corea, con más de 100 millones de descargas en Google Play Store, y funciona como una superapp que incluye pagos, transporte, compras, correo y más
- Los chats normales no tienen cifrado de extremo a extremo (E2EE) activado por defecto, por lo que Kakao Corp. puede acceder a los mensajes en tránsito
- Existe una función opcional de E2EE llamada Secure Chat, pero no admite mensajería grupal ni llamadas de voz
- El objetivo del PoC era registrar KakaoTalk para Windows/macOS o el cliente open source KiwiTalk en la cuenta de la víctima para leer mensajes de chat sin cifrado de extremo a extremo
Punto de entrada: WebView de CommerceBuyActivity
- El WebView de
CommerceBuyActivitytenía varias condiciones favorables para el atacante- Estaba expuesto externamente (
exported) y podía iniciarse mediante deep links comokakaotalk://buy - Tenía JavaScript habilitado con
settings.setJavaScriptEnabled(true) - Desde JavaScript se podían enviar datos incluso a componentes de la app no expuestos externamente mediante el esquema
intent:// - También había una validación deficiente del URI porque
ComponentySelectordeintent://no se saneaban anull
- Estaba expuesto externamente (
- Este WebView enviaba el token de acceso en el encabezado
Authorizationde las solicitudes HTTP - La depuración del WebView estaba activada, por lo que su comportamiento podía inspeccionarse con
chrome://inspect, y al redirigirlo a una dirección externa el encabezadoAuthorizationquedaba expuesto junto con la solicitud GET - Si el atacante lograba ejecutar JavaScript dentro de este WebView, podía robar el token de acceso del usuario con solo hacer clic en un deep link malicioso de
kakaotalk://buy
Bypass de validación de URL y encadenamiento con DOM XSS
CommerceBuyActivityno cargaba directamente una URL arbitraria del atacante, sino que construía una URL que comenzaba conhttps://buy.kakao.coma partir del deep link recibido- Por ejemplo,
kakaotalk://buy/foocargabahttps://buy.kakao.com/foo - La ruta, los parámetros de consulta y el fragmento podían ser controlados por el atacante
- Por ejemplo,
- El endpoint
https://buy.kakao.com/auth/0/cleanFrontRedirect?returnUrl=podía redirigir a cualquier dominiokakao.com, lo que ampliaba el alcance de búsqueda de XSS a subdominios dekakao.com - En
m.shoppinghow.kakao.comse encontró un endpoint donde la consulta de búsqueda llegaba a un sink deinnerHTML, lo que permitía un DOM XSS con una carga simple - También se descubrió un XSS almacenado que había existido antes, aunque se aclara que para mayo de 2024 parecía ya corregido
- Con esta combinación, cuando la víctima hacía clic en un deep link malicioso, se ejecutaba JavaScript arbitrario dentro del WebView de
CommerceBuyActivityy el token de acceso del encabezadoAuthorizationpodía enviarse al exterior
Acceso a Kakao Mail y restablecimiento de cuenta con el token
- El token de acceso filtrado de KakaoTalk podía utilizarse para acceder a la cuenta de Kakao Mail de la víctima
- Tras comprobar si la víctima usaba Kakao Mail, era posible obtener un token separado y acceder a
talk.mail.kakao.com - Incluso si la víctima no tenía una cuenta de Kakao Mail, se podía crear una nueva a su nombre, y al elegir
Set As Primary Emailal crear la nueva dirección, la dirección registrada previamente podía sobrescribirse sin verificación adicional - Después de acceder a Kakao Mail, el siguiente paso era el restablecimiento de la contraseña de KakaoTalk
- Los datos adicionales necesarios de la víctima, como correo, apodo y número telefónico, podían obtenerse desde la misma llamada a la API de configuración de cuenta
- Aunque el proceso de restablecimiento de contraseña en
accounts.kakao.comtenía 2FA por SMS, interceptando y modificando solicitudes y respuestas con Burp se podía cambiar al flujo de verificación por correo electrónico - El código de verificación podía consultarse en el Kakao Mail de la víctima
Registro de cliente de PC y acceso a mensajes
- Al iniciar sesión con las credenciales de la víctima en KakaoTalk para Windows/macOS o en KiwiTalk, se requería un segundo factor de autenticación
- Esta verificación usaba un PIN de 4 dígitos: el PIN se mostraba en la versión de PC para introducirlo en la app móvil, o bien se enviaba a la app móvil para introducirlo en la app de PC
- El PIN no era fácil de forzar por fuerza bruta, y el endpoint correspondiente tenía limitación de tasa tras 5 intentos
- Sin embargo, con el token de acceso filtrado era posible enviar o consultar el PIN en el backend de KakaoTalk
- Mediante este proceso, el atacante podía registrar un dispositivo bajo su control en la cuenta de KakaoTalk de la víctima y completar el PoC para leer mensajes de chat no cifrados de extremo a extremo
Divulgación, corrección y material de investigación
- La vulnerabilidad fue asignada como CVE-2023-51219
- El investigador publicó herramientas para que otros investigadores de seguridad pudieran analizar la amplia superficie de ataque de KakaoTalk
- La vulnerabilidad fue reportada en diciembre de 2023 a través del Kakao Bug Bounty Program
- El autor del reporte señaló que no recibió recompensa porque esta estaba limitada a ciudadanos coreanos
- Kakao Corp. retiró de inmediato
https://buy.kakao.com, eliminó la redirección/auth/0/cleanFrontRedirect?returnUrl=y en versiones posteriores también eliminó elCommerceBuyActivityvulnerable
1 comentarios
Opiniones en Hacker News
En especial, si la vulnerabilidad hace que el dominio parezca legítimo, a una abuela le sería difícil detectar un enlace sospechoso, y creo que la cultura laboral jerárquica de Corea también influye.
Un jefe impone una fecha límite innegociable para una funcionalidad; las vulnerabilidades de seguridad no se ven, pero la UI sí, así que recortan lo que puedan y lo lanzan.
Al final queda una app llena de agujeros de seguridad, y no creo que la arreglen bien hasta que caiga el precio de las acciones de Kakao.
En cuanto a la seguridad, no creo que sea tanto por la cultura laboral coreana, sino porque las principales empresas de TI agrupadas como Nekarakuba —Naver, Kakao, LINE, Coupang, Woowa Bros— suelen tener una cultura laboral y una compensación muy por encima del promedio.
Probablemente se acerque más a que, por ser una app para el mercado local, no ha sido examinada lo suficiente como las apps populares a escala mundial. Eso sí, en mi experiencia, la compensación era más baja que en Estados Unidos o que en algunas startups coreanas.
La diferencia parece estar en que, en Corea, el sector gubernamental y los chaebol representan una gran parte del mercado de TI, por lo que no hay mucho espacio para que la cultura startup marque una diferencia.
Kakao también fue alguna vez una startup cool, pero después de tener éxito da la impresión de que se ha esforzado por imitar a los chaebol.
Puede que por la cultura sea peor en Corea, pero sin duda ocurre también en Occidente y, de hecho, es casi un problema universal.
Basta con pasar unos años en una empresa de oficina estadounidense de cierto tamaño, especialmente en tecnología, finanzas, consultoría o FAANG, para darse cuenta de que en Occidente es lo mismo.
Ingenieros de nivel medio le siguen la corriente a un VP para entrar al siguiente ciclo de ascensos, y las empresas solo son buenas vendiendo el marketing de “organización horizontal”; en la práctica se parece más a un eslogan publicitario.
Cuando un PM o un SVP da una orden, muchas veces nadie la cuestiona de frente; se quejan y la ejecutan. Lo más triste es que creer al pie de la letra ese marketing de cultura corporativa termina llevando a una sensación superficial de superioridad.
En un viaje reciente a Seúl tuve que crearme una cuenta en la app móvil de chat para iniciar sesión en esa app, la experiencia de usuario no fue buena y, como casi todo estaba en coreano, me costó bastante.
No me dio la impresión de una operación muy profesional.
KakaoTalk y Naver cumplían casi los roles que tienen WhatsApp/Meta y Google en Occidente.
Me parece admirable que hayan sobrevivido pese al aumento de la competencia con multinacionales. En muchos otros países, las empresas tecnológicas locales se volvieron casi irrelevantes durante la última década, y eso es una lástima.
Por eso también era difícil parar un taxi en la calle, y parecía que la mayoría solo aceptaba pasajeros llamados por app.
Una vez por fin logré contactar a un taxista, pero dijo que no me llevaría por ser “extranjero”; no sé si fue xenofobia real, si no quería pagos en efectivo, si era porque no hablaba coreano o si fue un malentendido.
Más tarde, en un viaje en taxi que sí salió, la ruta terminó cruzando una montaña hacia el otro lado de la ciudad, así que tuve que llamar a la persona con la que había salido para que le explicara al conductor que el camino estaba mal. Lo veo como uno de los riesgos de ir a un país desconocido sin suficiente preparación.
Cuando visité a comienzos de 2015, Google era un ejemplo de eso.
¿En qué idioma esperabas que estuviera una app coreana, en francés?
Pero entiendo que, más que un Uber real, es una especie de proxy de KakaoTaxi que usa la interfaz de Uber.
La app principal de chat tiene funciones adicionales, como regalos, que hicieron posible esta vulnerabilidad, pero el llamado de taxis no se hace en KakaoTalk, sino en la app de movilidad Kakao T, que también ofrece scooters de renta, bicicletas eléctricas y reservas de trenes y vuelos.
Tiene integración con la plataforma de pagos KakaoPay, pero el servicio en sí está en una app separada; se parece más a Google en Android, con un ID central para acceder a varios servicios.
Por eso creo que la razón de que la app tenga tantos puntos de acceso es la integración con sus propios servicios.
Al igual que WeChat, KakaoPay está lo bastante integrado en KakaoTalk como para que la mayoría de los usuarios use KakaoPay solo dentro de KakaoTalk, no en la app de KakaoPay.
Que exista una app separada de KakaoPay no cambia mucho: sin la app de KakaoPay también puedes enviar dinero, recibirlo y pagar desde KakaoTalk.
Resultó que ese cliente estaba lleno de bugs que mostraban mensajes al usuario equivocado.
Las apps móviles de chat no deberían desarrollarse con el enfoque de “muévete rápido y rompe cosas”, y creo que este es el resultado natural de una app todo en uno como Kakao.
Si no es eso, parece más un bug del servidor que un bug del cliente.
Además, Telegram ha sido una de las apps de chat más estables, completas y fáciles de usar que he probado.
Dice que debes ser “coreano residente en el país o en el extranjero”.
https://bugbounty.kakao.com/home
Habría sido peor si hubieras enviado el reporte esperando que te pagaran y luego te enteraras de que estaba limitado a ciudadanos coreanos.
Además, las recompensas son muy bajas: desde un mínimo de 50.000 wones, unos 35 dólares, hasta un máximo de 10 millones de wones, unos 7.100 dólares.
Como extranjero, durante los últimos 9 años construyendo una startup en Seúl, me pasó algo parecido varias veces.
Hay que preguntarse si están pensados para el largo plazo o para beneficios de corto plazo que quedan en manos de unos pocos.
¿Se sabe si fue explotada en entornos reales?