スマートフォン解析 top

TOP > タイガーチームセキュリティレポート > black hat USA 2013 テクニカルレポート ~その2(1)~

タイガーチームセキュリティレポート

black hat USA 2013 テクニカルレポート ~その2(1)~

BlackHat USA 2013のプレゼン紹介の第二弾です。Jeff Forristal氏のAndroidに関するプレゼンを聴講してきました。

タイトル:Android: one root to own them all

同氏が発見したAndroidのいわゆるMaster Key脆弱性の詳細に関する発表です。この脆弱性は、正当に署名されたapkファイルの署名を壊すことなくapkファイルを改竄することができるというものです。
今回のレポートは長くなりそうなので、数回に区切って発表内容をもとにMaster Key脆弱性の詳細と関連する話題を紹介したいと思います。


彼がMaster Key脆弱性を発見するきっかけは、Play Storeにある"Androidアプリに変更を加えてGPS座標を改竄する"という思いつきからだったようです。そのためには署名を壊さずにコードを変更する方法が必要でした。そして彼は様々な方法を試しているうちに、偶然に(?)Master Key脆弱性に行き当たったようです。

Master Key脆弱性を理解する上ではapkのベースとなるzipの構造を知ることが必要です。zipはファイルの先頭から連続するいくつかのFile Entryと末尾のCentral Directoryからなります。各エントリとCentral Directoryにはヘッダがあり、ヘッダにはfile name、file name length等のフィールドが含まれています。

彼が発見したのは、このzip構造に重複するfile nameのエントリがあった時に署名の検証の対象となるのはファイルの末尾に近い方のエントリで、実際にアプリとして実行されるのはファイルの先頭に近い方のエントリであるということです。つまり、オリジナルapkファイルに含まれるclasses.dexの前に別のclasses.dexのエントリを追加すれば署名の検証に成功し、追加したコードを実行可能になるということです。


-この問題の原因-

Androidにおけるアプリのインストールは、Package Installerを使うにしろadb shellを使うにしろ、インストールの処理自体は、Package Managerとinstalldが協調して行っています。

この処理の中にはapkの署名の検証が含まれますが、これを行っているのはPackage Managerです。

Package Managerは、apkファイルをparseする処理の中でJarFileクラスを使ってzip構造を読み込み、個々のエントリをJarVerifierクラスで検証します。

JarFileクラスの親となるZipFileクラスは、Central Directoryをメモリ上に読み込む際にfile nameをkeyとするLinkedHashMapに個々のエントリを格納します。

ここでfile nameの重複はチェックされることなく、先頭から末尾に向かってエントリが順番にputされるため、重複があった場合には上書きされて最後にputしたものだけが生き残ります。
ZipFile.javaより抜粋

署名の検証のあと、Package Managerは、Unix domain socketの/dev/socket/installd経由でinstalldにコマンドを送り、installdが実行ファイル/system/bin/dexoptを起動してapkファイルに含まれるclasses.dexを処理します。

commands.cより抜粋

dexoptは、dexのdalvik bytecodeの検証と最適化を行うコマンドです。

dexoptは、apkファイルのzip構造の個々のエントリをHashTableとして読み込みますが、file nameの重複するエントリがあった場合にエントリを上書きしないため、 インストールするapkファイルにclasses.dexのエントリが重複していた場合、最初のエントリから最適化されたdex(odex)を生成します。

Androidアプリとして実行されるのはdexそのものではなく最適化された後のodexです。

このように、Androidの中にはJava版とC++版のzip parser実装があり、重複エントリが含まれる場合の挙動が一致していないことがわかります。これがこの問題の原因と言えそうです。


参考情報:
[1] Black Hat USA 2013 | Archives
http://www.blackhat.com/us-13/archives.html#Forristal
[2] In Depth : Android Package Manager and Package Installer
http://www.kpbird.com/2012/10/in-depth-android-package-manager-and.html
[3] Zip (file format)
http://en.wikipedia.org/wiki/Zip_%28file_format%29


次回は、この問題の影響について記載したいと思います。お楽しみに!


タイガーチームメンバー 塚本 泰三