TikTok Android アプリの脆弱性により、ワンクリックでアカウントが乗っ取られる可能性がある

マイクロソフトは、TikTok Android アプリケーションに深刻度の高い脆弱性を発見しました。この脆弱性により、攻撃者はワンクリックでユーザーのアカウントを侵害できる可能性があります。悪用するには複数の問題を連鎖させる必要があった脆弱性は修正されており、実際に悪用された証拠は見つかりませんでした。攻撃者はこの脆弱性を利用して、標的のユーザーが特別に細工されたリンクをクリックするだけで、ユーザーの気付かないうちにアカウントを乗っ取ることができた可能性があります。その後、攻撃者は、ユーザーの TikTok プロファイルや機密情報にアクセスして変更した可能性があります。たとえば、非公開の動画を公開したり、メッセージを送信したり、ユーザーに代わって動画をアップロードしたりしていた可能性があります。

この脆弱性により、アプリのディープリンク検証がバイパスされる可能性がありました。攻撃者は、アプリに任意の URL をアプリの WebView にロードさせ、その URL が WebView に接続された JavaScript ブリッジにアクセスし、機能を攻撃者に付与できるようにする可能性があります。私たちは以前、JavaScript ブリッジが広範囲に及ぶ可能性があることを調査しました。この調査では、未知のリンクをクリックする際に注意を払うことの重要性を強調するとともに、デジタル エコシステム全体の防御を強化するために、セキュリティ コミュニティ内でのコラボレーションがいかに必要であるかを示しています。

TikTok には 2 つのフレーバーの Android アプリがあります。1 つはパッケージ名com.ss.android.ugc.trillの下の東および東南アジア向けで、もう 1 つはパッケージ名com.zhiliaoapp.musicallyの下の残りの国向けです。 TikTok の脆弱性評価を実施した結果、この問題は、Google Play ストア経由で合わせて 15 億回以上インストールされている Android 用アプリの両方のフレーバーに影響を与えていることがわかりました。影響を慎重に検討した後、Microsoft セキュリティ研究者は、 Microsoft Security Vulnerability Research (MSVR) を介した調整された脆弱性開示(CVD) による責任ある開示ポリシーの一環として、2022 年 2 月に TikTok に問題を通知しました。 TikTok は、報告された脆弱性に対処するための修正をリリースすることで迅速に対応し、現在CVE-2022-28799として特定されています。詳細については、CVE エントリを参照してください。 TikTokセキュリティチームによる効率的かつ専門的な解決策を称賛します. TikTok ユーザーは、アプリの最新バージョンを使用していることを確認することをお勧めします。

このブログ投稿では、私たちが発見した問題に関する情報を共有し、標的とされたユーザーのアカウントを迅速かつ密かに乗っ取る攻撃でそれらがどのように利用された可能性があるかを調べ、ベスト プラクティスと保護について順を追って説明します。プラットフォーム全体の脅威が増大し続けているため、使用しているプラットフォームやデバイスに関係なく、すべてのユーザーのセキュリティを継続的に改善するために、より大きなセキュリティ コミュニティとの調査、開示、およびコラボレーションの詳細も共有しています。

JavaScript インターフェイス

この脆弱性の悪用は、WebView と呼ばれる Android オペレーティング システムのコンポーネントによって提供される JavaScript インターフェイスのアプリの実装に依存しています。 WebView を使用すると、アプリケーションは Web ページを読み込んで表示できます。また、 addJavascriptInterface API 呼び出しを使用して、Web ページの JavaScript コードがアプリの特定のクラスの特定の Java メソッドを呼び出せるようにするブリッジ機能も提供できます。 JavaScript コードを介してアクセス可能なアプリケーション レベルのオブジェクトを使用して、信頼されていない Web コンテンツを WebView にロードすると、アプリケーションが JavaScript インターフェース インジェクションに対して脆弱になり、データの漏洩、データの破損、場合によっては任意のコードの実行につながる可能性があります。

この例では、以下のコードは、JavaScript インターフェースがどのように使用され、 JsObjectクラスのインスタンスが WebView に挿入され (8 行目)、JavaScript コード内のinjectObject変数によって参照され、 loadUrl API メソッドを介してロードされるかを示しています。 (10行目):

JavaScript インターフェイスを WebView オブジェクトに追加することを示すコード
図 1. JavaScript インターフェースを WebView オブジェクトに追加する

Android API レベル 18 (Android 4.3 で 2013 年にリリース) より前では、注入されたクラスのすべてのメソッドがこの JavaScript コードに公開されていました。 API レベル 18 以降では、”@JavascriptInterface” アノテーションを持つクラス メソッドのみを呼び出すことができます (上記の 2 行目)。

JavaScript ブリッジ

TikTok for Android は JavaScript インターフェイスを広範囲に使用し、アプリ内で使用される WebView 機能を強化します。このような WebView を利用する興味深いクラスを特定しました。 [ redacted] .bridge.*パッケージのクラスによって実装されるあらゆるタイプの機能にアクセスできる JavaScript ブリッジを登録します。このブリッジは、以下に示すメソッドを公開します。

JavaScript コードを介して呼び出し可能なメソッドのレンダリングを示すコード
図 2. JavaScript コードを介して呼び出し可能なメソッドをレンダリングする

arg1は、いくつかの属性で構成される JSON 文字列に対応し、 func属性とparams属性が最も関連性があります。

func属性は JavaScript コードから呼び出される Java メソッドの名前に対応し、 params属性はこのメソッドが受け取る引数を設定します。たとえば、シグネチャString foo(String arg1, String arg2)を使用して JavaScript コードから Java メソッドを呼び出すには、次のステートメントを使用する必要があります。

JavaScript インターフェイスを介して呼び出される Java メソッドを表すコード
図 3. JavaScript インターフェースを介して Java メソッドを呼び出すサンプル コード。

結果は、JavaScript コードで定義されたコールバックに JSON 文字列として返されます。このコールバックは、単一の文字列を引数として受け取ります。

JavaScript インターフェイスを使用した Java と Web コンポーネント間の対話を示す図。詳細は以下のテキストで説明します。
図 4. JavaScript インターフェースを使用した Java と Web コンポーネント間の対話

上の図は概念を視覚化し、次の手順を示しています。

  1. アプリケーションは、Web サイトexample.comをその WebView に読み込みます
  2. リモート サーバーからフェッチされた JavaScript コードは、Java メソッドを呼び出します。
  3. メソッドが実行される
  4. 結果はパラメータとしてコールバック関数に返されます

最後に、ハンドラーメソッドは結果をローカルで処理するか、 XMLHttpRequestを使用して外部サーバーに送信できます。これは、攻撃中に盗まれたデータを攻撃者のサーバーに送信するためにも利用できる組み込みのブラウザー オブジェクトです。

ディープリンクに飛び込む

脆弱性自体は、最終的に、アプリによる特定のディープリンクの処理に存在することが判明しました。 Android オペレーティング システムのコンテキストでは、ディープリンクは、モバイル アプリ内の特定のコンポーネントにリンクする特別なハイパーリンクであり、スキームと (通常は)ホスト部分で構成されます。ディープリンクがクリックされると、Android パッケージ マネージャーは、インストールされているすべてのアプリケーションにクエリを実行して、ディープリンクを処理できるアプリケーションを確認し、ハンドラーとして宣言されたコンポーネントにルーティングします。アプリケーションのコンテキスト外のコンポーネントでディープリンクを使用するには、アプリケーションのマニフェストで宣言する必要があります。

ディープ リンク用にアプリのマニフェストにインテント フィルタを追加する例を示すコード
図 5. ディープ リンク用にアプリのマニフェストにインテント フィルターを追加する

上記の図 5 の例では、

  1. ユーザーはリンクhttp://www.example[.]com/gizmosをクリックします。複数のアプリケーションがスキームを処理できるため、システムはダイアログ ボックス (あいまいさダイアログとも呼ばれます) を表示します。これは、下の図 6 に示すようなものです。
  1. example://gizmosの形式のディープリンクは、アクティビティGizmosActivity (この場合、ディープリンク ハンドラーとして宣言されたコンポーネント) に直接ルーティングされます。
Chrome ブラウザまたは DeepLinkingExample という Android アプリを使用してアクションを完了するようユーザーに要求するあいまいなダイアログの画像。また、選択したアプリケーションでアクションを 1 回だけ実行するか、毎回実行するかを選択するようにユーザーに促します。
図 6. あいまいさダイアログ

httpおよびhttpsスキームのあいまいなダイアログを回避するために、アプリケーションは、そのインテント フィルターでautoVerify属性を使用してAndroid アプリ リンクを宣言し、アプリと宣言された URL ドメインとの間の関連付けを検証するようシステムに通知することができます。さらに、アプリケーションのパッケージ名とその証明書の SHA256 フィンガープリントを含む JSON ファイルをhttps://domain.name/.well-known/directory で公開する必要があります。 TikTok for Android は、ドメインm.tiktok.comに対してこの機能を使用します。つまり、特定のドメインに一致するすべてのリンクが、あいまいなダイアログを表示せずにアプリケーションにルーティングされます。

Android マニフェストでエクスポートされるディープリンクに加えて、アプリケーションは内部ディープリンクを使用してコンポーネント間でデータを交換することもできます。 Web ブラウザーなどでアプリケーションの外部から内部ディープリンクを開こうとすると、システムが適切なハンドラーにルーティングできないため、「インテントを解決できません」というエラー メッセージが返されます。

脆弱性の発見

アプリの JavaScript インターフェイスの実装など、脆弱性の悪用を可能にするさまざまなコンポーネントを理解することが重要です。これは、脆弱性自体の影響を決定するためです。特定のディープリンクのアプリの処理を確認しているときに、いくつかの問題を発見しました。これらの問題を連鎖させると、アプリケーションが任意の URL をアプリケーションの WebView にロードするよう強制するために使用できた可能性があります。追加のクエリ パラメータを使用してこの URL を作成することにより、 [編集済み] .bridge.*パッケージによって実装された機能へのフル アクセスを提供する JavaScript ブリッジのインスタンスを挿入することができました。

以下は、パッケージ名がcom.zhiliaoapp.musicallyの TikTok Android アプリケーションを使用して分析した脆弱性の技術的な説明です。 TikTok Android アプリケーションcom.ss.android.ugc.trillにも同じ説明が適用されます。これは、脆弱性が一般的な SDK で見つかったためです。

アプリの内部ディープリンクのトリガー

TikTok for Android は複数のディープリンク スキームを使用します。その一部はマニフェスト経由でエクスポートされますが、一部はアプリケーションによって内部的にのみ使用されます。エクスポートされたものの中で、 https://m.tiktok[.]com/redirectリンクは [redacted ]クラスによって処理され、クエリ パラメータを介してアプリケーションのさまざまなコンポーネントに URI をリダイレクトするために使用されます。

リンクされた Medusa ツールを使用して、ディープリンクとそのターゲット アクティビティを特定する方法を示すコード。
図 7. Medusaを使用してディープリンクとその標的となる活動を特定する

クエリ パラメーターを介して内部ディープリンクをトリガーし、エクスポートされていないアクティビティを呼び出して、アプリケーションの攻撃対象領域を拡大することが可能であると判断しました。 TikTok によると、この内部ディープリンクへのリダイレクトは、追加の懸念を引き起こしません。

概念実証として、特定の非エクスポート スキームを使用してhttps://www.tiktok[.]comをアプリケーションの WebView にロードする URL を作成しました (図 8 を参照)。

TikTok.com の読み込みに成功した TikTok アプリケーションの WebView の画像。アプリの表示はプライバシーのために編集されていますが、WebView は、このブラウザーで TikTok からのすべての Cookie を受け入れるか、すべての Cookie を拒否するように求めるプロンプトを表示します。
図 8. リンクを使用して、内部で使用されるスキームをトリガーし、Tiktok.com をロードします。

[redacted-internal-scheme] ://webview?url=<website>ディープリンクを使用して、クエリ パラメーターを介してCrossPlatformActivity のWebView に URL を読み込むことができますが、アプリケーションは信頼できないホストを拒否するフィルターを適用します。上の図 8 に示すようにTiktok.comドメインが正常に読み込まれているのとは対照的に、下の図 9 は、ドメインExample.comがアプリケーション フィルターによって拒否されていることを示しています。

Example.com を読み込もうとしている TikTok アプリの WebView の画像で、「https://www.example.com このリンクは安全でない可能性があります。コミュニティを保護するために、プラットフォーム上の特定のコンテンツを制限しています」というエラーが表示されます。ユーザーが戻るためのボタン
図 9. [redacted-internal-scheme] ://webview?url=https://www.example[.]com ディープリンクを拒否するアプリケーションのフィルター

フィルタリングはサーバー側で行われ、URL をロードするか拒否するかの決定は、特定の HTTP GET 要求から受信した応答に基づいて行われます。私たちの静的分析は、ディープリンクに 2 つの追加パラメータを追加することで、サーバー側のチェックをバイパスできることを示しました。

アクティビティにアタッチされた WebView は、 Medusa のWebView モジュールを使用して動的に検証した JavaScript ブリッジのインスタンスを作成します。この時点から、 [redacted-scheme] ://webviewスキームのクエリ パラメータに割り当てられた Web サイトは、JavaScript ブリッジへのフル アクセスを持ちます。つまり、Web サイトの JavaScript コードは、 [redacted 】 .bridge.*パッケージです。

公開された機能

WebView に読み込まれた Web ページの JavaScript コードにアクセスできる機能を確認したところ、70 を超える公開されたメソッドが特定されました。私たちが発見した脆弱性など、WebView をハイジャックするエクスプロイトと組み合わせると、これらのメソッドを呼び出して、攻撃者に機能を付与することができます。公開されたメソッドの中には、ユーザーの個人情報にアクセスしたり変更したりできるものもあれば、パラメーターとして指定された任意の URL に対して認証済みの HTTP 要求を実行できるものもあります。さらに、このメソッドは、POST 要求の本文を形成するために使用できる JSON 文字列の形式でパラメーターのセットを受け入れ、ヘッダーを含むサーバーの応答を返します。               

このようなメソッドを呼び出すことにより、攻撃者は次のことができます。

  • 制御されたサーバーへのリクエストをトリガーし、Cookie とリクエスト ヘッダーをログに記録して、ユーザーの認証トークンを取得します。
  • TikTok エンドポイントへのリクエストをトリガーし、JavaScript コールバックを介して応答を取得することにより、プライベート ビデオやプロファイル設定など、ユーザーの TikTok アカウント データを取得または変更します。

つまり、認証された HTTP リクエストを実行できるメソッドのいずれかを制御することで、悪意のあるアクターが TikTok ユーザー アカウントを侵害した可能性があります。

コンセプトの証明

次の概念実証では、攻撃者が標的の TikTok ユーザーに巧妙に細工したリンクを送信します。ユーザーがリンクをクリックすると、動画アップロード認証トークンが攻撃者に送り返され、その後、スクリプトはユーザーの経歴情報を「!!」に変更します。セキュリティ侵害 !!”:

攻撃者が特別に作成した悪意のあるリンクがターゲットの TikTok ユーザーによってクリックされると、攻撃者のサーバーhttps://www.attacker[.]com/pocは JavaScript ブリッジへのフル アクセスを許可され、公開された機能を呼び出すことができます。攻撃者のサーバーは、JavaScript コードを含む HTML ページを返し、ビデオ アップロード トークンを攻撃者に送り返し、ユーザーのプロフィールの略歴を変更します。

ビデオ アップロード認証トークンは、 XMLHttpRequestを介して攻撃者に送り返されます。攻撃者は、以下の図 10 と 11 に示すように、返信本文とヘッダーも受け取ります。

攻撃によって取得されたリクエスト ヘッダーを表すコード
図 10. 攻撃によって取得されたリクエスト ヘッダー
ヘッダーを含むサーバーの応答を表すコード
図 11. ヘッダーを含むサーバーの応答

最後にメッセージ「!!セキュリティ侵害 !!!”ユーザープロファイルの略歴に設定されています:

TikTokユーザーのプロフィールに「!!SECURITY BREACH !!!」と書かれた略歴の画像
図 12. ユーザーのプロファイルの整合性を損なう

JavaScript インターフェイスのベスト プラクティス

このケースと以前の調査で示されているように、プログラミングの観点から見ると、JavaScript インターフェースの使用には重大なリスクが伴います。侵害された JavaScript インターフェイスにより、攻撃者がアプリケーションの ID と権限を使用してコードを実行できる可能性があります。したがって、開発者コミュニティがリスクを認識し、WebView を保護するために特別な予防措置を講じることをお勧めします。

JavaScript インターフェースの使用が避けられない場合は、信頼できるドメインの承認済みリストを使用してアプリケーションの WebView にロードし、悪意のあるまたは信頼できない Web コンテンツのロードを防ぐことをお勧めします。さらに、次の安全なコーディング プラクティスをお勧めします。

  • デフォルトのブラウザーを使用して、アプリケーションの承認済みリストに属していない URL を開きます。
  • 承認済みリストを最新の状態に保ち、含まれるドメインの有効期限を追跡します。これにより、承認済みリストで期限切れのドメインを主張することで、攻撃者が WebView をハイジャックするのを防ぐことができます。
  • URL を信頼できるドメインの承認済みリストと比較および検証するために、部分的な文字列比較方法を使用することは避けてください。
  • ステージまたは内部ネットワーク ドメインを承認済みリストに追加しないでください。これらのドメインは、攻撃者によってスプーフィングされ、WebView を乗っ取る可能性があります。

責任ある開示と業界の協力により、すべてのセキュリティが向上します

攻撃者は、新しい脅威、技術、および攻撃者の機能を利用して、パッチが適用されていない脆弱性や構成ミスを特定して悪用し、悪意のある目的でシステムや機密情報にアクセスするベクトルとして引き続き注目しています。変化する脅威の状況に対応するには、Microsoft だけなく、Microsoftから継続的にセキュリティを向上させるという取り組みの一環として、知識と専門知識を他のデバイスやプラットフォームに拡大する必要があります。

このような共同研究を使用して、プラットフォーム全体の保護テクノロジを改善し、Windows 以外のデバイスに影響を与えるものを含む、既知の脆弱性を持つインストール済みアプリケーションをMicrosoft Defender Vulnerability Managementが検出して警告するようにします。この脆弱性が実際に悪用されていることは認識していませんが、ユーザーはさらに以下のセキュリティ ガイドラインに従って、この問題や同様の問題から防御することができます。

  • 信頼できないソースからのリンクをクリックしない
  • デバイスとインストールされているアプリケーションを常に最新の状態に保つ
  • 信頼できないソースからアプリケーションをインストールしない
  • ユーザーの介入なしにトリガーされた設定変更など、異常なアプリケーションの動作があれば、すぐにベンダーに報告してください。

Microsoft Security Vulnerability Research (MSVR) によるCoordinated Vulnerability Disclosure (CVD) による責任ある開示ポリシーの一環として、2022 年 2 月に TikTok のWeb サイトで指示されているとおりに脆弱性を開示しました。脆弱性CVE-2022-28799は、スコア 8.3 で重大度が高いとすぐに評価され、最初の開示から 1 か月以内にリリースされたアプリの更新バージョンに問題の修正が含まれていました。これらの問題を解決するために迅速かつ効率的に協力してくれた TikTok セキュリティ チームに感謝します。

このケースは、問題を効果的に軽減するために、業界を超えた専門家のコラボレーションを通じて研究と脅威インテリジェンスの共有を調整する能力がどのように必要であるかを示しています。プラットフォーム全体の脅威の数と巧妙さが増し続けているため、使用中のプラットフォームやデバイスに関係なく、ユーザーのコンピューティング エクスペリエンスを保護するために、脆弱性の開示、調整された対応、およびその他の形式の脅威インテリジェンス共有が必要です。マイクロソフトは引き続き、より大きなセキュリティ コミュニティと協力して、脅威に関する調査と情報を共有し、すべての人にとってより良い保護を構築していきます。

ディミトリオス・バルサマラス
Microsoft 365 Defender 研究チーム

参考文献

参考: https ://www.microsoft.com/en-us/security/blog/2022/08/31/vulnerability-in-tiktok-android-app-could-lead-to-one-click-account-hijacking/

Comments

Copied title and URL