2011-03-01 90 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