26
CVE-2013-4787(Master Key Vulnerability) & Zip implementation of Android Masata NISHIDA AVTOKYO2013.5 (16th Feb. 2014) 日本語版 http://www.flickr.com/photos/bcostin/2619263350/

AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

  • Upload
    -

  • View
    2.534

  • Download
    4

Embed Size (px)

DESCRIPTION

English version is here. http://www.slideshare.net/MasataNishida/avtokyo20135-detail-of-cve20134787

Citation preview

Page 1: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

CVE-2013-4787(Master Key Vulnerability) & Zip implementation of Android

Masata NISHIDA AVTOKYO2013.5 (16th Feb. 2014)

日本語版

http://www.flickr.com/photos/bcostin/2619263350/

Page 2: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

自己紹介

• ニシダマサタ (西田雅太)

• セキュアブレイン所属

• 普段は解析・研究よりもコード書いてる

• Rubyist

• @masata_masata

�2

Page 3: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

Agenda

• CVE-2013-4787のソースコード的解説

• AndroidのZip周りの実装の微妙な点の紹介

�3

Page 4: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

CVE-2013-4787 Master Key Vulnerability

�4 http://www.flickr.com/photos/plaisanter/5344873860/

Page 5: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

CVE-2013-4787 Master Key Vulnerability

http://bluebox.com/corporate-blog/bluebox-uncovers-android-master-key/�5

• Android OSの脆弱性

• 署名を変更せずに正規のアプリの中に任意の実行コードが挿入できてしまう

⇒すげー影響でかい & ユーザは防ぎようがない...

Page 6: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

�6

これ、アカンやつや!

Page 7: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

Keywords

• Apkファイル = Zipファイル

• Zipファイルのフォーマット

• Apkの署名確認

�7 http://www.flickr.com/photos/mrcam/206628965/

Page 8: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

APK File (Android Application Package)

APKファイルはZipファイル

必ずDalvik VMの実行ファイルとマニフェストファイルを含む

sample.apk (zipファイル)

classes.dex

AndroidManifest.xml

�8

DEXファイル

(Java実行コード)

マニフェストファイル

Page 9: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

Zip Format

�9

central directory file header

central directory file header

End of central directory record

local file header

File data

local file header

File data

Local File Header (ファイル情報)

File Data (圧縮データ)

Central Directory File Header

ファイル名、圧縮前後のサイズ

ファイルデータへのオフセット値

圧縮方式とか

Page 10: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

Androidの署名確認

• 全てのアプリには署名がしてある

• Zipに含まれた各ファイルに対して署名してある

• 署名した後で入れ替えられない

• アプリインストール時に署名を確認する

�10 http://www.flickr.com/photos/gearys/276917907/

Page 11: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

�11

ここで、Zipエントリーに複数の同じ名前のファイルが含まれるパターンを考える

Page 12: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

APK File duplicated files

sample.apk (zipファイル)

classes.dex

AndroidManifest.xml

�12

classes.dex

AndroidManifest.xml

Zipファイルに同じファイル名のエントリーが

存在することは、仕様上問題ない...はず

あとは、Zipを解釈する実装側の問題

Page 13: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

APK File duplicated files

sample.apk (zipファイル)

classes.dex

AndroidManifest.xml

�13

classes.dex

AndroidManifest.xml

偽物

偽物

本物

本物

Apkの中に偽物の実行コードとマニフェストを挿入してインストールしてみると...

Page 14: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

�14

元の署名のままで、別の実行コードを含んだアプリが作れてしまう!

Page 15: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

なんでこんなことが起こるか?

• Android OSに複数のZipアーカイバ実装がある

• 署名チェック → java.util.zip

• アプリインストール → C++実装

• frameworks/native/libs/utils/ZipFileRO.cpp

• dalvik/libdex/ZipArchive.cpp

�15

Zipエントリー内に重複エントリーがあったときの挙動の違いが原因

Page 16: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

�16

ZipのCentral Directory File Headerをパースする部分のソースを読んでみる

http://www.flickr.com/photos/ajstarks/4196202909/

Page 17: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

ZipFileRO & libdex/ZipArchive

• ZipFileROとlibdex/ZipArchiveはほとんど似たような実装

• Central Directory File Headerをパースして、順繰りにファイル名をハッシュテーブルに詰めていく

�17

Page 18: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

bool ZipFileRO::parseZipArchive(void)!{! :! :! const unsigned char* ptr = cdPtr;! for (int i = 0; i < numEntries; i++) {! :! :! unsigned int fileNameLen, extraLen, commentLen, hash;!! fileNameLen = get2LE(ptr + kCDENameLen);! extraLen = get2LE(ptr + kCDEExtraLen);! commentLen = get2LE(ptr + kCDECommentLen);!! /* add the CDE filename to the hash table */! hash = computeHash((const char*)ptr + kCDELen, fileNameLen);! addToHash((const char*)ptr + kCDELen, fileNameLen, hash);!! ptr += kCDELen + fileNameLen + extraLen + commentLen;! :! :! }! :! :!}

�18

ファイル名からハッシュ値の計算

ハッシュテーブルへの追加

Page 19: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

ZipFileRO & libdex/ZipArchive

�19

void ZipFileRO::addToHash(const char* str, int strLen, unsigned int hash)!{! int ent = hash & (mHashTableSize-1);!! /*!     * We over-allocate the table, so we're guaranteed to find an empty slot.!     */! while (mHashTable[ent].name != NULL)! ent = (ent + 1) & (mHashTableSize-1);!! mHashTable[ent].name = str;! mHashTable[ent].nameLen = strLen;!}

hash値が重複していたら、次のhash値が空いているか調べて入れる名前の重複 → 先勝ち

Page 20: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

JavaのZip実装

�20

public class ZipFile implements Closeable, ZipConstants {!! private final LinkedHashMap<String, ZipEntry> mEntries = new LinkedHashMap<String, ZipEntry>();!! private void readCentralDir() throws IOException {!! ! :!! ! :! RAFStream rafStream = new RAFStream(raf, centralDirOffset);! BufferedInputStream bufferedStream = new BufferedInputStream(rafStream, 4096);! byte[] hdrBuf = new byte[CENHDR]; // Reuse the same buffer for each entry.! for (int i = 0; i < numEntries; ++i) {! ZipEntry newEntry = new ZipEntry(hdrBuf, bufferedStream);! mEntries.put(newEntry.getName(), newEntry);! }! }!!}

ファイル名をキーとしてHashMapにZipEntryをセットしている.

ファイル名が重複 → チェックしないで上書き → 後勝ち

Page 21: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

…ということで、

• 署名チェック → 後勝ち

• 後ろのZipエントリーが使われる

• 実際のインストール → 先勝ち

• 前のZipエントリーが使われる

�21 http://www.flickr.com/photos/49121171@N00/6831724767/

Page 22: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

�22

本来のclasses.dexのzipエントリーの前に他のclasses.dexを入れれば、そっちがインストールされる!!

http://unsplash.com/post/57711421529/download-by-may-pamintuan

Page 23: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

Patch

重複エントリーがあったら、例外投入というJava側の修正

Android security bug 8219321

�23

Page 24: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

おまけ:Zip周りの怪しい点

http://www.flickr.com/photos/26207806@N00/1315037834/�24

Page 25: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

Zip周りの怪しい点 〜話したかったこと〜

• インストール時にZip(Apk)のファイルヘッダをあまりちゃんと見ていない話

• encryptフラグの無視

• compression methodは非圧縮かDeflate圧縮で扱われる

�25

Page 26: AVTOKYO2013.5 CVE-2013-4787(Master Key Vulnerability)のソースコード的解説

�26