一個信息安全潔癖者眼中的安卓刷機

0x00 聲明

  • 本文中觀點包括大量的信息安全潔癖,如有不適,請立即停止閱讀。
  • 本文受限於作者的知識水平和認知見聞,可能存在部分技術上的謬誤,歡迎持有不同觀點的朋友在評論區指正。

0x01 從選購標準想到的

近期在跟朋友一次關於安卓機器選購的閑聊中,提及了三個軟體方面的選購標準:

  • 出廠系統支持有效的許可權管理(Android 6.0 那個顯然不是有效的)
  • 有比較長期的更新支持,至少安全補丁要儘快發布
  • 可以在無需 root 的環境下完成 Gapps 的安裝

當時被朋友吐槽「你這標準一划出來,安卓機就被你淘汰了 90%」,可事實上除了第三條是我個人的私貨,其餘兩條都是關乎系統安全的大事兒。

1.1 許可權管理

國內安卓應用的環境無須多說。一方面部分 App 總是力圖把自己做成一個大雜燴式的工具箱,申請了大量的使用許可權(圖片為酷安網提供的 QQ 版本的部分許可權截圖):

另一方面許多 App 在開發時為了減少工作量、加快開發進度,或由於登錄的應用分發市場提出的要求(如百度被曝強制接入SDK 或與「百度全家桶」有關),接入了一些第三方 SDK,申請了許多不必要的許可權。作為一名久受 Unix 哲學熏陶的信息安全潔癖者,在我看來,這種許可權的申請與下面兩個原則是相悖的:

  • Unix 哲學中提及「程序應該只關注一個目標,並儘可能把它做好」
  • 信息安全中的「最小許可權原則」

1.2 及時的系統更新

提到安卓系統的時候,我們常常說到一個詞「碎片化」。所謂碎片化,指的就是市場上同時存在著許多個版本差異較大的安卓系統(數據來自騰訊雲分析,2016.2 至 2016.5 活躍設備的數據):

從圖中我們可以看到,在 Android 6.0 已經發布了超過半年、Android 5.0 發布了超過 18 個月的現在,仍然有超過一半的用戶停留在較為早期的 Android 4.x 版本,升級 Android 6.0 的用戶僅有 2.72%。雖然安卓系統的更新並不等價於安卓安全補丁的更新,但是在很大程度上反映出許多安卓設備缺乏後續更新,甚至部分機型出廠之後沒有任何更新,而在惡意程序面前,這種缺乏更新的安卓系統是不安全乃至不設防的。舉一個例子,安卓上著名的 Stagefright 漏洞 是在 2015 年 4 月就已經報告給谷歌的一個觸發條件極為簡單的遠程代碼執行漏洞,而今年三月份的一條新聞稱 曝光一年 8.5億安卓設備仍有Stagefright漏洞。而這 8.5 億用戶,很大程度上是因為缺乏廠商的後續更新而仍然處在漏洞的威脅下。

0x02 刷機帶來的喜與憂

很多對安卓有一定了解的朋友,可能對我上面的幾個選購標準嗤之以鼻:「你說的都是些沒用的東西,因為我們可以刷機呀。」

2.1 刷機之喜

誠然,我上面提到的問題幾乎都可以用刷機來解決。想要最新的系統,我們可以刷入流行的 CyanogenMod 或者各種民間的 AOSP 修改版,立刻就可以享受最新的 Android 6.0 體驗。想要許可權管理,我們可以在刷入 su 文件及 SuperSU 獲取 root 之後安裝 Xposed 模塊以及 XPrivacy 來管理許可權,可以安裝 LBE 安全大師或者 360 極客版傻瓜式的管理許可權。至於 Gapps 更不用說,只要選擇 stock 版本的 Gapps 包,你可以獲得全套的 Gapps 體驗,就像你在使用一款最新式的 Nexus 手機一樣。還有安全漏洞,如果你是一個高手,一個極客,你完全可以自己針對最新的安全漏洞編寫補丁,或者從 xda 之類的論壇找到民間的補丁,通過 root 許可權進行安裝,在官方推送安全補丁之前完成對漏洞的修補,甚至比大家更安全。看起來很美好,不是嗎?

2.2 刷機之憂

中國傳統文化常常提到「禍福相依」,刷機也是如此。目前對於大多數機型來說,刷機的步驟是這樣的:

  • 解鎖 Bootloader
  • 刷入第三方 Recovery
  • 刷入第三方固件,獲取 root,刷入 Gapps

P.S. 本文暫且不討論少數通過系統漏洞獲取 root 許可權並刷入第三方 recovery ,從而無需解鎖 Bootloader 的機型,如索尼,魅族,夏普等部分機器。在這三個步驟中,第三個步驟可以解決我提到的問題,而前兩個步驟則引入了一些新的安全問題。

首先我們來介紹一下 Bootloader 及解鎖的概念。Bootloader 指的是在操作系統內核運行之前運行的一段小程序。通過這段小程序,進行硬體初始化等,事實上相當於電腦的 BIOS。而 Bootloader 鎖指的則是部分廠商出於安全考慮對 Bootloader 的功能進行限制,使其僅能運行廠商認證過的操作系統和 系統自帶的 Recovery(通常情況下,廠商只會認證手機出廠自帶的 Recovery 和 ROM 及後續更新)。解鎖 Bootloader 就意味著取消這種限制,可以讓手機執行任何一款 ROM 或者 Recovery,從而達到允許第三方 ROM 和 Recovery 運行的目的。而刷入了第三方 Recovery,自然就可以自由地刷入第三方 ROM ,獲取 root 許可權,刷入 Gapps 等。但是解鎖之後,可以利用 Recovery 的並不只有你。假如你的手機不慎遺失,或者被人竊取,那麼有心人可以通過你解鎖的 Bootloader 和第三方 Recovery 繞過你設置的鎖屏密碼等,獲取你的數據,並且刷入其他的系統,讓你最終泄漏信息並失去手機。P.S. 比較令人欣慰的一點是,Android 6.0 引入了全盤加密的機制,開啟全盤加密後可以很大程度地避免信息泄露。但是仍然會因為被刷機而失去手機。下面我們通過一台三星 Note2 來進行相關的演示。

0x03 撿到一台解鎖了 Bootloader 的手機

為了驗證上面的說法,我們使用一台刷入了 Unofficial CyanogenMod 的三星 Note2 (N7100) 來進行測試。

3.1 準備工作

首先,我們為手機刷入從 xda 找到的最為熱門的 ROM,Unofficial CyanogenMod 13 的 ROM,並且存入三個聯繫人及三張圖片。

然後,我們為手機添加圖案鎖屏密碼,從圖中可以看出,此時我們進入系統已經需要輸入解鎖圖案。

3.2 開始下手

現在,我們開始模擬撿到手機的人。由於該三星手機已經解鎖了 Bootloader,因此我們可以關閉手機然後在開機時長按音量下鍵和 Home 鍵,進入 Fastboot 模式並直接刷入 Recovery。這裡我們使用三星刷機工具 Odin 刷入著名的 TWRP,刷機步驟參考 Odin Install Method (No Root Required) 一節。

接下來我們重啟手機,按住音量上鍵和 Home 鍵,進入 Recovery 模式,也就是啟動我們剛剛刷入的 TWRP,默認模式的 TWRP 是會自動啟動 ADB 並通過 MTP 掛載 /data 分區

3.3 拿到數據

熟悉安卓系統的人都知道,拿到了 adb 許可權(而且還是 root 級別的)基本這台安卓手機已經可以隨便玩弄了。首先我們獲取聯繫人,只需要通過命令行執行如下命令,拷貝出如圖中的兩個文件,其中前者是存儲聯繫人的資料庫,後者是存儲簡訊的 sqlite3 資料庫。

接下來,我們編寫一個小的解析程序,把資料庫文件轉化為人類可讀的格式。

執行程序後,我們直接輸出了事先存入的三個聯繫人—— Alice, Bob 和 Cirno 的姓名及手機號碼對應關係:

然後我們獲取之前存入的照片,這個直接通過 MTP 掛載安卓手機拷貝即可。

0x04 一種暫時的規避策略——全盤加密

注意!開啟全盤加密會在很大程度上導致手機快閃記憶體讀寫性能下降,如果你對讀寫性能有較高要求,請仔細斟酌是否開啟此功能。

注意!在開啟全盤加密前請務必備份手機數據,加密過程中一旦出現不可預料問題導致失敗,你將無法再次訪問你的數據。

通過上面的實驗,我們可以看出,一台解鎖了 Bootloader 並沒有任何加密措施的手機一旦丟失,在有惡意的攻擊者面前基本是不設防的。但是其實我們是有一些方法來規避這種風險的。谷歌在 Android5.0 中引入了一個名為「全盤加密」的機制,可以對手機的 /data 分區進行加密。但是由於無法平衡性能損失和安全問題,谷歌把是否應用該功能的選擇權交給了各大 OEM 廠商。而 CM13 中則提供了一個開關來讓用戶決定是否開啟手機的全盤加密,我們只需要開啟全盤加密功能即可有效規避上面提到的風險。在開啟全盤加密後,進入 Recovery 模式將不會自動掛載數據分區,adb 也無法訪問數據分區的數據,具體表現為:

  • 使用較老的 Recovery 時,會無法掛載數據分區,只能通過 adb sideload 的方法刷入新系統。
  • 使用較新的 Recovery (比如演示中使用的 TWRP3.0.2) 時,進入 Recovery 後會要求輸入密碼,只有正確輸入密碼才能訪問數據分區,否則與上一條相同。

注意!開啟全盤加密會在很大程度上導致手機快閃記憶體讀寫性能下降,如果你對讀寫性能有較高要求,請仔細斟酌是否開啟此功能。

注意!在開啟全盤加密前請務必備份手機數據,加密過程中一旦出現不可預料問題導致失敗,你將無法再次訪問你的數據。

0x05 結尾的碎碎念

寫這篇文章的初衷是發現一些朋友對安卓刷機帶來的風險認知不明確,認為刷機和 root 等等是可以解決一切危害並毫無副作用的萬能良藥,事實上刷機在某些方面提高了安全性的同時,也帶來了許多其他的風險。當然,比起我之前提到的方法,手機 OEM 廠商可以更好的解決這個問題。比如剛才提到的 Bootloader 解鎖帶來的隱患,如果手機廠商可以修改 Bootloader 解鎖後的效果,譬如在支持第三方操作系統的同時加入一個 Bootloader 級別的開機密碼,或許就能很大程度上避免信息泄漏的隱患。


推薦閱讀:

Swift是Android的未來么?
Vivo X5Pro的眼球識別技術是通過檢測眼球哪些特徵來識別的?與虹膜識別技術相同嗎?
O-mg ——Android O二周體驗報告
Weex SDK Android 源碼解析

TAG:Android | Android刷机 | 信息安全 |