第1章 縱觀Android生態圈 1
1.1 瞭解Android的根源 1
1.1.1 公司曆史 1
1.1.2 版本曆史 2
1.1.3 審視Android設備傢族 3
1.1.4 主體開源 5
1.2 瞭解Android的利益相關者 6
1.2.1 榖歌 7
1.2.2 硬件廠商 7
1.2.3 移動通信運營商 9
1.2.4 開發者 9
1.2.5 用戶 10
1.3 理解生態圈的復雜性 11
1.3.1 碎片化問題 12
1.3.2 兼容性 13
1.3.3 更新問題 13
1.3.4 安全性與開放性 15
1.3.5 公開披露 16
1.4 小結 17
第2章 Android的安全設計與架構 18
2.1 理解Android係統架構 18
2.2 理解安全邊界和安全策略執行 19
2.2.1 Android沙箱 19
2.2.2 Android權限 22
2.3 深入理解各個層次 25
2.3.1 Android應用層 25
2.3.2 Android框架層 28
2.3.3 DalvikVM 29
2.3.4 用戶空間原生代碼層 30
2.3.5 內核 36
2.4 復雜的安全性,復雜的漏洞利用 41
2.5 小結 42
第3章 root Android設備 43
3.1 理解分區布局 43
3.2 理解引導過程 45
3.3 引導加載程序的鎖定與解鎖 47
3.4 對未加鎖引導加載程序的設備進行root 50
3.5 對鎖定引導加載程序的設備進行root 52
3.5.1 在已啓動係統中獲取root權限 52
3.5.2 NAND 鎖、臨時性root與永久性root 53
3.5.3 對軟root 進行持久化 55
3.6 曆史上的一些已知攻擊 56
3.6.1 內核:Wunderbar/asroot 56
3.6.2 恢復:Volez 57
3.6.3 udev:Exploid 57
3.6.4 adbd:RageAgainstTheCage 58
3.6.5 Zygote:Zimperlich和Zysploit 58
3.6.6 ashmem:KillingInTheName-
Of 和psneuter 58
3.6.7 vold:GingerBreak 59
3.6.8 PowerVR:levitator 59
3.6.9 libsysutils:zergRush 60
3.6.10 內核:mempodroid 60
3.6.11 文件權限和符號鏈接相關的攻擊 61
3.6.12 adb 恢復過程競爭條件漏洞 61
3.6.13 Exynos4:exynos-abuse 62
3.6.14 Diag:lit/diaggetroot 62
3.7 小結 63
第4章 應用安全性評估 64
4.1 普遍性安全問題 64
4.1.1 應用權限問題 64
4.1.2 敏感數據的不安全傳輸 66
4.1.3 不安全的數據存儲 67
4.1.4 通過日誌的信息泄露 68
4.1.5 不安全的IPC端點 69
4.2 案例分析:移動安全應用 71
4.2.1 初步剖析 71
4.2.2 靜態分析 72
4.2.3 動態分析 87
4.2.4 攻擊 95
4.3 案例分析:SIP客戶端 97
4.3.1 瞭解Drozer 97
4.3.2 發現漏洞 98
4.3.3 snarfing 99
4.3.4 注入 102
4.4 小結 104
第5章 理解Android的攻擊麵 105
5.1 攻擊基礎術語 105
5.1.1 攻擊嚮量 106
5.1.2 攻擊麵 106
5.2 對攻擊麵進行分類 107
5.2.1 攻擊麵屬性 108
5.2.2 分類決策 108
5.3 遠程攻擊麵 108
5.3.1 網絡概念 109
5.3.2 網絡協議棧 112
5.3.3 暴露的網絡服務 113
5.3.4 移動技術 114
5.3.5 客戶端攻擊麵 115
5.3.6 榖歌的基礎設施 119
5.4 物理相鄰 123
5.4.1 無綫通信 123
5.4.2 其他技術 127
5.5 本地攻擊麵 128
5.5.1 探索文件係統 128
5.5.2 找到其他的本地攻擊麵 129
5.6 物理攻擊麵 133
5.6.1 拆解設備 133
5.6.2 USB 134
5.6.3 其他物理攻擊麵 137
5.7 第三方修改 137
5.8 小結 137
第6章 使用模糊測試來挖掘漏洞 139
6.1 模糊測試的背景 139
6.1.1 選定目標 140
6.1.2 構造畸形輸入 140
6.1.3 處理輸入 141
6.1.4 監控結果 142
6.2 Android上的模糊測試 142
6.3 對Broadcast Receiver進行模糊測試 143
6.3.1 選定目標 143
6.3.2 生成輸入 144
6.3.3 傳遞輸入 145
6.3.4 監控測試 145
6.4 對Android上的Chrome進行模糊測試 147
6.4.1 選擇一種技術作為目標 148
6.4.2 生成輸入 149
6.4.3 處理輸入 151
6.4.4 監控測試 152
6.5 對USB攻擊麵進行模糊測試 155
6.5.1 對USB進行模糊測試的挑戰 155
6.5.2 選定目標模式 155
6.5.3 生成輸入 156
6.5.4 處理輸入 158
6.5.5 監控測試 158
6.6 小結 159
第7章 調試與分析安全漏洞 161
7.1 獲取所有信息 161
7.2 選擇一套工具鏈 162
7.3 調試崩潰Dump 163
7.3.1 係統日誌 163
7.3.2 Tombstone 164
7.4 遠程調試 165
7.5 調試Dalvik代碼 166
7.5.1 調試示例應用 167
7.5.2 顯示框架層源代碼 168
7.5.3 調試現有代碼 170
7.6 調試原生代碼 173
7.6.1 使用NDK進行調試 174
7.6.2 使用Eclipse進行調試 177
7.6.3 使用AOSP進行調試 179
7.6.4 提升自動化程度 183
7.6.5 使用符號進行調試 184
7.6.6 調試非AOSP設備 189
7.7 調試混閤代碼 190
7.8 其他調試技術 191
7.8.1 調試語句 191
7.8.2 在設備上進行調試 191
7.8.3 動態二進製注入 192
7.9 漏洞分析 193
7.9.1 明確問題根源 193
7.9.2 判斷漏洞可利用性 205
7.10 小結 205
第8章 用戶態軟件的漏洞利用 206
8.1 內存破壞漏洞基礎 206
8.1.1 棧緩衝區溢齣 206
8.1.2 堆的漏洞利用 209
8.2 公開的漏洞利用 215
8.2.1 GingerBreak 215
8.2.2 zergRush 218
8.2.3 Mempodroid 221
8.3 Android瀏覽器漏洞利用 222
8.3.1 理解漏洞 222
8.3.2 控製堆 224
8.4 小結 227
第9章 ROP漏洞利用技術 228
9.1 曆史和動機 228
9.2 ARM 架構下的ROP 基礎 230
9.2.1 ARM 子函數調用 231
9.2.2 將gadget組成ROP鏈 232
9.2.3 識彆潛在的gadget 234
9.3 案例分析:Android 4.0.1鏈接器 235
9.3.1 遷移棧指針 236
9.3.2 在新映射內存中執行任意代碼 237
9.4 小結 240
第10章 攻擊內核 242
10.1 Android 的Linux內核 242
10.2 內核提取 242
10.2.1 從齣廠固件中提取內核 243
10.2.2 從設備中提取內核 245
10.2.3 從啓動鏡像中提取內核 246
10.2.4 解壓內核 247
10.3 運行自定義內核代碼 247
10.3.1 獲取源代碼 247
10.3.2 搭建編譯環境 250
10.3.3 配置內核 251
10.3.4 使用自定義內核模塊 252
10.3.5 編譯自定義內核 254
10.3.6 製作引導鏡像 257
10.3.7 引導自定義內核 258
10.4 調試內核 262
10.4.1 獲取內核崩潰報告 263
10.4.2 理解Oops信息 264
10.4.3 使用KGDB進行Live調試 267
10.5 內核漏洞利用 271
10.5.1 典型Android內核 271
10.5.2 獲取地址 273
10.5.3 案例分析 274
10.6 小結 283
第11章 攻擊RIL無綫接口層 284
11.1 RIL簡介 284
11.1.1 RIL架構 285
11.1.2 智能手機架構 285
11.1.3 Android電話棧 286
11.1.4 對電話棧的定製 287
11.1.5 RIL 守護程序 287
11.1.6 用於vendor-ril的API 289
11.2 短信服務 290
11.2.1 SMS消息的收發 290
11.2.2 SMS消息格式 291
11.3 與調製解調器進行交互 293
11.3.1 模擬調製解調器用於模糊測試 293
11.3.2 在Android中對SMS進行模糊測試 295
11.4 小結 302
第12章 漏洞利用緩解技術 303
12.1 緩解技術的分類 303
12.2 代碼簽名 304
12.3 加固堆緩衝區 305
12.4 防止整數溢齣 305
12.5 阻止數據執行 306
12.6 地址空間布局隨機化 308
12.7 保護棧 310
12.8 保護格式化字符串 310
12.9 隻讀重定位錶 312
12.10 沙盒 313
12.11 增強源代碼 313
12.12 訪問控製機製 315
12.13 保護內核 316
12.13.1 指針和日誌限製 316
12.13.2 保護零地址頁 317
12.13.3 隻讀的內存區域 318
12.14 其他加固措施 318
12.15 漏洞利用緩解技術總結 320
12.16 禁用緩解機製 322
12.16.1 更改personality 322
12.16.2 修改二進製文件 323
12.16.3 調整內核 323
12.17 對抗緩解技術 323
12.17.1 對抗棧保護 324
12.17.2 對抗ASLR 324
12.17.3 對抗數據執行保護 324
12.17.4 對抗內核級保護機製 325
12.18 展望未來 325
12.18.1 進行中的官方項目 325
12.18.2 社區的內核加固工作 326
12.18.3 一些預測 326
12.19 小結 327
第13章 硬件層的攻擊 328
13.1 設備的硬件接口 328
13.1.1 UART 串行接口 329
13.1.2 I2C、SPI 和單總綫接口 331
13.1.3 JTAG 334
13.1.4 尋找調試接口 343
13.2 識彆組件 353
13.2.1 獲得規格說明書 353
13.2.2 難以識彆的組件 354
13.3 攔截、監聽和劫持數據 355
13.3.1 USB 355
13.3.2 I2C、SPI和UART串行端口 359
13.4 竊取機密和固件 364
13.4.1 無損地獲得固件 364
13.4.2 有損地獲取固件 365
13.4.3 拿到dump文件後怎麼做 368
13.5 陷阱 371
13.5.1 定製的接口 371
13.5.2 二進製私有數據格式 371
13.5.3 熔斷調試接口 372
13.5.4 芯片密碼 372
13.5.5 bootloader密碼、熱鍵和啞終端 372
13.5.6 已定製的引導過程 373
13.5.7 未暴露的地址綫 373
13.5.8 防止逆嚮的環氧樹脂 373
13.5.9 鏡像加密、混淆和反調試 373
13.6 小結 374
附錄A 工具 375
附錄B 開源代碼庫 386
· · · · · · (
收起)