“The best defense is a good offense”
「說實話,在Android的安全與開發方面,沒有哪一本書比這本更加詳細。」
-Aditya Gupta WhiteHat移動安全公司Attify創始人
「本書的主要作者是在資訊安全領域浸淫多年的一流專家,三位譯者也都是在技術一線耕耘多年並各有卓越成就。這種全明星陣容讓我對本書充滿期待。」-于暘(tombkeeper)著名安全專家,現任騰訊「玄武」實驗室總監
「一本值得安全從業者認真研讀的經典Android系統安全方面技術書籍,高質量的翻譯也保證了技術內容的原汁原味傳達」-何淇丹(Flanker)Keen Team高級研究員
「很高興看到這樣一本好書可以用中文形式呈現在大家面前。在移動平台安全成為熱點的今天,講解相關底層技術的書籍卻少得可憐,內容豐富的更是寥寥無幾。這本書的出現,無疑是打破了這一僵局。全書以應用軟體、系統內核、硬體等層面為出發點,講解了在安卓平臺上,如何對其進行漏洞分析、挖掘等鮮為人知的安全技術。書中的乾貨頗多,絕對是軟體安全與開發人員案頭必備的一本技術專著。我相信,此書將會引導安卓平臺的安全技術潮流!」
-豐生強(非虫)《Android軟體安全與逆向分析》作者,看雪論壇Android安全版、安卓巴士開發交流版版主
「這是第一本關於Android系統安全方面的書籍,內容涵蓋了裝置系統底層、漏洞挖掘及利用方面的知識,本書的作者都是在網路安全以及嵌入式裝置領域的的高級專家。此書由中國幾位電腦網路安全的學術和工業界享有傑出聲望的專家們譯製而成,他們專業領域的知識能夠保證該書的翻譯質量,讓讀者能夠從淺至深地掌握書中的技能,並且熟練玩轉Android裝置。」
-dm557 PanguTeam成員
「在台灣,資訊安全的書籍少之又少,很高興我能審校這本書。從這本書裡頭,我獲得了很多令人感到興奮的議題。」
-秋聲差點被抓去關的清潔工
本書的結構本書應該按照章節順序進行閱讀,但是對於正在鑽研Android 或者進行Android裝置安全研究的讀者來說,也可以將本書做為一本參考資料。本書一共分為13 章,幾乎涵蓋了安全研究人員第一次接觸Android 所需要瞭解的所有內容。是從一些廣泛的話題開始,以深度的技術細節收尾。這些章節逐步具體化,最終將討論一些安全研究的高階話題,如發掘、分析和攻擊Android 裝置。本書盡可能地引用來自外部的各類詳細說明文件,從而專注於闡述裝置root、逆向工程、漏洞研究以及軟體漏洞利用等技術細節。
◆ 第1章 介紹Android行動裝置的生態系統。首先回顧Android系統發展的歷史,然後介紹通用軟體的構成、Android裝置的市場流通情況以及供應鏈當中的各大關鍵角色,最後從較高層面上總結和討論Android生態系統發展遭遇的挑戰,以及安全研究面臨的困難。
◆ 第2章 闡述Android系統的基礎知識。首先引入系統安全機制的基礎核心概念,然後深入關鍵安全元件的內部機制。
◆ 第3章 介紹獲取Android裝置完全控制權的動機與方法。首先講授適用於眾多裝置的通用技術,而後逐一詳細分析十幾個公開的漏洞利用。
◆ 第4章 涉及Android應用相關的安全概念和技術。討論了Android應用開發過程中常見的安全錯誤,並介紹如何使用正確的工具和流程來找到這些問題。
◆ 第5章 討論行動裝置可能遭受攻擊的形式,並解釋用來描述這些攻擊的關鍵術語。
◆ 第6章 講述如何使用模糊測試技術來發現Android系統中的軟體漏洞。從介紹模糊測試宏觀流程入手,重點描述如何使用這些流程,更佳幫助我們發現Android系統中的安全問題。
◆ 第7章 介紹如何分析在Android系統中發現的缺陷和安全漏洞。本章涵蓋了Android系統中不同類型與層次程式碼的偵錯技術,最後以基於WebKit引擎的瀏覽器中一個未修補的安全問題為案例進行深入分析。
◆ 第8章 關注如何利用Android裝置中發現的記憶體破壞漏洞,涵蓋了編譯器和作業系統的內部機制原理,例如堆積的實作、ARM體系架構規範等。章節最後詳細分析了幾個公開的漏洞利用。
◆ 第9章 介紹高階利用技術ROP(Return Oriented Programming)。進一步講述ARM體系架構,
並解釋為何、如何使用ROP技術,最後對一個獨特的漏洞利用進行了更為細緻的分析。
◆ 第10章 深入Android作業系統內核的內部工作原理,涵蓋如何從駭客的角度來對內核進行開發和偵錯,本章最後還會教會你如何利用數個已公開的內核漏洞。
◆ 第11章 將帶你返回使用者空間,來討論一個特殊且重要的Android智慧手機元件——無線介面層(RIL)。在闡明RIL的架構細節之後,教你如何通過與RIL元件的互動,對Android系統中處理簡訊的模組進行模糊測試。
◆ 第12章 關注目前存在於Android系統中的安全保護機制,介紹了這些保護機制是何時被發明並引入Android系統,以及是如何運作的,最後總結繞過這些保護機制的方法。
◆ 第13章 深入探索通過硬體層面來攻擊Android和其他嵌入式裝置的方法。首先介紹如何識別、監視和攔截各種匯流排級別的通訊,並展示如何利用這些方法來攻擊那些難以觸及的系統元件。最後列出了如何避免遭受這些常見硬體攻擊的訣竅。
作者簡介:
Joshua J. Drake 是Accuvant LABS公司研究部門總監,於資訊安全領域擁有十多年的研究經驗。在2013年贏得了Pwn2Own駭客大賽,並於2010年隨ACME Pharm團隊獲得Defcon 18 CTF決賽冠軍。
Pau Oliva Fora 是viaForensics公司的移動安全工程師。擔任熱門XDA開發者論壇的版主。活躍於研究Android安全問題。
Zach Lanier 是Duo Security公司的資深安全研究員,在資訊安全的不同領域中有十多年的工作經驗。
Collin Mulliner 是美國東北大學的博士後研究員。曾為Palm OS開發應用程式,以在多媒體簡訊(MMS)和簡訊(SMS)安全方面的工作而聞名。
Stephen A. Ridley 是一位安全研究員與技術作者,在軟體發展、軟體安全和逆向工程領域有十幾年的經驗。曾任職於Simple.com線上銀行、Matasano Security公司,以及一家美國國防部承辦商的資安相關職務。
Georg Wicherski 是CrowdStrike公司的資深安全研究員,曾在Kaspersky和McAfee公司工作。0ldEur0pe是他的本地CTF戰隊,參加過無數駭客競賽,並多次贏得冠軍。
作者序
前 言
資訊安全與大多數領域一樣,都是從家庭式手工作坊開始萌芽的。經過自主發展,這一領域已經跨越了業餘消遣式的初級階段,逐漸成為一個健全的產業。如今的資訊安全領域中,有頂著各種行政頭銜的大人物,也有從事一線研發工作的專家們,還有來自學術圈的「眼線」們。這也是一塊創新熱土,能夠讓數論、密碼學、自然語言處理、圖論、演算法、理論電腦科學等一系列看似冷僻的研究方向產生重大行業影響。對於這些令人神往的科學研究而言,資訊安全行業正在發展進化成為它們的創新試驗場,但與此同時,資訊安全(特別是「漏洞研究」)仍然受資訊技術領域整體發展的限制,並與資訊技術領域的熱點趨勢保持一致。
正如我們每個人從個人生活中強烈感受到的那樣,行動計算顯然是資訊技術領域近年來得到巨大發展的一個熱點方向。現在,各種行動裝置已經無時無刻不伴隨在我們的左右,我們花在行動裝置上的時間要比花在電腦上的時間多得多:辦公用的電腦在下班後就會被我們遺棄在辦公桌上,而家裡的電腦在我們早上急匆匆去上班時甚至沒有打開的機會,這種變化是前所未有的。與電腦不同的是,我們的行動裝置始終是保持開機的,而且連接著工作與家庭這兩個世界,因此也成為了壞人們眼中更具價值的攻擊目標。
我們決定寫這本書的主要原因是,目前行動安全研究領域的知識圖譜過於稀疏,僅有的參考資源和技術資料互相孤立,甚至是相互衝突的。雖然已經有了不少專注於Android 的優秀論文和其他出版物,但其中很大一部分所涵蓋的內容都非常狹窄,僅僅關注Android 安全的某個特定方向,或者只是在討論行動或嵌入式裝置的某個安全問題時,將Android 做為一個輔助例子予以提及。此外,Android 相關的已公開漏洞資訊非常稀缺,雖然現在已經有超過1000 個已公開的漏洞會影響到Android 裝置,但通過常見漏洞資訊管道報告的只有不到100 個。我們相信,本書所介紹的相關技術、概念、工具、技巧和案例,可以幫助你邁上改善Android 安全產業態勢的漫漫長路。
前 言
資訊安全與大多數領域一樣,都是從家庭式手工作坊開始萌芽的。經過自主發展,這一領域已經跨越了業餘消遣式的初級階段,逐漸成為一個健全的產業。如今的資訊安全領域中,有頂著各種行政頭銜的大人物,也有從事一線研發工作的專家們,還有來自學術圈的「眼線」們。這也是一塊創新熱土,能夠讓數論、密碼學、自然語言處理、圖論、演算法、理論電腦科學等一系列看似冷僻的研究方向產生重大行業影響。對於這些令人神往的科學研究而言,資訊安全行業正在發展進化成為它們的創新試驗場,但與此同時,資訊安全(特別是「漏洞研究」)仍然...
目錄
第1章 縱觀Android生態圈
1.1 瞭解Android的根源
1.1.1 公司歷史
1.1.2 版本歷史
1.1.3 審視Android裝置家族
1.1.4 開放原始碼
1.2 瞭解Android的利益相關者
1.2.1 Google
1.2.2 硬體廠商
1.2.3 行動電信業者
1.2.4 開發者
1.2.5 使用者
1.3 理解生態圈的複雜性
1.3.1 碎片化問題
1.3.2 相容性
1.3.3 更新問題
1.3.4 安全性與開放性
1.3.5 公開披露
1.4 小結
第2章 Android的安全設計與架構
2.1 理解Android系統架構
2.2 理解安全邊界和安全性原則執行
2.2.1 Android沙盒
2.2.2 Android權限
2.3 深入理解各個層次
2.3.1 Android應用層
2.3.2 Android框架層
2.3.3 DalvikVM
2.3.4 使用者空間原生程式碼層
2.3.5 內核
2.4 複雜的安全性,複雜的漏洞利用
2.5 小結
第3章 root Android裝置
3.1 理解分區佈局
3.2 理解啟動過程
3.3 開機啟動程式的鎖定與解鎖
3.4 對未鎖定開機啟動程式的裝置進行root
3.5 對鎖定開機啟動程式的裝置進行root
3.5.1 在已啟動系統中取得root權限
3.5.2 NAND鎖、臨時性root與永久性root
3.5.3 對軟解root進行永久化
3.6 歷史上的一些已知攻擊
3.6.1 內核:Wunderbar/asroot
3.6.2 恢復:Volez
3.6.3 udev:Exploid
3.6.4 adbd:RageAgainstTheCage
3.6.5 Zygote:Zimperlich和Zysploit
3.6.6 ashmem:KillingInTheNameOf和psneuter
3.6.7 vold:GingerBreak
3.6.8 PowerVR:levitator
3.6.9 libsysutils:zergRush
3.6.10 內核:mempodroid
3.6.11 檔案權限和符號連結相關的攻擊
3.6.12 adb恢復過程競爭條件漏洞
3.6.13 Exynos4:exynos-abuse
3.6.14 Diag:lit/diaggetroot
3.7 小結
第4章 應用安全性評估
4.1 普遍性安全問題
4.1.1 應用權限問題
4.1.2 敏感性資料的不安全傳輸
4.1.3 不安全的資料儲存
4.1.4 通過紀錄的資訊洩露
4.1.5 不安全的IPC端點
4.2 案例分析:行動安全應用
4.2.1 初步剖析
4.2.2 靜態分析
4.2.3 動態分析
4.2.4 攻擊
4.3 案例分析:SIP客戶端
4.3.1 瞭解Drozer
4.3.2 發現漏洞
4.3.3 snarfing
4.3.4 注入
4.4 小結
第5章 理解Android的攻擊面
5.1 攻擊基礎術語
5.1.1 攻擊向量
5.1.2 攻擊面
5.2 對攻擊面進行分類
5.2.1 攻擊面屬性
5.2.2 分類決策
5.3 遠程攻擊面
5.3.1 網路概念
5.3.2 網路通訊協定堆疊
5.3.3 暴露的網路服務
5.3.4 行動技術
5.3.5 客戶端攻擊面
5.3.6 Google的基礎架構
5.4 物理相鄰
5.4.1 無線通訊
5.4.2 其他技術
5.5 本地攻擊面
5.5.1 探索檔案系統
5.5.2 找到其他的本機攻擊面
5.6 物理攻擊面
5.6.1 拆解裝置
5.6.2 USB
5.6.3 其他物理攻擊面
5.7 協力廠商修改
5.8 小結
第6章 使用模糊測試來挖掘漏洞
6.1 模糊測試的背景
6.1.1 選定目標
6.1.2 建構畸形輸入
6.1.3 處理輸入
6.1.4 監控結果
6.2 Android上的模糊測試
6.3 對Broadcast Receiver進行模糊測試
6.3.1 選定目標
6.3.2 建立輸入
6.3.3 傳遞輸入
6.3.4 監控測試
6.4 對Android上的Chrome進行模糊測試
6.4.1 選擇一種技術做為目標
6.4.2 建立輸入
6.4.3 處理輸入
6.4.4 監控測試
6.5 對USB攻擊面進行模糊測試
6.5.1 對USB進行模糊測試的挑戰
6.5.2 選定目標模式
6.5.3 建立輸入
6.5.4 處理輸入
6.5.5 監控測試
6.6 小結
第7章 偵錯與分析安全性漏洞
7.1 取得所有資訊
7.2 選擇一套工具鏈
7.3 偵錯當機Dump
7.3.1 系統紀錄
7.3.2 Tombstone
7.4 遠程偵錯
7.5 偵錯Dalvik程式碼
7.5.1 偵錯範例應用程式
7.5.2 顯示框架層原始程式碼
7.5.3 偵錯現有程式碼
7.6 偵錯原生程式碼
7.6.1 使用NDK進行偵錯
7.6.2 使用Eclipse進行偵錯
7.6.3 使用AOSP進行偵錯
7.6.4 提升自動化程度
7.6.5 使用符號進行偵錯
7.6.6 偵錯非AOSP裝置
7.7 偵錯混合程式碼
7.8 其他偵錯技術
7.8.1 偵錯陳述
7.8.2 在裝置上進行偵錯
7.8.3 動態二進位注入
7.9 漏洞分析
7.9.1 明確問題根源
7.9.2 判斷漏洞可利用性
7.10 小結
第8章 使用者態軟體的漏洞利用
8.1 記憶體破壞漏洞基礎
8.1.1 堆疊緩衝區溢位
8.1.2 堆積的漏洞利用
8.2 公開的漏洞利用
8.2.1 GingerBreak
8.2.2 zergRush
8.2.3 Mempodroid
8.3 Android瀏覽器漏洞利用
8.3.1 理解漏洞
8.3.2 控制堆積
8.4 小結
第9章 ROP漏洞利用技術
9.1 歷史和動機
9.2 ARM架構下的ROP基礎
9.2.1 ARM子函式呼叫
9.2.2 將gadget組成ROP鏈
9.2.3 識別潛在的gadget
9.3 案例分析:Android 4.0.1連結器
9.3.1 遷移堆疊指標
9.3.2 在新映射記憶體中執行任意程式碼
9.4 小結
第10章 攻擊內核
10.1 Android的Linux內核
10.2 內核擷取
10.2.1 從原廠韌體中提取內核
10.2.2 從裝置中提取內核
10.2.3 從啟動鏡像中提取內核
10.2.4 解壓縮內核
10.3 執行自訂內核程式碼
10.3.1 取得原始程式碼
10.3.2 建構編譯環境
10.3.3 設定內核
10.3.4 使用自定義內核模組
10.3.5 編譯自定義內核
10.3.6 製作啟動載入鏡像
10.3.7 開機啟動載入自定義內核
10.4 偵錯內核
10.4.1 取得內核當機報告
10.4.2 理解Oops資訊
10.4.3 使用KGDB進行Live偵錯
10.5 內核漏洞利用
10.5.1 典型Android內核
10.5.2 取得地址
10.5.3 案例分析
10.6 小結
第11章 攻擊RIL無線介面層
11.1 RIL簡介
11.1.1 RIL架構
11.1.2 智慧型手機架構
11.1.3 Android電話堆疊
11.1.4 對電話堆疊的客製化
11.1.5 RIL常駐程式
11.1.6 用於vendor-ril的API
11.2 簡訊服務
11.2.1 SMS簡訊的收發
11.2.2 SMS簡訊格式
11.3 與數據機進行互動
11.3.1 模擬數據機用於模糊測試
11.3.2 在Android中對SMS進行模糊測試
11.4 小結
第12章 漏洞利用緩解技術
12.1 緩解技術的分類
12.2 程式碼簽署
12.3 強化堆積緩衝區
12.4 防止整數溢出
12.5 阻止資料執行
12.6 位址空間佈局隨機化
12.7 保護堆疊
12.8 保護格式化字串
12.9 唯讀重定位表
12.10 沙盒
12.11 增強原始程式碼
12.12 存取控制機制
12.13 保護內核
12.13.1 指標和紀錄限制
12.13.2 保護零地址頁
12.13.3 唯讀的記憶體區域
12.14 其他強化措施
12.15 漏洞利用緩解技術總結
12.16 禁用緩解機制
12.16.1 更改personality
12.16.2 修改二進位檔案案
12.16.3 調整內核
12.17 對抗緩解技術
12.17.1 對抗堆疊保護
12.17.2 對抗ASLR
12.17.3 對抗資料執行保護
12.17.4 對抗內核級保護機制
12.18 展望未來
12.18.1 進行中的官方專案
12.18.2 社區的內核強化工作
12.18.3 一些預測
12.19 小結
第13章 硬體層的攻擊
13.1 裝置的硬體介面
13.1.1 UART序列介面
13.1.2 I2C、SPI和單匯流排界面
13.1.3 JTAG
13.1.4 尋找偵錯介面
13.2 識別組件
13.2.1 取得規格說明書
13.2.2 難以識別的組件
13.3 攔截、監聽和劫持資料
13.3.1 USB
13.3.2 I2C、SPI和UART序列埠
13.4 竊取機密和韌體
13.4.1 無損地取得韌體
13.4.2 有損地取得韌體
13.4.3 拿到dump檔案後怎麼做
13.5 陷阱
13.5.1 客製化的介面
13.5.2 二進位私有資料格式
13.5.3 熔斷偵錯介面
13.5.4 晶片密碼
13.5.5 bootloader密碼、熱鍵和啞終端
13.5.6 已客製化的啟動載入過程
13.5.7 未暴露的地址線
13.5.8 防止逆向的環氧樹脂
13.5.9 鏡像加密、混淆和反偵錯
13.6 小結
附錄A 工具
A.1 開發工具
A.1.1 Android SDK
A.1.2 Android NDK
A.1.3 Eclipse
A.1.4 ADT外掛套件
A.1.5 ADT套裝軟體
A.1.6 Android Studio
A.2 韌體擷取和刷機工具
A.2.1 Binwalk
A.2.2 fastboot
A.2.3 Samsung
A.2.4 NVIDIA
A.2.5 LG
A.2.6 HTC
A.2.7 Motorola
A.3 Android原生工具
A.3.1 BusyBox
A.3.2 setpropex
A.3.3 SQLite
A.3.4 strace
A.4 Hook和程式碼改寫工具
A.4.1 ADBI框架
A.4.2 ldpreloadhook
A.4.3 XPosed框架
A.4.4 Cydia Substrate
A.5 靜態分析工具
A.5.1 Smali和Baksmali
A.5.2 Androguard
A.5.3 apktool
A.5.4 dex2jar
A.5.5 jad
A.5.6 JD-GUI
A.5.7 JEB
A.5.8 Radare2
A.5.9 IDA Pro和Hex-Rays Decompiler
A.6 應用程式測試工具
A.6.1 Drozer(Mercury)框架
A.6.2 iSEC Intent Sniffer和Intent Fuzzer
A.7 硬體安全工具
A.7.1 Segger J-Link
A.7.2 JTAGulator
A.7.3 OpenOCD
A.7.4 Saleae
A.7.5 Bus Pirate
A.7.6 GoodFET
A.7.7 Total Phase Beagle USB
A.7.8 Facedancer21
A.7.9 Total Phase Beagle I2C
A.7.10 Chip Quik
A.7.11 熱風槍
A.7.12 Xeltek SuperPro
A.7.13 IDA
附錄B 開放原始碼程式碼庫
B.1 Google
B.1.1 AOSP
B.1.2 Gerrit原始碼審查
B.2 SoC廠商
B.2.1 AllWinner
B.2.2 Intel
B.2.3 Marvell
B.2.4 MediaTek
B.2.5 Nvidia
B.2.6 Texas Instruments
B.2.7 Qualcomm
B.2.8 Samsung
B.3 OEM
B.3.1 ASUS
B.3.2 HTC
B.3.3 LG
B.3.4 Motorola
B.3.5 Samsung
B.3.6 Sony
B.4 上層程式碼來源
B.5 其他原始碼
B.5.1 客製化韌體
B.5.2 Linaro
B.5.3 Replicant
B.5.4 程式碼索引
B.5.5 個人程式碼庫
第1章 縱觀Android生態圈
1.1 瞭解Android的根源
1.1.1 公司歷史
1.1.2 版本歷史
1.1.3 審視Android裝置家族
1.1.4 開放原始碼
1.2 瞭解Android的利益相關者
1.2.1 Google
1.2.2 硬體廠商
1.2.3 行動電信業者
1.2.4 開發者
1.2.5 使用者
1.3 理解生態圈的複雜性
1.3.1 碎片化問題
1.3.2 相容性
1.3.3 更新問題
1.3.4 安全性與開放性
1.3.5 公開披露
1.4 小結
第2章 Android的安全設計與架構
2.1 理解Android系統架構
2.2 理解安全邊界和安全性原則執行
2....