4 ポイント 投稿者 GN⁺ 2024-06-27 | 1件のコメント | WhatsAppで共有
  • KakaoTalk Androidアプリでは、ディープリンク、WebView、XSSが組み合わさることで、ユーザーが悪意あるリンクを一度クリックするだけでアクセストークンの漏えいからアカウント乗っ取りにまで至る可能性があった
  • 中核となる侵入口はKakaoTalk 10.4.3CommerceBuyActivity WebViewで、ディープリンク検証の不備とJavaScriptの有効化、Authorization ヘッダーの露出が重なって問題を引き起こしていた
  • 攻撃チェーンは buy.kakao.com のリダイレクトと m.shoppinghow.kakao.comDOM XSS を利用し、WebView内で任意のJavaScriptを実行する仕組みだった
  • 漏えいしたトークンは、Kakao Mailへのアクセス、パスワード再設定、Windows/Mac向けKakaoTalkまたは KiwiTalk クライアントの登録に利用できた
  • 脆弱性には CVE-2023-51219 が割り当てられ、報告後にKakao Corp.は buy.kakao.com を停止し、関連するリダイレクトと脆弱な CommerceBuyActivity を削除した

脆弱性の範囲と前提

  • KakaoTalkはGoogle Play Storeで1億回以上ダウンロードされている韓国を代表するチャットアプリであり、決済、配車、ショッピング、メールなどを含むオールインワンアプリの性格を持つ
  • 通常のチャットルームではエンドツーエンド暗号化(E2EE)がデフォルトで有効になっておらず、Kakao Corp.が送信中のメッセージにアクセスできる構造となっている
  • オプションのE2EE機能である Secure Chat は存在するが、グループメッセージングや音声通話には対応していない
  • PoCの目標は、被害者アカウントにKakaoTalk for Windows/macOSまたはオープンソースクライアント KiwiTalk を登録し、非エンドツーエンド暗号化チャットメッセージを読むことだった

侵入口: CommerceBuyActivity WebView

  • CommerceBuyActivity WebViewは、攻撃者に有利な条件をいくつも備えていた
    • 外部公開(exported)されており、kakaotalk://buy のようなディープリンクで起動できる
    • settings.setJavaScriptEnabled(true) によりJavaScriptが有効化されている
    • JavaScriptから intent:// スキームを通じて、外部公開されていないアプリコンポーネントにもデータを送ることができる
    • intent:// URIの ComponentSelectornull に整理されず、URI処理も不十分だった
  • このWebViewはHTTPリクエストの Authorization ヘッダーにアクセストークンを載せて送信していた
  • WebViewデバッグが有効になっていたため、chrome://inspect で挙動を確認でき、外部アドレスへ移動させるとGETリクエストとともに Authorization ヘッダーが露出した
  • 攻撃者がこのWebView内でJavaScriptを実行できれば、悪意ある kakaotalk://buy ディープリンクをクリックさせるだけで、ユーザーのアクセストークンを盗むことができた

URL検証の回避とDOM XSSの連結

  • CommerceBuyActivity は任意の攻撃者URLを直接読み込むのではなく、入力されたディープリンクを https://buy.kakao.com で始まるURLに組み立てていた
    • たとえば kakaotalk://buy/foohttps://buy.kakao.com/foo として読み込まれる
    • パス、クエリパラメータ、fragmentは攻撃者が制御できた
  • https://buy.kakao.com/auth/0/cleanFrontRedirect?returnUrl= エンドポイントは任意の kakao.com ドメインへリダイレクトできたため、kakao.com サブドメイン上でXSSを探す攻撃範囲が広がっていた
  • m.shoppinghow.kakao.com では、検索クエリが innerHTML sinkに渡されるエンドポイントが見つかり、簡単なペイロードで DOM XSS が可能だった
  • 以前存在していた保存型XSSも見つかったが、2024年5月時点では修正済みとみられることが明記されている
  • この組み合わせにより、ユーザーが悪意あるディープリンクをクリックすると CommerceBuyActivity WebView内で任意のJavaScriptが実行され、Authorization ヘッダーのアクセストークンを外部へ送信できた

トークンでKakao Mailとアカウント再設定にアクセス

  • 漏えいしたKakaoTalkアクセストークンは、被害者の Kakao Mail アカウントへのアクセスに利用できた
  • 被害者がKakao Mailを使用しているか確認したうえで、別のトークンを取得し talk.mail.kakao.com にアクセスする流れが可能だった
  • 被害者にKakao Mailアカウントがなくても、被害者名義で新しいアカウントを作成でき、新しいメールアドレス作成時に Set As Primary Email を選ぶと、既存の登録メールアドレスが追加確認なしで上書きされる可能性があった
  • Kakao Mailへのアクセス後、次の段階は KakaoTalkパスワードの再設定 だった
    • 追加で必要となる被害者のメールアドレス、ニックネーム、電話番号は、同じアカウント設定API呼び出しから取得できた
    • accounts.kakao.com のパスワード再設定プロセスにはSMS 2FAがあったが、Burpでリクエストとレスポンスを傍受・改変し、メール認証フローへ切り替えることができた
    • 認証コードは被害者のKakao Mailで確認できた

PCクライアント登録とメッセージアクセス

  • 被害者の認証情報でKakaoTalk for Windows/macOSまたはKiwiTalkにログインすると、第二認証要素が必要だった
  • この認証は4桁PIN方式で、PINがPC版に表示されてモバイルアプリに入力されるか、逆にモバイルアプリに送信されてPCアプリに入力される仕組みだった
  • PINは総当たりしにくく、関連エンドポイントには5回試行後にブロックされるレート制限があった
  • しかし漏えいしたアクセストークンを使うことで、KakaoTalkバックエンドにPINを送信または照会できた
  • この過程により、攻撃者が制御するデバイスを被害者のKakaoTalkアカウントに登録し、エンドツーエンド暗号化されていないチャットメッセージを読むPoCが完成した

公開、修正、研究資料

  • 脆弱性には CVE-2023-51219 が割り当てられている
  • 研究者は、ほかのセキュリティ研究者がKakaoTalkの広い攻撃面を分析できるよう ツール を公開した
  • 脆弱性は2023年12月、Kakao Bug Bounty Program を通じて報告された
  • 報告者は、報奨の対象が韓国人に限定されていたため、報奨は受け取れなかったと明かしている
  • Kakao Corp.は直ちに https://buy.kakao.com を停止し、/auth/0/cleanFrontRedirect?returnUrl= リダイレクトを削除し、その後のバージョンで脆弱な CommerceBuyActivity も削除した

1件のコメント

 
GN⁺ 2024-06-27
Hacker Newsのコメント
  • 韓国に住んでいるとKakaoを使わずに過ごすのは難しく、祖母の世代まで使っているアプリなので、セキュリティホールが多いのは懸念すべきことです
    特にドメインが正規に見える脆弱性なら、祖母が怪しいリンクに気づくのは難しく、韓国のヒエラルキー的な職場文化も一役買っていると思います
    上司が機能の締め切りを交渉不能な形で投げてきて、セキュリティ脆弱性は目に見えない一方でUIは見えるので、適当に削ってリリースすることになります
    結局、セキュリティホールの多いアプリになり、Kakaoの株価が下がるまではまともに直さない気がします
    • 韓国人ですが、KakaoTalkもLINEもFacebookも使っていません。少し変わったケースにはなりますが、多くのサービスがSMSの代替手段を提供しているので、なくても生活できます
      セキュリティ面は韓国の職場文化のせいというより、いわゆる「ネカラクベ」としてまとめられるNaver、Kakao、LINE、Coupang、Woowa Brosのような主要IT企業は、平均よりはるかに良い職場文化と報酬を持つ傾向があるからだと思います
      おそらく国内向けアプリなので、世界的に人気のあるアプリほど十分に検証されていないというほうが近いです。ただし私の経験では、報酬は米国や一部の韓国スタートアップより低かったです
    • 無理な締め切りやヒエラルキー的な職場文化は韓国だけのものではなく、世界中にあります
      違いは、韓国では政府部門と財閥がIT市場の大きな割合を占めていて、スタートアップ文化が違いを生み出す余地があまりない点に見えます
      Kakaoもかつては格好いいスタートアップでしたが、成功してからは財閥をまねようと努めてきたように感じます
    • 上司や顧客はUIを見ることはできても、セキュリティ問題は見えないという現象は韓国だけの話ではありません
      文化のせいで韓国ではより深刻かもしれませんが、西側でも確実に起きており、実質的には普遍的な問題に近いです
    • この問題が韓国のニュースや規制当局に取り上げられるほどのものなのか気になります。株価以外にも責任を問う経路があるかもしれません
    • ヒエラルキー的な職場文化は、米国人が東アジアで気に入らないことを説明するときに持ち出す万能の言い訳のように使われます
      米国のある程度の規模のホワイトカラー企業、とくにテック・金融・コンサルティングやFAANGで数年働けば、西側も同じだと分かります
      中堅エンジニアたちは次の昇進サイクルに乗るためにVPに同調し、企業は「フラットな組織」というマーケティングがうまいだけで、実際には宣伝文句に近いです
      PMやSVPが指示を出すと、誰も正面から問いたださず、不満を言いながら実行することが多く、こうした企業文化マーケティングをそのまま信じる態度が浅い優越感につながっているのがさらに苦いところです
  • 面白いのは、西側のライドシェアアプリが韓国ではあまり通用せず、この会社が韓国を代表する配車アプリも作っていることです
    最近ソウルを旅行したとき、そのアプリにログインするためにモバイルチャットアプリのアカウントを作る必要があり、ユーザー体験も良くなく、ほとんどが韓国語だったのでかなり苦労しました
    あまりプロフェッショナルな運営という印象は受けませんでした
    • 数年前に韓国に住んでいたとき、アプリとサービスのエコシステムが別個に形成されている点が興味深かったです
      KakaoTalkNaverが、西側のWhatsApp/MetaやGoogleのような役割をほぼ担っていました
      多国籍企業との競争が大きくなったにもかかわらず生き残っているのは立派だと思います。他の多くの国ではこの10年で現地のテック企業がほとんど意味を失ってしまい、それは残念なことです
    • 5年ほど前に行ったときは、韓国の銀行口座がなかったのでタクシーアプリをまったく使えませんでした
      そのため路上でタクシーを拾うのも難しく、ほとんどがアプリで呼んだ客だけを乗せているように見えました
      一度、ようやくタクシー運転手と接触できたのですが、「外国人」だから乗せないと言われました。本当に差別だったのか、現金払いが嫌だったのか、韓国語が通じなかったからなのか、誤解だったのかは分かりません
      後で成功したタクシー乗車も、街の反対側へ山を越えていく経路になってしまい、デートしていた相手に電話して、運転手に道が違うと説明してもらう必要がありました。準備不足で見知らぬ国に行くと起こるリスクだと思います
    • 韓国で驚いたのは、世界中で使われていると思っていたテック製品にローカルな代替品が非常に多く、グローバル版/米国版はほとんど市場に浸透していなかったことです
      2015年初めに訪れたときのGoogleがその例でした
    • 韓国のアプリが「ほとんど」韓国語だったという常識的な事実が、ユーザー体験やプロ意識の欠如と何の関係があるのか分かりません
      韓国のアプリが何語であることを期待していたのでしょうか、フランス語ですか?
    • 他の人たちがすでに言っているように、Uberは韓国、少なくともソウルでは動作します
      ただ、本物のUberというより、Uberのインターフェースを使うKakaoTaxiプロキシに近いと理解しています
  • 小さな訂正が必要です。KakaoTalkはWeChatのような「オールインワン」アプリではありません
    メインのチャットアプリにギフト機能のような今回の脆弱性を可能にした付加機能はありますが、タクシー配車はKakaoTalkではなく、レンタルスクーター、電動自転車、鉄道・航空券予約も提供するモビリティアプリKakao Tで行います
    決済プラットフォームKakaoPayとの連携はありますが、サービス自体は別アプリにあり、中央IDで複数サービスにアクセスするAndroidのGoogleにより近いです
    そのため、アプリにアクセス地点が多い理由も自社サービス連携のためだと思います
    • これは正確ではありません
      WeChatのように、KakaoPayはKakaoTalkに十分統合されているので、大多数のユーザーはKakaoPayアプリではなくKakaoTalk内だけでKakaoPayを使います
      別個のKakaoPayアプリがあるという事実は大きな影響がなく、KakaoPayアプリなしでもKakaoTalkで送金、受け取り、決済ができます
  • 報奨の対象が韓国人のみだなんて、ここまで来るとハッカーにやられても仕方ないと思えてきます
    • 韓国人でも最大報奨金が約7,000ドルだなんて、いくつものセキュリティ問題がありそうなアプリにしては途方もなく低いです
    • バグを売るように促す構造です
  • Telegram創業者が、モバイルクライアントを開発者1人が担当しているとしてチームの才能を自慢していたことを思い出します
    ふたを開けてみると、そのクライアントは誤ったユーザーにメッセージを見せるバグだらけでした
    モバイルチャットアプリは「速く動いて壊す」式で開発すべきではなく、Kakaoのようなオールインワンアプリの自然な結果がこういう姿なのだと思います
    • モバイルアプリに複数のユーザーアカウントが追加されていて、あるアカウントのメッセージを別のアカウント側に表示したという意味なのか気になります
      そうでないなら、クライアントのバグというよりサーバーバグに近いように見えます
    • チャットアプリは難しく、競合アプリにも似たようなバグが多かったので、これだけで品質が悪い証拠には見えません
      そしてTelegramは、これまで使ったチャットアプリの中で最も安定しており、機能が豊富で、使いやすい部類でした
    • Telegramを擁護するなら、似たようなことはFacebook、Google、Appleのような大規模サービスでもよく起きています
    • 委員会方式の設計で作られたソフトウェアにもひどいバグはあり得ます
    • Kakaoは確かに速く動いてはいません
  • KakaoのBug Bounty Programに2023年12月に脆弱性を報告したものの、報奨を受け取れるのは韓国人だけなので何も受け取れなかったというのは衝撃的です
    • 少なくともバグバウンティサイトには制限が公開されています
      「国内外に居住する韓国人」でなければならないとされています
      https://bugbounty.kakao.com/home
      お金を受け取れると思って提出し、後から韓国市民権者に限定されると知ったのなら、もっと悪かったでしょう
      付け加えると、報奨金も非常に低く、最低5万ウォン、約35ドルから最高1,000万ウォン、約7,100ドル程度です
    • 韓国ではこういうことはかなり一般的です
      外国人としてこの9年間ソウルでスタートアップを作りながら、似たようなことを何度も経験しました
  • 最近のソフトウェア工学のやり方を一歩引いて考え直す必要があります
    長期戦のためのものなのか、少数に戻る短期的利益のためのものなのかを見極めるべきです
  • 韓国に駐留する米軍関係者がこの脆弱性の影響をどれほど受けたのか気になります
    実環境で悪用されたことは知られているのでしょうか?
  • サービス開始から10年以上たつのに、いまだにウェブ版がありませんが、今回のニュースを見るとむしろ幸いかもしれません
    • それでもウェブ版は欲しいです。Linuxでwineを使ってKakaoアプリを安定して動かすのが難しいからです