Android5.1.1源碼 - zygote fork出的子進程如何許可權降級

來源:互聯網
上載者:User

標籤:

前言

?如果不知道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將自身許可權降級。


尋禹@阿里Mobile Security,更多安全技術部落格,請點擊阿里聚安全部落格


Android5.1.1源碼 - zygote fork出的子進程如何許可權降級

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.