エクスプロイト&脆弱性
Androidの脆弱性「CVE-2019-11932」、多数の未修正アプリを「Google Play」で確認
Androidアプリ「WhatsApp」に存在する脆弱性「CVE-2019-11932」は、2019年10月2日、「Awakened」と呼ばれるリサーチャによって初めて公開されました。細工した不正なGIFファイルを使用することによってリモートでコードの実行が可能になるこの脆弱性は、更新されたWhatsAppのバージョン2.19.244で対処済みとなりました。
Androidアプリ「WhatsApp」に存在する脆弱性「CVE-2019-11932」は、2019年10月2日、「Awakened」と呼ばれるリサーチャによって初めて公開されました。細工した不正なGIFファイルを使用することによってリモートでコードの実行が可能になるこの脆弱性は、更新されたWhatsAppのバージョン2.19.244で対処済みとなりました。しかし、この脆弱性の根本的な問題は、Android用画像読み込みライブラリのパッケージである「android-gif-drawable」に含まれる「libpl_droidsonroids_gif.so」というライブラリに存在します。つまり、問題はWhatsAppだけのものではない可能性がある、ということです。ライブラリ自体の欠陥についてもすでに対処されているものの、多くのアプリが依然として古いバージョンのライブラリを使用しているため、リスクにさらされたままとなっています。
■脆弱性「CVE-2019-11932」が及ぼす影響
このダブルフリー脆弱性はアプリが使用するライブラリに依存し、修正のためにはアプリ側が更新を行う必要があります。このため、いまだ脆弱なライブラリを利用しているアプリがどれほど残っているか調査した結果、相当数のアプリが依然として脆弱性を抱えていることが判明しました。正規マーケットであるGoogle Playではこの脆弱性を持つアプリケーションが日本でも使用されているソーシャルメディアアプリなど3,000以上確認されました。 またその他のサードパーティのアプリストアでも、同様のアプリが存在することが確認されました。
図1:脆弱性が存在すると考えられるアプリの数
トレンドマイクロは検証のために、脆弱性が存在する可能性があるアプリが使用する「libpl_droidsonroids_gif.so」を解析したところ、更新プログラムが適用されていない脆弱なバージョンが使用されていることが確認されました。また、解析ツール「IDA Pro」を使用して脆弱なライブラリを抽出した結果、以下のSHA256ハッシュが明らかになりました。
- F613296C6076DF86671D1B51739A23802169541B1057D40B2C61BF583032C9F9
次にコードを調査し、脆弱性が存在することを確認しました。以下に示すように、「reallocarray」関数が呼び出される前にサイズのチェックはされません。アプリが、サイズが「0」である3つのフレームを持つGIFを処理する場合でもダブルフリーの脆弱性を引き起こします。
図2:「reallocarray」関数が呼び出される前にサイズがチェックされていないことが確認できるコード
■脆弱性攻撃の実証実験ビデオ
以下は、この脆弱性攻撃の実証実験ビデオです。画面の左側は攻撃対象デバイス、右側は攻撃者のシステムです。前もって作成した不正なGIFファイルが、攻撃対象デバイスに送信されます。ユーザがGIFを受信してギャラリーを開くと、脆弱性が利用され、デバイスの /system/etc/hosts 内のコンテンツが返されます。攻撃者はどのようなものでも任意のファイルのコンテンツを返すことが可能になるため、シェルを返すことによってデバイスを制御することも可能になります。
■技術的詳細
この脆弱性はどのようにして発生するのでしょうか。その技術的詳細を以下に解説します。今回の脆弱性はGIFファイルの取り扱いが適切でないために発生します。GIFファイルに含まれている複数がエンコードされたフレームをデコードし、保存する際にrasterBitsという名前のバッファが使用されます。このバッファは特定の条件の時にのみ再割り当てされ再度解放される、これがダブルフリー脆弱性の要因となります。 GIFファイルが「GifInfo *info」オブジェクトの割り当てによって解決されると、保存されたフレームが1つずつ読み取られます。フレームはすべて、「info->rasterBits」ポインタ、「call reallocarray(info->rasterBits,size,)」関数、「realloc」関数を利用して読み取られ、フレームサイズが「0」でない場合、「info->rasterBits」ポインタは消去されます。しかしサイズが「0」の場合、「realloc」は失敗し、「info->rasterBits」ポインタは消去されずに解放されます。たとえば、最初のフレームを取得してサイズが「0」でなければ、新しい「info->rasterBits」ポインタが取得されます。続く2つのフレームサイズが両方とも「0」の場合、「reallocarry()」関数は同じ「info->rasterBits」ポインタを2度解放し、これによりダブルフリーの脆弱性が引き起こされる可能性があります。問題のコードは、ライブラリ「libpl_droidsonroids_gif.so」を逆コンパイルすることによって確認できます。
図3:フレーム取得中のメモリ割り当てのソースコード
変数v25は、フレームの横幅と縦幅であるv24*v23で表されています。ただし、値が「0」であるかどうかはチェックしません。resultが「0」の場合、失敗して戻ります。それ以外の場合は、v3+88に値を渡します。これは、次回「reallocarray」関数が呼び出されたときの第一引数になる可能性があります。
図4:「reallocarray」関数の定義
「realloc」関数と他のいくつかのチェックで「reallocarray」関数が形成されています。
図5:「realloc」関数の直接呼び出し
「a2」が「0」の場合、「realloc」関数が直接呼び出されます。「realloc」関数はメモリ領域を確保しなおすための関数です。Androidでダブルフルーのメモリ領域がある場合、同じフレームサイズで「malloc」関数を2回呼び出すと、同じアドレスが返ります。以下は、この脆弱性を検証するために作成した、ダブルフリーの脆弱性とそれを突くエクスプロイトコードのサンプルコードです。
図6:テスト用コードのサンプルとその結果
ここで、「a1」と「a2」は同じアドレスを再利用します。これと同様の仕組みで、WhatsApp内の「ギャラリー」を開くと、ギャラリーのプロパティによりGIFファイルが二度解析され、二回表示されます。これは、「GifInfo」が2度割り当てられることを意味します。 GIFファイルに3つのフレームがある場合、最初のフレームの横幅と縦幅は0にせずに、続く2つのフレームのサイズを0にします。こうして最初の画像表示でダブルフリーが発生し、次の画像が2度表示されます。「GifInfo」が再割り当てされますが、そのような場合、解放された同じアドレスが再利用されます。最初のフレームは「GifInfo」の構造体を上書きし、これによって「GifInfo->rewindFunction」の場所に、「ROP (Return-Oriented-Programming)」ガジェットアドレスを指定すると、PCの制御が可能になります。 「GifInfo->rewindFunction」ポインタは、「GifInfo」構造体が2回目に解析されるときに上書きされ、これにより、指定された任意のコードの実行が可能になります。トレンドマイクロは、Google Play上で数百万回ダウンロードされていた2つのアプリについて、概念実証(Proof of Concept、PoC)コードを解析した結果、アプリは異常終了しました(以下はそのデバッグ結果)。
図7:異常終了したアプリのデバッグ結果
図8:アプリ異常終了時のメッセージ
最新版の「libpl_droidsonroids_gif.so」では、図9のバイナリコード分析ツール「BinDiff」による解析結果からもわかるように、問題の脆弱性は修正されています。左はWhatsapp 2.19.216、右はWhatsapp 2.19.291です。アプリは、「reallocarray」関数に渡された第二引数をチェックします。
図9:BinDiffによる解析結果
更新版であるWhatsapp 2.19.291には、組み込みのチェックが追加されています。 「width * height(横幅*縦幅)」が0である場合、「free」関数が呼び出され、v9がnullになります。このv9は、「info->rasterBits」で表されています。
図10:パッチ済みのソースコード
■被害にあわないためには
「CVE-2019-11932」の脆弱性については、その修正プログラムが公開されているにも関わらず、多数のアプリが依然として脆弱性を有したままであり、多くのAndroidユーザを危険にさらしています。脆弱性を持つアプリを誤ってインストールした場合、攻撃者によってこの脆弱性が利用されデバイスを制御される可能性があり危険です。アプリの開発者は、「libpl_droidsonroids_gif.so」を使用している場合、ユーザへのリスクとならないように更新する必要があります。
■トレンドマイクロの対策
トレンドマイクロでは、モバイル環境での総合セキュリティ対策として、個人利用者向けには「ウイルスバスターモバイル」、法人利用者向けには「Trend Micro Mobile Security™」を提供しています。これらの製品ではトレンドマイクロのクラウド型セキュリティ基盤「Trend Micro Smart Protection Network(SPN)」の機能である「Mobile App Reputation(MAR)」技術や「Web レピュテーション(WRS)」技術により、不正/迷惑アプリの検出や、関連する不正 Webサイトのブロックに対応しています。 「Trend Micro Mobile Security」は、モバイルデバイス、アプリケーション、データの可視化と制御を標準装備の単一コンソールで実現するとともに、脆弱性攻撃や不正アクセスから端末を保護し、マルウェアや不正なWebサイトをブロックします。 参考記事:
- 「Patched GIF Processing Vulnerability CVE-2019-11932 Still Afflicts Multiple Mobile Apps」 By Lance Jiang and Jesse Chang
翻訳: 室賀 美和(Core Technology Marketing, Trend Micro™ Research)
記事構成:岡本勝之(セキュリティエバンジェリスト)