android dex format & diff (第4回マルウェア解析勉強会)

38
Android DEX Format同じファミリーの AndroidマルウェアのDEX差分 ニシダマサタ 2013/02/23 4回マルウェア解析勉強会

Upload: -

Post on 14-Jul-2015

2.092 views

Category:

Technology


1 download

TRANSCRIPT

Android DEX Formatと同じファミリーの

AndroidマルウェアのDEX差分

ニシダマサタ

2013/02/23

第4回マルウェア解析勉強会

自己紹介

ニシダマサタ( @masata_masata )

• セキュアブレイン

• Developer (≠ Researcher, Analyst)

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

第4回マルウェア解析勉強会 2

今日のお話

1. Android実行コード(DEX)のフォーマット

2. 同じファミリーのマルウェアのDEX差分

第4回マルウェア解析勉強会 3

マルウェアの解析手法

多分、皆さんが興味があるであろう静的解析とかにはあまり関係のないお話です

ゴメンナサイm(_ _)m

DEX FORMAT第4回マルウェア解析勉強会 4

(Photo: Dalvik By floheinstein)

DEX File Section

第4回マルウェア解析勉強会 6

header

string_ids

type_ids

proto_ids

field_ids

method_ids

class_defs

data

link_data

magic number, check sum…各セクションのオフセット

各種IDリスト

クラスの定義

データ領域 class data code item (instructions) string data debug info …

ad

dre

ss

DEX Header

• magic: “dex\a035\0”

• checksum: Adler-32形式

• signature: SHA-1ハッシュ

• filesize

• …

• Section Sizes and Offsets

– string_ids_size, string_ids_off …

第4回マルウェア解析勉強会 7

headerstring_idstype_ids

proto_idsfield_ids

method_idsclass_defs

data

link_data

DEX ID lists

• string_ids– 文字列データへのoffset (data section)

• type_ids– すべての型名の定義 (class, array, primitive)

– 型名→ string_ids

• proto_ids– method prototype identifiers list– return type index, parameters offset

• field_ids– class index, type index, name index

• method_ids– class index, proto index, name index

第4回マルウェア解析勉強会 8

headerstring_idstype_ids

proto_idsfield_ids

method_idsclass_defs

data

link_data

DEX Class Definitions

• class index– type_idsのindex

• access flags– private, public, static, final …

• superclass index– type_ids のindex

• interfaces offset

• class data offset– クラスの内部的な情報へのoffset– data sectionの中

第4回マルウェア解析勉強会 9

headerstring_idstype_ids

proto_idsfield_ids

method_idsclass_defs

data

link_data

DEX Data Section

• class data item– classのフィールド、メソッド情報

• code item– メソッドごとに定義される– instructions →命令列– try-catch handler →例外処理

• string data item– 文字列データ (MUTF-8)

• debug info itemなど

第4回マルウェア解析勉強会 10

headerstring_idstype_ids

proto_idsfield_ids

method_idsclass_defs

data

link_data

MUTF-8: Modified UTF-8ざっくり言うと3byteまでのUTF-8で、それ以上のCode Pointは3byteのサロゲートペアで表現するっぽい

Data Sectionには非固定長のものが置かれる

data section

data section

string_id_item

string_data_off (uint)

string_data_item

utf16_size (uleb128)

data (ubyte[])

type_id_item

descriptor_idx (uint)

proto_id_item

shorty_idx (uint)

parameters_off (uint)

return_type_idx (uint)

field_id_item

class_idx (ushort)

type_idx (ushort)

name_idx (uint)

method_id_item

class_idx (ushort)

proto_idx (ushort)

name_idx (uint)

header

type_list

size (uint)

list (type_item[size])

tpye_item

type_idx (ushort)

offset

entity

第4回マルウェア解析勉強会 11

data section

class_defs section

class_def_item

class_idx (uint)

access_flag (uint)

interfaces_off (uint)

source_file_idx (uint)

annotations_off (uint)

class_data_off (uint)

static_values_off (uint)

superclass_idx (uint)

class_data_item

static_fields_size (uleb128)

instance_fields_size (uleb128)

virtual_methods_size (uleb128)

static_fields (encoded_field[])

instance_fields(encoded_field[])direct_methods

(encoded_method[])virtual_methods

(encoded_method[])

direct_methods_size (uleb128)

encoded_field

field_idx_diff (uleb128)

access_flags (uleb128)

encoded_method

method_idx_diff (uleb128)

access_flags (uleb128)

code_off (uleb128)

code_item

type_list

size (uint)

list (type_item[size])

offset

entity

第4回マルウェア解析勉強会 12

data section

encoded_method

code_item

register_size (ushort)

ins_size (ushort)

tries_size (ushort)

debug_info_off (uint)

insns_size (uint)

insns (ushort[insns_size])

padding (ushort)

outs_size (ushort)

tries (try_item[tries_size])

handlers (encoded_catch_handler_list)

try_item

start_addr (uint)

insn_count (ushort)

handler_off (ushort)

encoded_catch_handler_list

size (uleb128)

list (encoded_catch_handler[handler_size])

encoded_catch_handler

size (sleb128)

handlers(encoded_type_addr_pair[])

catch_all_addr (uleb128)

encoded_type_addr_pair

type_idx (uleb128)

addr (uleb128)

debug_info_item

line_start (uleb128)

parameters_size (uleb128)

parameter_names(uleb128p1[parameters_size])

offset

entity

第4回マルウェア解析勉強会 13

Instructionsの触り• OpCode: 218個 (1byteで表現)

– move vA, vB

– const/4 vA, #+B

– if-eq vA, vB, +CCCC

– invoke-virtual {vC, vD, vE, vF, vG}, meth@BBBB

• Instruction Format: 30種– B|A|op

– AA|op

– AA|op BBBB

– AA|op CC|BB

– A|G|op BBBB F|E|D|C

第4回マルウェア解析勉強会 14

instructionはshort intの配列で格納されており、1個目のLow byteがOpCodeになる

OpCodeによって命令長やフォーマットが違ってくる

DEX Section Visualizationとあるマルウェアのセクションを色塗りしてみた

第4回マルウェア解析勉強会 15https://github.com/masatanish/dexdump/

header

data section

string_ids

class_defs

class_data_item

code_item

string_data_item

ID lists

ad

dre

ss

DEX Section Visualization

第4回マルウェア解析勉強会 16

string_id & offset

string_data_item(文字列の実体)

STRINGの場合

DEX Section Visualization

第4回マルウェア解析勉強会 17

class_def_itemクラス名スーパークラスインターフェース…

class_data_itemフィールド情報メソッド情報

code_item各メソッドの命令列

Class情報の場合

第4回マルウェア解析勉強会 20

ということで実験してみた

(Photo: animal diary science By UGA College of Ag)

類似性の尺度

• ssdeep( http://ssdeep.sourceforge.net/ )

– Fuzzy Hash

• データ列に対して、ハッシュ値を計算

• 似ているデータは似ているハッシュになる

– ハッシュ値同士の類似度を計算できる

• 0 〜 100 (100は一致)

– 内部的にはデータをブロックに分割して、ブロックごとに計算してるとかそんな感じだったと思う(うろ覚え)

第4回マルウェア解析勉強会 21

[#1] ほとんど同じマルウェア

• Enesoluty

–情報詐取系アプリ

–対象検体(2つ)• 9e5184…, 9ee5bd…

–特徴

• 同じパッケージ名

• マニフェストファイルは完全に一致

• メインのActivityは1つ

– Activity内のソースコードの差分はHTTPの接続先URLのみ第4回マルウェア解析勉強会 22

× 2

[#1] DEX Sectionの比較

9e5184… 9ee5bd…

Sectionの配置はほとんど一緒に”見える”第4回マルウェア解析勉強会 23

[#1] DEXの差分白: 一致, 黒: 不一致

code_itemの後半からほとんどが不一致第4回マルウェア解析勉強会 24

[#1] ssdeepの比較

第4回マルウェア解析勉強会 25

sha256 ssdeep

9e5184… 384:BhCKVQImSPhVX/npAT7nMC5oYEE57u5Qb2mWSZBaUgj1fhaSiIvMSN

9RyUFNyWyQ:hV2SJVX/iT7MC5iuuiWoaZ1fTiIpeWyQ

9ee5bd… 384:JULCKVQImSPhVX/npA62DZy4T/llSdolo5eRrZBaUgj1fhaSiIvySN9RyUF

NyWyo:CV2SJVX/i5DZy4xiGRjaZ1fTiILeWyo

類似度 68 →なんとなく微妙な値

[#2] ちょっと似てるマルウェア

• Enesoluty– 特徴

• アプリ名が違う

• パッケージ名は2つとも同じ

• メインのActivity名が違う

• メインのActivityのコードはProgressBarが1つあるか2つあるかの違いと、通信先URLが違う

• 検体(2つ)– 9e5184… →安心ウィルススキャン

– 68bf97… →電波改善

第4回マルウェア解析勉強会 26

[#2] DEX Sectionの比較

9e5184… 68bf97…

これもSectionの配置はほとんど一緒に”見える”第4回マルウェア解析勉強会 27

[#2] DEXの差分

第4回マルウェア解析勉強会 28

白: 一致, 黒: 不一致

ほとんど一致してない…

[#2] ssdeepの比較

第4回マルウェア解析勉強会 29

sha256 ssdeep

9e5184… 384:BhCKVQImSPhVX/npAT7nMC5oYEE57u5Qb2mWSZBaUgj1fhaSiIvMSN

9RyUFNyWyQ:hV2SJVX/iT7MC5iuuiWoaZ1fTiIpeWyQ

68bf97… 384:WCern9AVEeq4G2kFzpA8+P4I/aUgj1fhv6iVvISzDanlfk+:ShACp4G26K4Y

aZ1fwiVxb+

類似度 29 →あんまり似てないとはいえ、DEXのバイナリ差分よりは似てるのかも

何故、あまり似てないか?

第4回マルウェア解析勉強会 30

似てない理由(推測)

• ソースがほぼ一致していたとしても、少しのIDのズレなどが全体に影響

– DEX全体のバイナリの比較はあまり筋が良くなさそう

• そもそもssdeepってどうなのよ?的な話

– やりたいことにマッチしたアルゴリズムか?

第4回マルウェア解析勉強会 31

DEXの抽象化

• ソースが似ているという人間の感覚に近い値を導きたい

• ソースが似ている→ Instructionが似ている

• DEXからソースのエッセンスを抽出

– code_itemの実行命令列を足しあわせてハッシュ化

第4回マルウェア解析勉強会 32

Instruction Hash

第4回マルウェア解析勉強会 33

Class Data Item A

method instructions

in code_item

method instructions

method instructions

method instructions

method instructions

各classの各method の(code_item)instructionsを足しあわせてssdeepを算出する

Class Defs List

Class Data Item B Class Data Item C

A B C …

class_def_item

#1,#2の比較結果

第4回マルウェア解析勉強会 35

Targets DEXssdeep(before)

Instructionssdeep(after)

68 100

29 60

30 602

1 2

1

類似性は向上、しかし値としてはやっぱり微妙?

ついでにTheMovie

• 手元にあったTheMovieの検体17個でSSDEEPを算出

• 17C2=136通りの比較結果

第4回マルウェア解析勉強会 36

DEXssdeep

Instructionssdeep

Max 96 100

Min 55 100

Avg. 64.11 100.0

これはまさに…

完全に一致

第4回マルウェア解析勉強会 37

まとめ

• DEX FORMATの話– 各Sectionの話とData Sectionの中身の話– Instructionは時間の都合で触れただけ

• 同じファミリーのマルウェアをssdeepで比較– DEXをそのまま比較してもあまり似てない– 命令列だけを取り出せば似てる類似度は上がる

• でもまだいまいち感覚に近くない

• 今後の話– 実は、もうちょっと先に進んでる部分も– ssdeepどうなのよという話はまだある

• NCD(Normalized Compression Distance)とか

– 全く違うアプリ間の比較をしてない• 似てないものは似てない値が出るか

第4回マルウェア解析勉強会 38