Android5.1.1原始碼-zygotefork出的子程式如何許可權降級

小旋風柴進發表於2017-04-10

前言


如果不知道zygote是什麼,或者好奇zygote如何啟動,可以去看老羅的文章: 
Android系統程式Zygote啟動過程的原始碼分析


所有Android應用程式都是zygote fork出來的,新fork出來的應用程式還保持著root許可權,這顯然是不被允許的,所以這個fork出來的子程式的許可權需要被降級,本文說的就是Android原始碼在什麼地方執行了許可權降級的操作。


執行路徑


下面的runSelectLoop方法是類ZygoteInit的成員方法,它在檔案”frameworks/base/core/java/com/android/internal/os/ZygoteInit.java”中,下面是它的原始碼:


zygote會在這個方法中等待客戶端通知啟動一個新的應用程式,詳情可以看前言部分列出的文章。現在我們關心的是done = peers.get(index).runOnce();語句,這個語句呼叫了runOnce方法啟動了一個新的應用程式,runOnce方法是ZygoteConnection類的成員方法,下文從runOnce方法開始分析。


ZygoteConnection.runOnce方法在檔案”frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java”中,下面是它的原始碼:


parsedArgs中儲存了要啟動的應用的資訊,它的型別是Arguments,Arguments是ZygoteConnection的內部類。

runOnce方法中呼叫了Zygote.forkAndSpecialize方法,這個方法在檔案”frameworks/base/core/java/com/android/internal/os/Zygote.java”中,下面是它的原始碼:


在這個方法中呼叫了nativeForkAndSpecialize方法。

nativeForkAndSpecialize是一個native方法,在native程式碼中它的函式名是com_android_internal_os_Zygote_nativeForkAndSpecialize,這個函式在檔案”frameworks/base/core/jni/com_android_internal_os_Zygote.cpp”中,下面是它的原始碼:


在這個函式中呼叫了ForkAndSpecializeCommon函式。


子程式許可權降級函式


ForkAndSpecializeCommon函式在檔案”frameworks/base/core/jni/com_android_internal_os_Zygote.cpp”中,在這個函式中呼叫了fork函式,並且fork出的子程式將自身許可權降級,下面是它的原始碼:


在這個函式中子程式分別呼叫了SetGids、SetRLimits、setresgid、setresuid,設定了組ID和使用者ID將自身許可權降級。


相關文章