android root權限破解分析
許多機友新購來的Android機器沒有破解過Root權限,無法使用一些需要高權限的軟件,以及進行一些高權限的操作,其實破解手機Root權限是比較簡單及安全的,破解Root權限的原理就是在手機的/system/bin/或/system/xbin/目錄下放置一個可執行文件“su”,這是一個二進制文件,相當于電腦上的exe文件,僅僅在系統中置入這個“su”文件是不會給手機的軟件或硬件造成任何故障。
下面的代碼是android系統原版的su中的部分代碼,可以看出只允許getuid()為AID_ROOT和AID_SHELL的進程可以使用su進行登陸。
-rwsr-xr-x. 1 root root 34904 11月 3 2010 /bin/su
這個和電腦版的su上是一樣的。
從出上面的分析可以認為破解android的root權限的實質是:在系統中加入一個任何用戶都可能用于登陸的su命令。當然這首先要取得root權限才能做
到。在z4root這個android下的破解android的root權限的程序中有一個rageagainstthecage,可能就是設法得到root權限的程序。
第二篇文章:
如果你進行過程序開發,在root過的手機上面獲得root權限的代碼如下:
下面我們仔細分析一下程序是怎樣獲得root權限的,如果對Linux的su命令熟悉的朋友可能知道su程序都設置SUID位,我們查看一下我的手機(已經root破解)上的su權限設置,
我們發現su的所有者和所有組都是root,是其實是busybox的軟鏈接,我們查看busybox的屬性發現,其設置了SUID和SGID,并且所有者和所有組都是root。SUID和SGID的作用是什么呢?如果你不太清楚,請參考《Linux進程的實際用戶ID和有效用戶ID》,這樣運行busybox的普通用戶,busybox運行過程中獲得的是root的有效用戶。su程序則是把自己啟動一個新的程序,并把自己權限提升至root(我們前面提到su其實就是busybox,運行期它的權限是root,當然也有權限來提升自己的權限)。
再強調一下不光root手機上su需要設置SUID,所有的Linux系統上的su程序都需要設置SUID位。請參考一下UC服務器的su的權限情況:
我們發現su也設置了SUID位,這樣普通用戶也可以運行su程序,su程序會驗證root密碼,如果正確su程序可以把用戶權限提高的root(因為其設置SUID位,運行期是root權限,這樣其有權限提升自己的權限)。
這樣我們就可以看出其實Android系統的破解的根本原理就是替換掉系統中的su程序,因為系統中的默認su程序需要驗證實際用戶權限(只有root和 shell用戶才有權運行系統默認的su程序,其他用戶運行都會返回錯誤)。而破解后的su將不檢查實際用戶權限,這樣普通的用戶也將可以運行su程序, 也可以通過su程序將自己的權限提升。
到這里大家對root破解不感到神秘了吧。root破解沒有利用什么Linux內核漏洞(Linux內核不可能有這么大的漏洞存在),可以理解成root 破解就是在你系統中植入“木馬su”,說它是“木馬”一點兒都不為過,假如惡意程序在系統中運行也可以通過su來提升自己的權限的這樣的結果將會是災難性 的。所以一般情況下root過手機都會有一個SuperUser應用程序來讓用戶管理允許誰獲得root權限,也算是給系統加了一層保險吧!
通過上文《Android系統root破解原理分析》 的介紹大家應該明白了root破解過程的終極目標是替換掉系統中的su程序。但是要想替換掉系統中su程序本身就是需要root權限的,怎樣在root破 解過程中獲得root權限,成為我們研究的重點了。下面我們先清點一下我們需要破解系統情況,假設需要破解的Android系統具備如下條件:
查看adb.c的adb_main函數你將會發現adbd中有如下代碼:
if (secure) {
......
然后我們再介紹一下adbd在什么時候啟動的呢?答案是在init.rc中配置的系統服務,由init進程啟動。我們查看init.rc中有如下內容:
這樣我們就可以引出root破解過程中獲得root權限的方法了,那就是讓以上面setgid和setuid函數執行失敗,也就是降級失敗,那就繼續在root權限下面運行了。
這其實利用了一個RageAgainstTheCage漏洞,具體分析請參考《Android adb setuid提權漏洞的分析》和《RageAgainstTheCage》。這里面做一個簡單說明:
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權限下面了。
其實堵住adbd的這個漏洞其實也挺簡單的:
if (setuid(AID_SHELL) != 0) {
exit(1);
}
至此我們把root的過程和root之后系統情況都進行了介紹,相信你也不會對root破解再神秘了吧!
新聞熱點
疑難解答
圖片精選