Android系統root破解原理分析(續)

來源:互聯網
上載者:User

上文《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破解再神秘了吧!你對本文和上文有什麼意見歡迎和我探討。

原文

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.