【问题标题】:how are android security permissions checked at run-time?如何在运行时检查 android 安全权限?
【发布时间】:2012-05-09 06:33:31
【问题描述】:

这个问题之前已经在How does Android enforce permissions? 提出过。虽然那里的讨论很好,但问题仍然没有得到完全回答。

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

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

【问题讨论】:

标签: android security permissions


【解决方案1】:

Android 使用许多标准 Linux(-kernel?)机制,尤其是在硬件限制方面。

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

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

通过这样做,Android 几乎不需要做任何事情,除了设置应用程序启动后它生成的进程的正确 UID/GID 之外,其余的都在较低级别处理。不属于某个组的应用程序根本无法访问某些硬件。

权限列表组映射:platform.xml

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

有时人们会发现一些方法,例如以编程方式打开 GPS,因为某处缺少这样的检查。

【讨论】:

  • 谢谢!关于最后一段关于缺失检查的内容,您是否引用了这些发现(例如,AOSP 中的论坛帖子或错误报告)?
  • @AdiGuN 对不起,我不明白你在说什么,你能改一下吗?
  • @zapl 对不起。我不好,你的回答似乎很贴切,当我写评论时我很困惑。 :D
【解决方案2】:

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

访问硬件、低级操作系统资源和系统文件通常要求应用用户 ID 是适当组的成员,该组可能由包管理器分配,因为具有相应的 android 权限。 (常见的例子是网络套接字和 zapl 提到的 sdcard 写入,还有系统专用的东西,比如直接与 GSM 调制解调器对话或读取原始触摸屏坐标)。

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

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

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    相关资源
    最近更新 更多