Android安全权限如何在运行时进行检查?

5

这个问题之前在How does Android enforce permissions?上被问及过。虽然那里的讨论很好,但该问题仍未得到充分回答。

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

我猜它最可能是在核心框架中完成的,或许需要本地代码支持,但我不知道AOSP中哪些源代码文件与此相关。


我也在寻找同样的答案。最终在书籍《Android安全内幕》中找到了一份非常好的解释:http://shop.oreilly.com/product/9781593275815.do,请仔细阅读“权限管理”一章。 - Ankur Bhatia
2个回答

14

Android在硬件限制方面使用了许多标准的Linux(内核?)机制。

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

如果您在清单中请求WRITE_EXTERNAL_STORAGE,则您的应用程序还将成为具有写入该存储权限的组(称为sdcard_rw)的成员。 文件系统上的权限受到强制执行,只允许向system用户(=所有者)和sdcard_rw组进行写入,其他任何人(=其他)只能读取。 另请参见Google是否阻止应用程序写入SD卡

通过这样做,Android几乎什么都不需要做,除了在应用程序启动并产生进程时设置正确的UID / GID之外,其余部分都在较低的级别处理。 不是某个组的成员的应用程序将无法访问某些硬件。

权限<>组映射列表:platform.xml

还有一些(Android软件)限制,这些限制基于您的应用程序的签名和/或仅通过查找您的应用程序请求的权限:例如ContextImpl#checkPermission() - 但必须在允许受限制的操作的每个入口点检查这些权限。

不时会有人发现某些缺少此类检查的方式,以便例如程序化地打开GPS。


谢谢!关于最后一段提到的缺失检查,您是否有这些发现的参考资料(例如AOSP中的论坛帖子或错误报告)? - dacongy
@AdiGuN 抱歉,我不明白你的意思,请重新表述一下? - zapl
@zapl 对不起,我的错。你的回答似乎很恰当,我在写评论时有些困惑。 :D - Adi GuN

4
关于您的第二段,“异常”是指运行时错误。权限不是在构建时执行,而是在运行时执行。
访问硬件、低级操作系统资源和系统文件通常需要应用程序用户ID成为适当组的成员,这可能是由包管理器分配的相应Android权限的结果。(熟悉的例子是网络套接字和zapl提到的sdcard写入,但还有一些仅限于系统的东西,如直接与GSM调制解调器通信或读取原始触摸屏坐标)。
对于通过调用库函数完成的大多数Android操作,这些函数是运行在不同进程中的服务之间的进程间通信的存根,接收ipc请求的更高特权进程中运行的平台代码会检查包管理器,以确定调用应用程序是否具有必要的Android权限。
许多特殊权限仅对使用系统签名的应用程序可用-即使另一个应用程序在其清单中声明了这些权限,包管理器也不会应用它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接