Androidに存在する2つの脆弱性を新たに確認。不正請求の恐れ

Android に存在する 2つの脆弱性が新たに確認されました。これらの脆弱性が利用されると、携帯電話やタブレットの特定のメッセージ機能がクラッシュしたり、悪用される可能性があります。1つ目の脆弱性「CVE-2015-3839」を利用すると、攻撃者は不正なメッセージをメッセージアプリに挿入することが可能になります。その結果、アプリがクラッシュし、ユーザはメッセージの送受信ができなくなる恐れがあります。もう 1つの脆弱性「CVE-2015-3840」は、「ショート・メッセージ・サービス(SMS)」や「マルチメディア・メッセージング・サービス(Multimedia Messaging Service、MMS)」の送受信のステータスを改ざんする恐れがあります。結果として、ユーザは不正請求を受ける可能性があります。

2015年7月に確認された「Stagefright」や Android の標準コンポーネント「Mediaserver」に存在する 2つの脆弱性と異なり、今回の 2つの脆弱性は Messaging のコンポーネントに存在します。どちらの脆弱性も、Androidの最新バージョン Android 5.1.1(Lollipop)を含む全バージョンに影響しますが、Google から直接提供されている、カスタマイズされていない OEM のバージョンが最も影響を受けます。こうした「純粋な」バージョンは元からあるメッセージアプリを使用しており、このアプリが脆弱性を抱えているためです。カスタマイズされたバージョンでは、メッセージアプリをカスタマイズしたり、改変するために更新されていると考えられます。

トレンドマイクロは Google にこれらの脆弱性を報告し、脆弱性に対処するための修正プログラムを併せて提案しました。いずれの脆弱性も危険度は「低」と評価されています。弊社は実際の攻撃が行われていないか引き続き監視していきます。

■メッセージアプリをクラッシュさせる「CVE-2015-3839」
この脆弱性は、以前に報告した Android端末を無限に再起動させる脆弱性より、影響範囲が少し限定された脆弱性です。以前の脆弱性と同様に、攻撃者は、必要とされる権限なしにユーザに不正なアプリをインストールさせ、「CVE-2015-3839」を利用します。違いは、この脆弱性を利用して、端末全体ではなく、メッセージアプリだけに「サービス拒否(DoS)攻撃」を実行することです。結果として、ユーザはこのメッセージアプリを使用したメッセージの送受信ができなくなります。

この脆弱性の原因は、メッセージのステータスを更新した際の「NullPointerException(NPE)」にあります。NPE とは Java の例外の 1つです。Android端末は、「SMS-STATUS-REPORT」の「Protocol Data Unit(PDU)」形式でメッセージのステータスを更新するためにテキストメッセージを送信した後、関数「updateMessageStatus」を使用します。しかし、例外を適切に処理しないコードがこの関数にあるため、攻撃者はその脆弱な部分を突いてメッセージアプリをクラッシュさせることができます。

図1:例外を処理できないコードの一部
図1:例外を処理できないコードの一部

アプリをクラッシュさせるために、攻撃者は関数「updateMessageStatus」の null値を確認するコードを回避しなければなりません。回避するために、攻撃者は関数「createfromPdu」を取得します。この関数は、受信した PDU を解析し、メッセージオブジェクトを保存するために利用されます。その結果、新規の「SmsMessage」オブジェクトが返されます。この関数は、メッセージオブジェクト「wrappedMessage」を検証せず、3GPP(GSM)および 3GPP2(CDMA)形式の新規のオブジェクト「SmsMessage」を必ず返します。

図2:新規の「SmsMessage」オブジェクトを返す関数「createfromPDU」
図2:新規の「SmsMessage」オブジェクトを返す関数「createfromPDU」

その結果、「updateMessageStatus」の null値を確認するコードは回避されます。しかし、「wrappedMessage」が null だった場合、「getStatus」を呼び出した場合も NPE のエラーを起こす可能性があります。呼び出し関数「updateMessageStatus」は例外を処理しないため、アプリ全体がクラッシュし、終了します。

図3:「com.android.mms」の NPE のクラッシュスタック
図3:「com.android.mms」の NPE のクラッシュスタック

攻撃者は不正な PDU を挿入するだけでNPE のエラーを起こすことが可能です。弊社では、単純な不正PDU を下記のように「MessageStatusService」に挿入しました。

//Malicious PDU in bytes

{00, 02, 00, 02, D0, 65, 61, 60, 80, 90, 25, 12, 23, 61, 60, 80, 01, 25, 12, 23, 00, FF};

下記の動画は、Android 4.4.4 と 5.1.1 を使用して、この攻撃を実証したものです。

上記は、Android 4.4.4上で実行した「CVE-2015-3839」の「Proof-of-concept(PoC、概念実証型エクスプロイト。実際に有効な攻撃ができることを実証している攻撃コード)」です。

Android 5.1.1 のエミュレータ上で実行された「CVE-2015-3839」の PoC です。

■「CVE-2015-3840」によりアプリを改変。不正請求の恐れ
この脆弱性を利用すると、必要とされる適切な「WRITE_SMS」のパーミッションがなくても SMS や MMS を改ざんすることが可能になります。攻撃者は、権限のない不正なアプリを利用して、Androidのセキュリティモデルに権限昇格の攻撃を実行し、受信した SMS や MMS のステータスや日付を改ざんする恐れがあります。

この脆弱性の原因は、”AndroidManifest.XML” ファイルのサービス「MessageStatusReceiver」にあります。このサービスにより、メッセージのステータスは、受信する SMS-STATUS-REPORT の PDU に基づいて更新されます。パーミッションやインテントの保護がないため、権限のないサードパーティのアプリは、偽の情報を送信し、SMS や MMS の情報を改ざんすることが可能になります。

脆弱性を抱えるレシーバ。メッセージのステータスを更新するために悪用される可能性がある
脆弱性を抱えるレシーバ。メッセージのステータスを更新するために悪用される可能性がある

結果として、攻撃者は受信メッセージを改ざんして「失敗」のステータスに変更し、ユーザにメッセージを再送させることができます。より深刻な事例としては、攻撃者は不正アプリを利用してメッセージを監視し改ざんして、ユーザに高額料金が発生する電話番号にメッセージを送信させ続け、ユーザもその通信料を請求する可能性があります。

この脆弱性を利用するために、弊社は以下の不正な PDU を挿入し、脆弱性を抱えるレシーバに送信しました。

  • SMS のステータスを「受信」とするために、不正な PDU を挿入

// malicious PDU in bytes

{00, 02, 00, 02, D0, 65, 61, 60, 80, 90, 25, 12, 23, 61, 60, 80, 01, 25, 12, 23, 00}

  • SMS のステータスを「失敗」とするために、不正な PDU を挿入

// malicious PDU in bytes

{00, 02, 00, 02, D0, 75, 71, 60, 80, 70, 42, 34, 56, 61, 60, 80, 01, 25, 14, 15, 40}

下記の動画は、Android 4.4.4 と 5.1.1 を使用して、この攻撃を実演したものです。

Android 4.4.4上で実行した「CVE-2015-3840」の PoC です。

Android 5.1.1のエミュレータ上で実行した「CVE-2015-3840」の PoC です。

■トレンドマイクロの対策
Android端末への修正プログラムは基本的に断片的なため、ユーザは修正プログラムが公開されるまで別のメッセージアプリを使用することを検討して下さい。また、今回の脅威から保護するモバイル端末向けのセキュリティ対策製品をインストールするのも良いでしょう。

トレンドマイクロの製品は、攻撃を検知し、この脆弱性からユーザを保護します。弊社のモバイル環境総合セキュリティ対策「Trend Micro Mobile Security」やクラウド型の「Mobile App Reputation」は、「CVE-2015-3839」を「AndroidOS_MsgDoS.A」、「CVE-2015-3840」を「AndroidOS_MsgCrack.A」としてそれぞれ検出対応します。

■脆弱性情報公開までのタイムライン
弊社は、今回の脆弱性を Google に報告しています。以下はその時系列です。

  • 6月4日:Google に脆弱性を報告
  • 6月7日:Google は脆弱性を確認し、「CVE-2015-3839」および「CVE-2015-3840」を割り当て
  • 7月20日:脆弱性を修正するコードを Google に提供
  • 8月7日:Google は修正プログラムを受領。AOSP の masterブランチに追加

参考記事:

 翻訳:品川 暁子(Core Technology Marketing, TrendLabs)