内部告発サイトWikiLeaksによる最近の暴露情報のうち、特に懸念されているのは、エンドツーエンドで暗号化されたメッセージング・アプリケーションでのやり取りが、政府機関によって盗み見されている可能性がある、という点です。現在この情報が事実であると立証されているわけではありませんが、WhatsAppやTelegramを利用する多くのユーザは、この指摘に不安を感じていることでしょう。両サービスとも、プライバシー保護のためにエンドツーエンドの暗号化を採用しているからです。エンドツーエンドの暗号化は、本来、メッセージをやり取りする当事者以外はメッセージにアクセスできないようにすることを目的としています。

しかし今回、同じ暗号化メカニズムに起因する別の深刻な脆弱性がチェック・ポイントのセキュリティ・チームによって発見されました。問題が確認されたのは、両メッセージング・サービスのオンライン・プラットフォーム、WhatsApp WebとTelegram Webです。どちらもオンライン版は、ユーザのデバイスと完全に同期され、ユーザが送受信したすべてのメッセージが反映されます。

この脆弱性を悪用すると、いずれのブラウザであろうと、ユーザ・アカウントを完全に乗っ取り、個人およびグループの会話、写真、動画、その他の共有ファイル、連絡先情報などにアクセス可能となります。つまり、攻撃者は、ユーザの写真をダウンロードしてオンラインに投稿する、ユーザになりすましてメッセージを送信する、身代金を要求する、友人のアカウントを乗っ取るなどの不正活動を行うことができるのです。

攻撃のデモを見る(WhatsAppTelegram

この脆弱性を悪用する攻撃者は、まず、不正なコードを埋め込んだ一見無害なファイルを標的のユーザに送信します。ユーザにファイルを開かせるため、そのユーザの関心を引くような内容で偽装している可能性もあります。ユーザがファイルを開くと、コードが実行され、ユーザ・データが保存されたWhatsAppおよびTelegramのローカル・ストレージに攻撃者がアクセスできるようになります。攻撃者は、この段階でユーザのアカウントおよびアカウント・データへのフル・アクセス権を取得します。攻撃者が、同様の不正なファイルを連絡先の全ユーザに送信した場合、WhatsAppおよびTelegram全体に攻撃が拡大するおそれがあります。

今回の脆弱性が発覚するまで、WhatsAppおよびTelegramのメッセージは、検証処理の前に暗号化されていました。つまり、メッセージの内容を検査して、不正なコンテンツの送信を未然に防止できる状態になっていなかったのです。

攻撃の手口

チェック・ポイントは、2017年3月8日に、この脆弱性に関する情報をWhatsAppおよびTelegramのセキュリティ・チームに開示しました。WhatsAppは脆弱性の存在を確認し、翌3月9日に全世界のWebクライアントの修正を完了しています。チェック・ポイントの製品脆弱性調査担当責任者を務めるオーデッド・ヴァヌヌ(Oded Vanunu)は、「WhatsAppは、責任を持って速やかに、全Webクライアントの脆弱性に対処してくださいました」と述べています。なお、WhatsApp Webについては、確実に最新バージョンが読み込まれるよう、Webブラウザを再起動することをお勧めします。Telegramは現在、脆弱性への対応作業を進めているとのことです。

脆弱性の修正後は、暗号化の前にコンテンツが検証され、不正なファイルの送信は未然にブロックされるようになります。

セキュリティを強化するためのヒント

WhatsAppはすでに脆弱性を修正し、Telegramも修正を進めていますが、今回の問題に限らない一般的な対策として、次の予防策の実施をお勧めします。

  1. WhatsAppやTelegramから定期的にログアウトする。この結果、アカウントをホストしているデバイスを制御し、好ましくないアクティビティを終了させることができます。
  2. 見知らぬユーザから送られてきたファイルやリンクを安易に開かない。

WhatsAppは、10億人以上のユーザ数を誇る、世界で最も広く利用されているインスタント・メッセージング・サービスです。WhatsAppのWebバージョンは、すべてのWebブラウザと、Android、iPhone(iOS)、Windows Phone 8.x、BlackBerry、BB10、Nokiaのスマートフォンなど、WhatsAppがサポートするすべてのプラットフォームに対応しています。

Telegramの月間アクティブ・ユーザ数は1億人以上、送受信されているメッセージ数は1日あたり150億通に上ります。クラウド・ベースのモバイルおよびWebメッセージング・アプリであるTelegramは、サービス提供にあたり、セキュリティとスピードを重視しています。

チェック・ポイントは、2015年9月にも、WhatsApp Webに別の脆弱性を発見しています。この脆弱性を悪用すると、不正なコードを埋め込んだ一見無害なvCardをWhatsAppのユーザに送信できます。この脆弱性は、今回同様、チェック・ポイントによる報告後、速やかに修正されています。

今回見つかった脆弱性の技術的な詳細については、Telegramによる対応が終わり次第、開示します。

技術的な詳細情報 - WhatsApp

WhatsAppのファイル・アップロード機能は、Microsoft OfficeやPDF、音声、動画、画像など複数のドキュメント・タイプをサポートしています。

サポート対象のファイルをアップロードすると、添付ファイルとしてWhatsAppクライアントに送信されます。

今回、チェック・ポイントの調査チームは、正規のプレビュー画像を含む不正なHTMLファイルを使用して、ファイル・アップロード機能の制限を回避する方法を発見しました。標的のユーザに不正なファイルを開かせることが可能で、そのアカウントを乗っ取ることができます。

ユーザが問題のファイルをクリックすると、WhatsApp Webクライアントは、FileReader HTML 5 APIコールを使用して、ファイル・コンテンツを含む一意のBLOB URLを生成し、そのURLを開きます。

WhatsAppに対するこの攻撃は、次のように段階的に実行されます。

まず、プレビュー画像を含む次のような攻撃用HTMLファイルを作成します。

WhatsApp Webクライアントは、サポート対象のドキュメント・タイプをクライアント変数W["default"].DOC_MIMESに格納します。この変数には、Webクライアントが使用するサポート対象のMIMEタイプを格納できます。

WhatsAppサーバに送信されるのは暗号化されたファイルであるため、この変数に「text/html」などの新たなMIMEタイプを追加すると、クライアントでの制限を回避して不正なHTMLファイルをサーバにアップロードできます。

不正なファイルのMIMEタイプをクライアント変数に追加した後、encryptE2Media関数でファイル・コンテンツを暗号化し、その結果をBLOBとしてWhatsAppサーバにアップロードします。

この際、クライアント変数に手を加えてファイル名やファイル拡張子を変更し、プレビュー画像を工夫すると、ユーザが不審に思わずにクリックする可能性が高くなります。

このファイルを受信すると、アプリケーションでは次のように表示されます。

ユーザがファイルをクリックすると、BLOBオブジェクト以下の「funny cat」の画像が表示されますが、その実体はweb.whatsapp.com以下のhtml5 FileReaderオブジェクトです。これにより攻撃者は、web.whatsapp.com以下のブラウザ・リソースにアクセスできるようになります。

ユーザが何もクリックしなくても、ページを表示するだけで、ローカル・ストレージのデータが攻撃者に送信され、アカウントを乗っ取られます。

この処理を行うためには、新しいデータが保存されていないかどうかをバックエンドで2秒おきに確認し、攻撃者のローカル・ストレージと標的のローカル・ストレージを置き換えるJavaScript関数を作成します。

コードの抜粋を次に示します。

このコードにより、攻撃者は標的のアカウントにリダイレクトされ、アカウントのすべてのデータにアクセスできるようになります。

WhatsApp Webでは、クライアントが同時に複数のアクティブ・セッションを確立することはできないため、攻撃者が標的のアカウントを乗っ取ると、ユーザには次のメッセージが表示されます。

しかし、次のようなJavaScriptコードを追加すれば、この制限を回避できます。

不正なHTMLファイルにより、クライアントのブラウザ・ウィンドウが機能しなくなり、攻撃者は、難なくアカウントを乗っ取ることができます。ただし、攻撃者が標的のアカウントにアクセスできるのは、標的のユーザがログアウトするまでの間となります。ブラウザを閉じても、攻撃者はアカウントからログアウトされません。引き続き、ログイン状態を維持できます。

技術的な詳細情報 - Telegram

Telegramでは、Webアプリケーションで複数のドキュメント・タイプの送信をサポートしていますが、ブラウザのFileSystemセクションに格納されるのは、画像および動画のドキュメント・タイプに限られます。

今回、チェック・ポイントの調査チームは、Telegramのアップロード・ポリシーを回避し、動画ファイルのMIMEタイプ「video/mp4」を含む不正なHTMLファイルをアップロードする方法を発見しました。アップロードした動画は、Telegramサーバの暗号化チャネル経由で標的のユーザに送信することができます。ユーザがブラウザの新規タブで問題の動画を開くと、再生が始まると共に、そのユーザのセッション・データが攻撃者に送信されます。

Telegramに対するこの攻撃は、次のように段階的に実行されます。

まず、動画データを含む次のような攻撃用HTMLファイルを作成します。

Telegramのクライアントは、ファイルのMIMEタイプをtオブジェクト以下に格納し、このMIMEタイプが動画または画像のMIMEタイプと一致するかどうかをアップロード・プロセス中に確認します。MIMEタイプが一致した場合、クライアントはファイルをFileSystem URI以下に格納します。

Telegramのサーバに送信されるのは暗号化されたファイルであるため、MIMEタイプを「video/mp4」に変更すると、クライアントでの制限を回避して不正なHTMLファイルを動画としてサーバにアップロードできます。

不正なファイルのMIMEタイプを変更した後、暗号化されたファイルをTelegramサーバにアップロードします。

この結果、不正なペイロードを含む一見無害な動画がアップロードされます。

ユーザが動画を再生すると、ブラウザ・メモリのweb.telegram.org以下にこのHTMLファイルがアップロードされます。web.telegram.org URI以下のFileSystem URIにあるブラウザのリソースにアクセスするためには、ユーザがこの動画を新規タブで開く必要があります。

新規タブで動画を表示すると、ローカル・ストレージのデータが攻撃者に送信され、アカウントを乗っ取られます。

この処理を行うためには、WhatsAppの場合と同様に、新しいデータが保存されていないかどうかをバックエンドで2秒おきに確認し、攻撃者のローカル・ストレージと標的のローカル・ストレージを置き換えるJavaScript関数を作成します。

このコードにより、攻撃者は標的のアカウントにリダイレクトされ、アカウントのすべてのデータにアクセスできるようになります。

Telegramでは、アクティブなセッションを同時にいくつでも確立できるため、ユーザがアカウントの乗っ取りに気付くことは困難です。