2011-03-01 33 views
15

如果我在JNI C方法中調用socket()函數,應用程序仍然會失敗,並顯示權限錯誤。如果我在AndroidManifest.xml中放置了一個uses-permission行,問題就解決了。Android權限是如何執行的?

所以看起來Android的權限檢查並沒有在Dalvik虛擬機中實現,因爲我調用了本地C函數並且仍然被檢查。我想知道在Android內核中執行檢查的位置,或者跟蹤ptrace等應用程序攔截每個系統調用或其他任何方式。非常感謝。

+1

從技術上講,這隻適用於互聯網域名套接字。 Unix域套接字使用與不同常量相同的socket()調用,但沒有通過android「偏執網絡」內核修改實施組ID。 – 2013-01-22 23:00:33

回答

18

檢查由Linux內核執行,使用組成員身份來確定訪問權限。

如果您在VM中查看the zygote fork code,您可以使用setgroups()來查看它以設置補充組ID。如果您在應用程序框架代碼中追蹤它,您可以看到它在哪裏確定權限並將它們傳遞給forkAndSpecialize()。

+0

答案中的鏈接已損壞。我認爲這是相同的文件:https://github.com/android/platform_dalvik/blob/master/vm/native/dalvik_system_Zygote.cpp – CommonsWare 2013-01-22 21:55:06

+0

更新與android.googlesource.com鏈接。 – fadden 2013-01-22 22:08:02

5

本機代碼在SDK應用程序使用的同一個沙箱中運行,因此受到與SDK應用程序相同的安全模型的約束。

Download the Android NDK

如果你寫本地代碼,您 應用仍然打包成一個 .apk文件,他們仍然在設備上運行的虛擬機的內部 。 基本Android應用程序 模型不會更改。

+2

該註釋涉及應用程序模型,而不是安全模型。本機代碼沒有虛擬化。 – fadden 2011-03-01 20:25:01

+1

儘管原生應用程序不是直接在Dalvik虛擬機上運行,​​但它們仍然在從Dalvik虛擬機繼承的安全沙箱中運行,啓動它們 - 否則,您將能夠將任何惡意代碼拖放到某人的設備上,只要SDK應用程序能夠運行,它可能會產生惡意本機負載。關鍵的一點是安全模型仍然適用 - 正如@ZelluX在需要向清單添加相關使用權限時所表明的那樣。 – RivieraKid 2011-03-01 22:05:03

+6

嚴格地說,這是真的,但「沙箱」是Linux內核,它同樣適用於設備上運行的所有用戶空間進程。您的答案意味着安全機制是用於SDK應用程序的每個進程沙箱,事實並非如此。 – fadden 2011-03-02 20:36:23