Android 操作系統(tǒng)獲取Root權(quán)限 原理詳細(xì)解析
android root權(quán)限破解分析
許多機(jī)友新購來的Android機(jī)器沒有破解過Root權(quán)限,無法使用一些需要高權(quán)限的軟件,以及進(jìn)行一些高權(quán)限的操作,其實(shí)破解手機(jī)Root權(quán)限是比較簡單及安全的,破解Root權(quán)限的原理就是在手機(jī)的/system/bin/或/system/xbin/目錄下放置一個(gè)可執(zhí)行文件“su”,這是一個(gè)二進(jìn)制文件,相當(dāng)于電腦上的exe文件,僅僅在系統(tǒng)中置入這個(gè)“su”文件是不會(huì)給手機(jī)的軟件或硬件造成任何故障。
下面的代碼是android系統(tǒng)原版的su中的部分代碼,可以看出只允許getuid()為AID_ROOT和AID_SHELL的進(jìn)程可以使用su進(jìn)行登陸。
<SPAN style="FONT-SIZE: 18px"><STRONG>/* Until we have something better, only root and the shell can use su. */
myuid = getuid();
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
return 1;
}</STRONG></SPAN>
面在Superuser這個(gè)android程序中的su不再有上面的一部分,這樣任何進(jìn)程都可以使用su進(jìn)行登陸了,有一部分android程序要使用root權(quán)限可能的用法類似于(這個(gè)也是Superuser中的一部分代碼):
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("mount -oremount,rw /dev/block/mtdblock3 /system\n");
os.writeBytes("busybox cp /data/data/com.koushikdutta.superuser/su /system/bin/su\n");
os.writeBytes("busybox chown 0:0 /system/bin/su\n");
os.writeBytes("chmod 4755 /system/bin/su\n");
os.writeBytes("exit\n");
os.flush();
而在上面提到的Superuser和android程序中的su源碼中都有這部分代碼:
if(setgid(gid) || setuid(uid)) {
fprintf(stderr,"su: permission denied\n");
return 1;
}
看上去這里就是進(jìn)行權(quán)限切換的地方了。面普通用戶要能使用su,su的權(quán)限要是這樣:
-rwsr-xr-x. 1 root root 34904 11月 3 2010 /bin/su
這個(gè)和電腦版的su上是一樣的。
從出上面的分析可以認(rèn)為破解android的root權(quán)限的實(shí)質(zhì)是:在系統(tǒng)中加入一個(gè)任何用戶都可能用于登陸的su命令。當(dāng)然這首先要取得root權(quán)限才能做
到。在z4root這個(gè)android下的破解android的root權(quán)限的程序中有一個(gè)rageagainstthecage,可能就是設(shè)法得到root權(quán)限的程序。
第二篇文章:
如果你進(jìn)行過程序開發(fā),在root過的手機(jī)上面獲得root權(quán)限的代碼如下:
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
......
os.writeBytes("exit\n");
os.flush();
從上面代碼我們可以看到首先要運(yùn)行su程序,其實(shí)root的秘密都在su程序中,《android root權(quán)限破解分析》中講到Android系統(tǒng)默認(rèn)的su程序只能root和shell可以用運(yùn)行su,這個(gè)是安全的。如果把這個(gè)限制拿掉,就是root破解了!
下面我們仔細(xì)分析一下程序是怎樣獲得root權(quán)限的,如果對(duì)Linux的su命令熟悉的朋友可能知道su程序都設(shè)置SUID位,我們查看一下我的手機(jī)(已經(jīng)root破解)上的su權(quán)限設(shè)置,
我們發(fā)現(xiàn)su的所有者和所有組都是root,是其實(shí)是busybox的軟鏈接,我們查看busybox的屬性發(fā)現(xiàn),其設(shè)置了SUID和SGID,并且所有者和所有組都是root。SUID和SGID的作用是什么呢?如果你不太清楚,請(qǐng)參考《Linux進(jìn)程的實(shí)際用戶ID和有效用戶ID》,這樣運(yùn)行busybox的普通用戶,busybox運(yùn)行過程中獲得的是root的有效用戶。su程序則是把自己啟動(dòng)一個(gè)新的程序,并把自己權(quán)限提升至root(我們前面提到su其實(shí)就是busybox,運(yùn)行期它的權(quán)限是root,當(dāng)然也有權(quán)限來提升自己的權(quán)限)。
再強(qiáng)調(diào)一下不光root手機(jī)上su需要設(shè)置SUID,所有的Linux系統(tǒng)上的su程序都需要設(shè)置SUID位。請(qǐng)參考一下UC服務(wù)器的su的權(quán)限情況:
我們發(fā)現(xiàn)su也設(shè)置了SUID位,這樣普通用戶也可以運(yùn)行su程序,su程序會(huì)驗(yàn)證root密碼,如果正確su程序可以把用戶權(quán)限提高的root(因?yàn)槠湓O(shè)置SUID位,運(yùn)行期是root權(quán)限,這樣其有權(quán)限提升自己的權(quán)限)。
這樣我們就可以看出其實(shí)Android系統(tǒng)的破解的根本原理就是替換掉系統(tǒng)中的su程序,因?yàn)橄到y(tǒng)中的默認(rèn)su程序需要驗(yàn)證實(shí)際用戶權(quán)限(只有root和 shell用戶才有權(quán)運(yùn)行系統(tǒng)默認(rèn)的su程序,其他用戶運(yùn)行都會(huì)返回錯(cuò)誤)。而破解后的su將不檢查實(shí)際用戶權(quán)限,這樣普通的用戶也將可以運(yùn)行su程序, 也可以通過su程序?qū)⒆约旱臋?quán)限提升。
到這里大家對(duì)root破解不感到神秘了吧。root破解沒有利用什么Linux內(nèi)核漏洞(Linux內(nèi)核不可能有這么大的漏洞存在),可以理解成root 破解就是在你系統(tǒng)中植入“木馬su”,說它是“木馬”一點(diǎn)兒都不為過,假如惡意程序在系統(tǒng)中運(yùn)行也可以通過su來提升自己的權(quán)限的這樣的結(jié)果將會(huì)是災(zāi)難性 的。所以一般情況下root過手機(jī)都會(huì)有一個(gè)SuperUser應(yīng)用程序來讓用戶管理允許誰獲得root權(quán)限,也算是給系統(tǒng)加了一層保險(xiǎn)吧!
通過上文《Android系統(tǒng)root破解原理分析》 的介紹大家應(yīng)該明白了root破解過程的終極目標(biāo)是替換掉系統(tǒng)中的su程序。但是要想替換掉系統(tǒng)中su程序本身就是需要root權(quán)限的,怎樣在root破 解過程中獲得root權(quán)限,成為我們研究的重點(diǎn)了。下面我們先清點(diǎn)一下我們需要破解系統(tǒng)情況,假設(shè)需要破解的Android系統(tǒng)具備如下條件:
1、可以通過adb連接到設(shè)備,一般意味著驅(qū)動(dòng)程序已經(jīng)安裝。
2、但是adb獲得用戶權(quán)限是shell用戶,而不是root。
要想理解root破解過程我們首先需要了解一下adb工具,SDK中包含adb工具,設(shè)備端有adbd服務(wù)程序后臺(tái) 運(yùn)行,為開發(fā)機(jī)的adb程序提供服務(wù),adbd的權(quán)限,決定了adb的權(quán)限。具體用戶可查看/system/core/adb下的源碼,查看 Android.mk你將會(huì)發(fā)現(xiàn)adb和adbd其實(shí)是一份代碼,然后通過宏來編譯。
查看adb.c的adb_main函數(shù)你將會(huì)發(fā)現(xiàn)adbd中有如下代碼:
int adb_main(int is_daemon)
{
......
property_get("ro.secure", value, "");
if (strcmp(value, "1") == 0) {
// don't run as root if ro.secure is set...
secure = 1;
......
}
if (secure) {
......
從中我們可以看到adbd會(huì)檢測(cè)系統(tǒng)的ro.secure屬性,如果該屬性為1則將會(huì)把自己的用戶權(quán)限降級(jí)成shell用戶。一般設(shè)備出廠的時(shí)候在/default.prop文件中都會(huì)有:
ro.secure=1
這樣將會(huì)使adbd啟動(dòng)的時(shí)候自動(dòng)降級(jí)成shell用戶。
然后我們?cè)俳榻B一下adbd在什么時(shí)候啟動(dòng)的呢?答案是在init.rc中配置的系統(tǒng)服務(wù),由init進(jìn)程啟動(dòng)。我們查看init.rc中有如下內(nèi)容:
# adbd is controlled by the persist.service.adb.enable system property
service adbd /sbin/adbd
disabled
對(duì)Android屬性系統(tǒng)少有了解的朋友將會(huì)知道,在init.rc中配置的系統(tǒng)服務(wù)啟動(dòng)的時(shí)候都是root權(quán)限(因?yàn)閕nit進(jìn)行是root權(quán)限,其子程序也是root)。由此我們可以知道在adbd程序在執(zhí)行:
/* then switch user and group to "shell" */
setgid(AID_SHELL);
setuid(AID_SHELL);
代碼之前都是root權(quán)限,只有執(zhí)行這兩句之后才變成shell權(quán)限的。
這樣我們就可以引出root破解過程中獲得root權(quán)限的方法了,那就是讓以上面setgid和setuid函數(shù)執(zhí)行失敗,也就是降級(jí)失敗,那就繼續(xù)在root權(quán)限下面運(yùn)行了。
這其實(shí)利用了一個(gè)RageAgainstTheCage漏洞,具體分析請(qǐng)參考《Android adb setuid提權(quán)漏洞的分析》和《RageAgainstTheCage》。這里面做一個(gè)簡單說明:
1、出廠設(shè)置的ro.secure屬性為1,則adbd也將運(yùn)行在shell用戶權(quán)限下;
2、adb工具創(chuàng)建的進(jìn)程ratc也運(yùn)行在shell用戶權(quán)限下;
3、ratc一直創(chuàng)建子進(jìn)程(ratc創(chuàng)建的子程序也 將會(huì)運(yùn)行在shell用戶權(quán)限下),緊接著子程序退出,形成僵尸進(jìn)程,占用shell用戶的進(jìn)程資源,直到到達(dá)shell用戶的進(jìn)程數(shù)為 RLIMIT_NPROC的時(shí)候(包括adbd、ratc及其子程序),這是ratc將會(huì)創(chuàng)建子進(jìn)程失敗。這時(shí)候殺掉adbd,adbd進(jìn)程因?yàn)槭?Android系統(tǒng)服務(wù),將會(huì)被Android系統(tǒng)自動(dòng)重啟,這時(shí)候ratc也在競爭產(chǎn)生子程序。在adbd程序執(zhí)行上面setgid和setuid之 前,ratc已經(jīng)創(chuàng)建了一個(gè)新的子進(jìn)程,那么shell用戶的進(jìn)程限額已經(jīng)達(dá)到,則adbd進(jìn)程執(zhí)行setgid和setuid將會(huì)失敗。根據(jù)代碼我們發(fā) 現(xiàn)失敗之后adbd將會(huì)繼續(xù)執(zhí)行。這樣adbd進(jìn)程將會(huì)運(yùn)行在root權(quán)限下面了。
3、這是重新用adb連接設(shè)備,則adb將會(huì)運(yùn)行在root權(quán)限下面了。
通過上面的介紹我們發(fā)現(xiàn)利用RageAgainstTheCage漏洞,可以使adbd獲得root權(quán)限,也就是adb獲得了root權(quán)限。拿到root權(quán)限剩下的問題就好辦了,復(fù)制破解之后的su程序到系統(tǒng)中(見上文《Android系統(tǒng)root破解原理分析》的介紹),都是沒有什么技術(shù)含量的事情了。
其實(shí)堵住adbd的這個(gè)漏洞其實(shí)也挺簡單的:
/* then switch user and group to "shell" */
if (setgid(AID_SHELL) != 0) {
exit(1);
}
if (setuid(AID_SHELL) != 0) {
exit(1);
}
如果發(fā)現(xiàn)setgid和setuid函數(shù)執(zhí)行失敗,則adbd進(jìn)程異常退出,就把這個(gè)漏洞給堵上了。為什么這么多設(shè) 備都沒有堵上這個(gè)漏洞呢?我覺得是設(shè)備廠商的策略(不排除傻X的廠商存在哦),雖然知道怎么封堵漏洞但是就是留著個(gè)后門給大家,讓第三方給自己定制 rom,提高自己系統(tǒng)的易用性。
至此我們把root的過程和root之后系統(tǒng)情況都進(jìn)行了介紹,相信你也不會(huì)對(duì)root破解再神秘了吧!
- Android掃描二維碼時(shí)出現(xiàn)用戶禁止權(quán)限報(bào)錯(cuò)問題解決辦法
- Android獲取ROOT權(quán)限的實(shí)例代碼
- Android點(diǎn)亮屏幕或屏幕解鎖和鎖定以及其他相關(guān)權(quán)限實(shí)現(xiàn)代碼
- Android權(quán)限操作之uses-permission詳解
- Android6.0動(dòng)態(tài)申請(qǐng)權(quán)限所遇到的問題小結(jié)
- Android權(quán)限控制之自定義權(quán)限
- Android中Root權(quán)限獲取的簡單代碼
- Android需要提升權(quán)限的操作方法
- android編程判斷應(yīng)用是否具有某個(gè)權(quán)限的方法
- Android權(quán)限如何禁止以及友好提示用戶開通必要權(quán)限詳解
相關(guān)文章
Android應(yīng)用程序的編譯流程及使用Ant編譯項(xiàng)目的攻略
這篇文章主要介紹了Android應(yīng)用程序的編譯流程及使用Ant編譯項(xiàng)目的攻略,Ant是集編譯測(cè)試部署于一體的Java自動(dòng)化工具,要的朋友可以參考下2016-04-04android實(shí)現(xiàn)上滑屏幕隱藏底部菜單欄的示例
這篇文章主要介紹了android實(shí)現(xiàn)上滑屏幕隱藏底部菜單欄的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02詳解RecyclerView設(shè)置背景圖片長寬一樣(以GridLayoutManager為例)
這篇文章主要介紹了詳解RecyclerView設(shè)置背景圖片長寬一樣(以GridLayoutManager為例),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12去掉RecycleView或者ListView上下滑動(dòng)陰影的方法
下面小編就為大家分享一篇去掉RecycleView或者ListView上下滑動(dòng)陰影的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android6.0 固定屏幕功能實(shí)現(xiàn)方法及實(shí)例
這篇文章主要介紹了Android6.0 固定屏幕功能實(shí)現(xiàn)方法及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01Android 調(diào)用系統(tǒng)相冊(cè)選擇照片
這篇文章主要介紹了Android 調(diào)用系統(tǒng)相冊(cè)選擇照片的方法,幫助大家更好的進(jìn)行Android開發(fā),感興趣的朋友可以了解下2020-12-12android基于ListView和CheckBox實(shí)現(xiàn)多選和全選記錄的功能
本篇文章主要介紹了android基于ListView和CheckBox實(shí)現(xiàn)多選和全選記錄的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11Android 中ActionBar+fragment實(shí)現(xiàn)頁面導(dǎo)航的實(shí)例
這篇文章主要介紹了Android 中ActionBar+fragment實(shí)現(xiàn)頁面導(dǎo)航的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09