星期三, 10月 05, 2011

z4root

網路上可以找到很多文章,不過大多都是講怎麼用,而沒有提到原理,所以就想找找看。

最初找到的是這篇:Android adb setuid提权漏洞的分析,裡面就寫得很清楚了,他寫的不是 z4root,而是 RageAgainstTheCage,主要是靠著一直建 process,建到極限值,然後試著砍掉 adb,再靠 adb 程式沒有檢查 setuid 傳回值的漏洞來取得 root 權限。一般的 daemon 程式都是這樣子,一開始是 root,之後會用 setuid 切換身份,所以在 setuid 之前都是 root。而 setuid 通常不會失敗,但是因為可用的程序限制到了,才失敗 (參考 kernel/sys.c 裡的 set_user)。


好,那跟 z4root 又有什麼關係?還好 z4root 有源碼

z4root 裡就有用到 RageAgainstTheCage,z4root.java 是主要的 Activity,當你 click root 按鈕值,會啟動 Phase1 Activity,這邊就會把包成 resource 的 RageAgainstTheCage 寫到z4root的應用程式目錄下,然後變更其權限並且執行。噹噹,執行完以後,當然 adb 就有 root 權限了。

然後 Phase1 有 thread 去持續檢查執行 RageAgainstTheCage 的程序,如果成功了,會利用 Alarm 服務去啟動 Phase2。Phase2 這邊我有點不太明白,最後是將 su、busybox、SuperUser.apk 都搬到系統分割區了,然後就重開機,可是這個時候怎麼會有權限可以作這些事情呢? 如果照上面的 RageAgainstTheCage 來看,我猜想應該是在執行 RageAgainstTheCage 時,把程序數衝到最大限制,然後之後所執行的程序其實都是 root 啟動的,要切換使用者身份時失敗,所以之後的程序都是 root,也因此 Phase2 Activity 也有同等的 root 權限。這邊因為跟 java 的 thread 作法不是很熟,所以就不了了之。

z4root 最後是重開機,此時已經有埋必要的 su 跟 SuperUser.apk 在系統裡,也就有了可以 root 的可能。

沒有留言: