上文《Android系統root破解原理分析》介紹了Android系統root破解之后,應用程序獲得root權限的原理。有一些網友提出對於root破解過程比較感興趣,也提出了疑問。本文將會對這個root破解過程進行分析,來解答這個問題。
通過上文《Android系統root破解原理分析》 的介紹大家應該明白了root破解過程的終極目標是替換掉系統中的su程序。但是要想替換掉系統中su程序本身就是需要root權限的,怎樣在root破 解過程中獲得root權限,成為我們研究的重點了。下面我們先清點一下我們需要破解系統情況,假設需要破解的Android系統具備如下條件:
1、可以通過adb連接到設備,一般意味着驅動程序已經安裝。
2、但是adb獲得用戶權限是shell用戶,而不是root。
要想理解root破解過程我們首先需要了解一下adb工具,SDK中包含adb工具,設備端有adbd服務程序后台 運行,為開發機的adb程序提供服務,adbd的權限,決定了adb的權限。具體用戶可查看/system/core/adb下的源碼,查看 Android.mk你將會發現adb和adbd其實是一份代碼,然后通過宏來編譯。
查看adb.c的adb_main函數你將會發現adbd中有如下代碼:
1: int adb_main(int is_daemon)
2: {
3: ......
4: property_get("ro.secure", value, "");
5: if (strcmp(value, "1") == 0) {
6: // don't run as root if ro.secure is set...
7: secure = 1;
8: ......
9: }
10:
11: if (secure) {
12: ......
13: setgid(AID_SHELL);
14: setuid(AID_SHELL);
15: ......
16: }
17: }
從中我們可以看到adbd會檢測系統的ro.secure屬性,如果該屬性為1則將會把自己的用戶權限降級成shell用戶。一般設備出廠的時候在/default.prop文件中都會有:
1: ro.secure=1
這樣將會使adbd啟動的時候自動降級成shell用戶。
然后我們再介紹一下adbd在什么時候啟動的呢?答案是在init.rc中配置的系統服務,由init進程啟動。我們查看init.rc中有如下內容:
1: # adbd is controlled by the persist.service.adb.enable system property
2: service adbd /sbin/adbd
3: disabled
對Android屬性系統少有了解的朋友將會知道,在init.rc中配置的系統服務啟動的時候都是root權限(因為init進行是root權限,其子程序也是root)。由此我們可以知道在adbd程序在執行:
1: /* then switch user and group to "shell" */
2: setgid(AID_SHELL);
3: setuid(AID_SHELL);
代碼之前都是root權限,只有執行這兩句之后才變成shell權限的。
這樣我們就可以引出root破解過程中獲得root權限的方法了,那就是讓以上面setgid和setuid函數執行失敗,也就是降級失敗,那就繼續在root權限下面運行了。
這其實利用了一個RageAgainstTheCage漏洞,具體分析請參考《Android adb setuid提權漏洞的分析》和《RageAgainstTheCage》。這里面做一個簡單說明:
1、出廠設置的ro.secure屬性為1,則adbd也將運行在shell用戶權限下;
2、adb工具創建的進程ratc也運行在shell用戶權限下;3、ratc一直創建子進程(ratc創建的子程序也 將會運行在shell用戶權限下),緊接着子程序退出,形成僵屍進程,占用shell用戶的進程資源,直到到達shell用戶的進程數為 RLIMIT_NPROC的時候(包括adbd、ratc及其子程序),這是ratc將會創建子進程失敗。這時候殺掉adbd,adbd進程因為是 Android系統服務,將會被Android系統自動重啟,這時候ratc也在競爭產生子程序。在adbd程序執行上面setgid和setuid之 前,ratc已經創建了一個新的子進程,那么shell用戶的進程限額已經達到,則adbd進程執行setgid和setuid將會失敗。根據代碼我們發 現失敗之后adbd將會繼續執行。這樣adbd進程將會運行在root權限下面了。
3、這是重新用adb連接設備,則adb將會運行在root權限下面了。
通過上面的介紹我們發現利用RageAgainstTheCage漏洞,可以使adbd獲得root權限,也就是adb獲得了root權限。拿到root權限剩下的問題就好辦了,復制破解之后的su程序到系統中(見上文《Android系統root破解原理分析》的介紹),都是沒有什么技術含量的事情了。
其實堵住adbd的這個漏洞其實也挺簡單的:
1: /* then switch user and group to "shell" */
2: if (setgid(AID_SHELL) != 0) {
3: exit(1);
4: }
5: if (setuid(AID_SHELL) != 0) {
6: exit(1);
7: }
如果發現setgid和setuid函數執行失敗,則adbd進程異常退出,就把這個漏洞給堵上了。為什么這么多設 備都沒有堵上這個漏洞呢?我覺得是設備廠商的策略(不排除傻X的廠商存在哦),雖然知道怎么封堵漏洞但是就是留着個后門給大家,讓第三方給自己定制 rom,提高自己系統的易用性。
至此我們把root的過程和root之后系統情況都進行了介紹,相信你也不會對root破解再神秘了吧!你對本文和上文有什么意見歡迎和我探討。