2012-04-29 67 views
3

此问题已在How does Android enforce permissions?之前被询问。虽然讨论很好,但问题仍未得到充分解答。在运行时如何检查Android安全权限?

在开发环境中,应用程序尝试执行某些操作时,会引发异常,这些操作需要未在AndroidManifest.xml中声明的权限。那么运行时系统如何实现运行时检查呢?

我想这很可能是在核心框架中完成的,它可能需要也可能不需要本地代码的支持。但我不知道AOSP中的源代码文件与此相关。

+0

我也在寻找相同的答案。最后在书中找到了一个非常好的解释:Android Security Internals:http://shop.oreilly.com/product/9781593275815.do查看权限管理章节。 – 2016-05-20 10:43:41

回答

12

Android使用了很多标准的Linux(-kernel?)机制,特别是在硬件限制方面。

每个应用程序都被分配一个新的唯一(Linux-)用户ID,每当创建应用程序进程时,系统都会使用该用户ID创建它。除非您删除应用程序,否则该ID永远不会更改。这意味着,访问较低的系统级别时,您的应用将以特定用户身份出现,并且与用户协同工作的每个(Linux)权限系统也将应用于您的应用。

如果您在清单中请求WRITE_EXTERNAL_STORAGE,您的应用程序也将成为有权写入该存储的(Linux-)组(称为sdcard_rw)的成员。文件系统上的权限被强制为只允许写入system用户(=所有者)和sdcard_rw组,其他人(=其他)只能读取。另请参见Is Google blocking apps writing to SD cards

通过这样做,Android除了设置正确的UID/GID进程外,它在生成应用程序后启动,其余处理在较低级别处理。不是某个组的成员的应用程序根本无法访问某些硬件。许可<的

名单>组映射:platform.xml

但是也有一些根据您的应用程序的任何签字和/或简单地通过查找您的应用程序所要求的权限也有一些(Android软件)的限制:例如ContextImpl#checkPermission() - 但必须在每个入口点检查这些权限才能执行受限制的操作。

不时有人发现如何以编程方式打开GPS,因为这样的检查在某处丢失。

+0

谢谢!关于丢失检查的最后一段,您是否提及这些发现(例如,AOSP中的论坛帖子或错误报告)? – dacongy 2012-04-29 05:02:31

+0

没有对不起,但也许http://b.android.com/有一个bugreport某处 – zapl 2012-04-29 10:42:19

+0

@AdiGuN对不起,我不明白你在说什么,你可以重述吗? – zapl 2014-04-10 17:02:42

4

关于第二段,“异常”是运行时错误。权限不在构建时执行,仅在运行时执行。

访问硬件,低级别操作系统资源和系统文件通常需要应用程序用户标识符是适当组的成员,它可以由包管理器作为具有相应android权限的结果分配。 (熟悉的例子是网络套接字,SD卡写入zapl提到的,但也是系统唯一的东西,如直接与GSM调制解调器通信或读取原始触摸屏坐标。

对于大多数通过调用库函数完成的大部分android操作,这些操作是进程间通信的存根,用于在不同进程中运行的服务,平台代码在ipc请求的接收端的更多特权进程中运行检查包管理器以确定调用应用程序是否具有必要的android权限。

许多特殊权限仅适用于使用系统签名签名的应用程序 - 即使其他应用程序在其清单中声明了这些应用程序,它们也不会被包管理器应用。