2012年5月18日 星期五

[轉貼]Android系統root破解原理分析


    現在Android系統的root破解基本上成為大家的必備技能!網上也有很多中一鍵破解的軟件,使root破解越來越容易。但是你思考過root破解的原理嗎?root破解的本質是什麼呢?難道是利用了Linux kernal的漏洞嗎?本文將簡單對root的破解原理進行分析。
     網上有一篇文章已經對root破解的基本原理進行了簡單介紹,大家可以先參考一下《》,本文只能說對root原理進行了方向性的描述,但是在一些具體的方面沒有描述清楚。本文將會對其進行一些必要的擴展和補充。
     如果你進行過程序開發,在root過的手機上面獲得root權限的代碼如下:
   1: Process process = Runtime.getRuntime().exec( "su" );
   2: DataOutputStream os = new DataOutputStream(process.getOutputStream());
   3: ......
   4: os.writeBytes( "exit\n" );
   5: os.flush();
     從上面代碼我們可以看到首先要運行su程序,其實root的秘密都在su程序中,《》中講到Android系統默認的su程序只能root和shell可以用運行su,這個是安全的。如果把這個限制拿掉,就是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權限,也算是給系統加了一層保險吧!
     如上是Simon的個人對root破解的一些認識,如果有錯誤的地方,歡迎朋友們指正。

沒有留言:

張貼留言