Un exploit en un clic découvert dans la plus grande application de chat mobile de Corée
(stulle123.github.io)- Dans l’application Android KakaoTalk, l’enchaînement de deep links, de WebView et de XSS pouvait mener à une fuite de jeton d’accès puis à la prise de contrôle d’un compte dès qu’un utilisateur cliquait une seule fois sur un lien malveillant
- Le principal point d’entrée était la WebView
CommerceBuyActivityde KakaoTalk10.4.3; le problème venait de la combinaison d’une validation insuffisante des deep links, de JavaScript activé et de l’exposition de l’en-têteAuthorization - La chaîne d’attaque utilisait une redirection de
buy.kakao.comet une DOM XSS surm.shoppinghow.kakao.comafin d’exécuter du JavaScript arbitraire dans la WebView - Le jeton divulgué pouvait servir à accéder à Kakao Mail, à réinitialiser le mot de passe et à enregistrer un client KakaoTalk pour PC/Mac ou KiwiTalk
- La vulnérabilité a reçu l’identifiant CVE-2023-51219 et, après le signalement, Kakao Corp. a désactivé
buy.kakao.comet supprimé la redirection concernée ainsi que laCommerceBuyActivityvulnérable
Portée et prérequis de la vulnérabilité
- KakaoTalk est l’application de chat emblématique de Corée, téléchargée plus de 100 millions de fois sur Google Play, et possède le caractère d’une application tout-en-un intégrant paiement, VTC, shopping, e-mail, etc.
- Le chiffrement de bout en bout (E2EE) n’est pas activé par défaut dans les salons de discussion classiques, ce qui signifie que Kakao Corp. peut techniquement accéder aux messages en transit
- Il existe une fonction optionnelle d’E2EE, Secure Chat, mais elle ne prend pas en charge les messages de groupe ni les appels vocaux
- L’objectif du PoC était d’enregistrer KakaoTalk for Windows/macOS ou le client open source KiwiTalk sur le compte de la victime afin de lire les messages de chat non chiffrés de bout en bout
Point d’entrée : la WebView CommerceBuyActivity
- La WebView
CommerceBuyActivityréunissait plusieurs conditions favorables à l’attaquant- Elle était exposée à l’extérieur (exported) et pouvait être lancée via des deep links comme
kakaotalk://buy - JavaScript était activé avec
settings.setJavaScriptEnabled(true) - Depuis JavaScript, il était possible d’envoyer des données à des composants de l’application non exposés à l’extérieur via le schéma
intent:// - Le traitement des URI était également insuffisant, car le
Componentou leSelectordes URIintent://n’était pas nettoyé ànull
- Elle était exposée à l’extérieur (exported) et pouvait être lancée via des deep links comme
- Cette WebView envoyait un jeton d’accès dans l’en-tête
Authorizationdes requêtes HTTP - Le débogage WebView était activé, ce qui permettait d’observer son comportement via
chrome://inspect; en la redirigeant vers une adresse externe, l’en-têteAuthorizationétait exposé avec la requête GET - Si un attaquant parvenait à exécuter du JavaScript dans cette WebView, il pouvait voler le jeton d’accès de l’utilisateur au simple clic sur un deep link
kakaotalk://buymalveillant
Contournement de la validation d’URL et combinaison avec une DOM XSS
CommerceBuyActivityne chargeait pas directement une URL arbitraire de l’attaquant, mais construisait à partir du deep link fourni une URL commençant parhttps://buy.kakao.com- Par exemple,
kakaotalk://buy/fooétait chargé commehttps://buy.kakao.com/foo - Le chemin, les paramètres de requête et le fragment pouvaient être contrôlés par l’attaquant
- Par exemple,
- L’endpoint
https://buy.kakao.com/auth/0/cleanFrontRedirect?returnUrl=pouvait rediriger vers n’importe quel domainekakao.com, ce qui élargissait le périmètre d’attaque à la recherche de XSS dans les sous-domaines dekakao.com - Sur
m.shoppinghow.kakao.com, un endpoint a été découvert où la requête de recherche était transmise à un sinkinnerHTML, permettant une DOM XSS avec une charge utile simple - Une XSS stockée qui existait auparavant a aussi été découverte, mais il est précisé qu’elle semblait corrigée en mai 2024
- Avec cette combinaison, lorsqu’un utilisateur cliquait sur un deep link malveillant, du JavaScript arbitraire s’exécutait dans la WebView
CommerceBuyActivityet le jeton d’accès de l’en-têteAuthorizationpouvait être envoyé vers l’extérieur
Accès à Kakao Mail et réinitialisation du compte avec le jeton
- Le jeton d’accès KakaoTalk divulgué pouvait être utilisé pour accéder au compte Kakao Mail de la victime
- Il était possible de vérifier si la victime utilisait Kakao Mail, puis d’obtenir un jeton séparé pour accéder à
talk.mail.kakao.com - Même si la victime n’avait pas de compte Kakao Mail, il était possible d’en créer un à son nom ; en choisissant
Set As Primary Emaillors de la création de la nouvelle adresse e-mail, l’adresse e-mail précédemment enregistrée pouvait être remplacée sans vérification supplémentaire - Après l’accès à Kakao Mail, l’étape suivante était la réinitialisation du mot de passe KakaoTalk
- Les informations supplémentaires nécessaires sur la victime — adresse e-mail, pseudonyme et numéro de téléphone — pouvaient être obtenues via le même appel à l’API des paramètres de compte
- Le processus de réinitialisation du mot de passe sur
accounts.kakao.comincluait une 2FA par SMS, mais en interceptant et modifiant les requêtes et réponses avec Burp, il était possible de basculer vers un flux de vérification par e-mail - Le code de vérification pouvait être consulté dans le Kakao Mail de la victime
Enregistrement du client PC et accès aux messages
- Une connexion à KakaoTalk for Windows/macOS ou KiwiTalk avec les identifiants de la victime nécessitait un second facteur d’authentification
- Cette authentification reposait sur un PIN à 4 chiffres : le PIN était soit affiché dans la version PC et saisi dans l’application mobile, soit envoyé à l’application mobile et saisi dans l’application PC
- Le PIN était difficile à brute-forcer, et les endpoints associés appliquaient une limitation de débit avec blocage après 5 tentatives
- Cependant, le jeton d’accès divulgué permettait de soumettre ou de récupérer le PIN auprès du backend KakaoTalk
- Ce processus permettait de terminer le PoC : enregistrer un appareil contrôlé par l’attaquant sur le compte KakaoTalk de la victime et lire les messages de chat non chiffrés de bout en bout
Divulgation, correctifs et ressources de recherche
- La vulnérabilité a reçu l’identifiant CVE-2023-51219
- Le chercheur a publié des outils afin de permettre à d’autres chercheurs en sécurité d’analyser la vaste surface d’attaque de KakaoTalk
- La vulnérabilité a été signalée en décembre 2023 via le Kakao Bug Bounty Program
- L’auteur du signalement indique ne pas avoir reçu de récompense, celle-ci étant réservée aux personnes coréennes
- Kakao Corp. a immédiatement désactivé
https://buy.kakao.com, supprimé la redirection/auth/0/cleanFrontRedirect?returnUrl=, puis retiré laCommerceBuyActivityvulnérable dans une version ultérieure
1 commentaires
Avis de Hacker News
Surtout si la vulnérabilité concerne un domaine qui semble légitime : il est difficile pour une grand-mère de repérer un lien suspect, et je pense que la culture de travail hiérarchique en Corée joue aussi un rôle
Un supérieur impose une date limite de fonctionnalité non négociable ; les vulnérabilités de sécurité ne se voient pas, alors que l’UI, elle, se voit, donc on rogne à la va-vite et on sort le produit
Au final, ça donne une app pleine de failles, et je doute qu’ils corrigent vraiment le problème tant que l’action Kakao ne baisse pas
Pour la sécurité, je pense que ce n’est pas tant dû à la culture de travail coréenne : les grandes entreprises IT regroupées sous le terme « Neka-rakubae » — Naver, Kakao, LINE, Coupang, Woowa Bros — ont en général une culture de travail et une rémunération bien meilleures que la moyenne
C’est sans doute plutôt parce que c’est une app destinée au marché national, donc elle n’a pas été autant éprouvée que les apps populaires dans le monde entier. Cela dit, d’après mon expérience, la rémunération y était inférieure à celle des États-Unis ou de certaines startups coréennes
La différence semble être qu’en Corée, le secteur public et les chaebols représentent une grande partie du marché IT, ce qui laisse peu de place à une culture startup capable de faire la différence
Kakao a aussi été une startup cool à une époque, mais après son succès, elle a donné l’impression de s’efforcer d’imiter les chaebols
La culture peut rendre le phénomène plus marqué en Corée, mais il existe clairement aussi en Occident ; c’est en fait presque un problème universel
Il suffit de passer quelques années dans une entreprise de bureau américaine d’une certaine taille, surtout dans la tech, la finance, le conseil ou chez FAANG, pour voir que l’Occident est pareil
Les ingénieurs de niveau intermédiaire acquiescent aux VP pour être dans le prochain cycle de promotion, et les entreprises savent très bien vendre le concept d’« organisation horizontale », mais en pratique cela relève surtout du slogan marketing
Quand un PM ou un SVP donne une consigne, il arrive souvent que personne ne pose frontalement la question et que tout le monde l’exécute en râlant ; le plus triste est que croire littéralement ce marketing de culture d’entreprise mène à un sentiment de supériorité assez superficiel
Lors d’un récent voyage à Séoul, j’ai dû créer un compte sur l’app de messagerie mobile pour me connecter à cette app ; l’expérience utilisateur n’était pas bonne, et comme c’était en grande partie en coréen, j’ai pas mal galéré
Ça ne m’a pas donné l’impression d’un service très professionnel
KakaoTalk et Naver y jouaient à peu près les rôles de WhatsApp/Meta et Google en Occident
Je trouve remarquable qu’ils aient survécu malgré la concurrence accrue des multinationales. Dans beaucoup d’autres pays, les entreprises tech locales sont devenues quasiment insignifiantes au cours de la dernière décennie, et c’est dommage
Il était donc aussi difficile de héler un taxi dans la rue, et la plupart semblaient ne prendre que des clients appelés via l’app
Une fois, j’ai finalement réussi à entrer en contact avec un chauffeur de taxi, mais il a refusé de me prendre parce que j’étais « étranger » ; je ne sais pas si c’était vraiment de la xénophobie, s’il ne voulait pas de paiement en espèces, si c’était à cause de la barrière de la langue ou un malentendu
La course en taxi que j’ai finalement réussi à faire a ensuite pris un itinéraire traversant la montagne vers l’autre côté de la ville, et j’ai dû appeler la personne avec qui j’avais rendez-vous pour lui demander d’expliquer au chauffeur qu’il se trompait de route. C’est le genre de risque qu’on prend quand on va dans un pays inconnu sans assez de préparation
Lors de ma visite début 2015, Google en était un exemple
Dans quelle langue s’attendait-on à ce qu’une app coréenne soit, en français ?
Mais d’après ce que je sais, ce n’est pas vraiment Uber : c’est plutôt un proxy KakaoTaxi utilisant l’interface Uber
L’app de messagerie principale comporte des fonctionnalités additionnelles, comme l’envoi de cadeaux, qui ont rendu possible cette vulnérabilité, mais l’appel de taxi se fait dans Kakao T, une app de mobilité qui propose aussi des scooters en location, des vélos électriques et des réservations de train et d’avion, pas dans KakaoTalk
Il existe une intégration avec la plateforme de paiement KakaoPay, mais le service lui-même se trouve dans une app séparée ; c’est davantage comparable à Google sur Android, avec un identifiant central donnant accès à plusieurs services
C’est probablement pour cela que l’app comporte autant de points d’accès : à cause de l’intégration avec ses propres services
Comme WeChat, KakaoPay est suffisamment intégré à KakaoTalk pour que la plupart des utilisateurs utilisent KakaoPay uniquement dans KakaoTalk, et non via l’app KakaoPay
Le fait qu’il existe une app KakaoPay séparée ne change pas grand-chose : on peut envoyer, recevoir et effectuer des paiements dans KakaoTalk sans installer l’app KakaoPay
Il s’est avéré que ce client était rempli de bugs qui montraient des messages au mauvais utilisateur
Les apps de messagerie mobile ne devraient pas être développées façon « avancer vite et casser des choses », mais je pense que c’est le résultat naturel d’une app tout-en-un comme Kakao
Si ce n’est pas le cas, cela ressemble davantage à un bug serveur qu’à un bug client
Et Telegram a été, parmi les apps de messagerie que j’ai utilisées, l’une des plus stables, riches en fonctionnalités et faciles à utiliser
Il est indiqué qu’il faut être « Coréen résidant en Corée ou à l’étranger »
https://bugbounty.kakao.com/home
Cela aurait été pire s’ils avaient soumis le rapport en pensant pouvoir être payés, puis découvert ensuite que c’était limité aux citoyens coréens
À noter aussi que les récompenses sont très faibles : à partir de 50 000 wons, soit environ 35 dollars, jusqu’à 10 millions de wons, soit environ 7 100 dollars
En tant qu’étranger ayant monté une startup à Séoul ces neuf dernières années, j’ai vécu plusieurs situations similaires
Il faut se demander si elles servent le long terme, ou seulement les profits de court terme d’un petit nombre
Sait-on si elle a été exploitée en conditions réelles ?