Android 系统的安全模型

admin 2022年2月5日11:07:17评论122 views字数 2458阅读8分11秒阅读模式
Android 系统的安全模型
简介


Linux 是一个多用户操作系统,主要安全目标是使不同的用户相互隔离, 例如不同用户创建的文件相互无法访问,不同用户创建的程序不会相互的耗尽内存或CPU资源(参考操作系统的死锁)。


Android 系统虽然基于 Liunx 内核,但是并不像 LInux 系统那样多用户,而是将Linux 用户管理机制用到了 APP的沙箱设计中, 用于隔离不同的APP。除少数特例, 每个APP 都在各自的沙箱中运行。因此, Android 系统有效隔离了不同的APP 以及APP 与操作系统的其他部分, 这也成为了 Android 系统的基本安全模型。


在这个基础上,Android 系统又在设计时考虑了多方面的安全因素来保障系统的安全性,尤其是在 Android  4.3 版本之后, 实现了 SElinux安全机制,形成了 SE Android 系统(NSA牵头,后被合入主版本)。


Android 系统的安全模型
Android 用户管理


一般来说, 在Linux 系统中, 可以注册多个物理用户, 每个用户都会分配一个特定的UID, 不同的用户均可以登录系统、安装APP、存储和读取文件、执行shell命令、开启后台系统服务进程等操作, 且互不影响。


Android 虽然继承了Linux 系统的多用户隔离特性,但是这种特性与一般的 Linux 系统不同。因为Android  是私人设备,一个手机不会被多人使用,因此Android 实际上并不需要 支持多物理用户共同使用。所以Android将Linux 的多物理用户隔离机制用到了 APP的隔离管理中, 将分配给物理用户的UID 分配给了 运行在Android 系统中的APP ,从而达到了隔离不用APP的效果,奠定了Android 沙箱的基础。


一般来说,Android 为APP 分配的UID在 10000和 99999之间, 并根据UID为APP生成用户名, 使用id 命令就可以查看APP的和GID信息。

如果APP申请的权限被授权,则相应权限所在组的GID 会被添加到 APP的进程中, 其中GID 与权限的对应关系在系统文件 platform.xml中定义。


举例说明:一个APP的GID 有一个是 inet(3003), 则 inet 组对应的权限是 android.permission.INTERNET, 反映出该APP 具有网络访问权限。

<permission name="android.permission.INTERNET">  <group gid="inet"></permission><permission name="android.permission.READ_LOGS">  <group gid="log"></permission><permission name="android.permission.READ_EXTERNAL_STORACE">  <group gid="sdcard_r">    <group gid="sdcard_rw"></permission>


为了满足平板等设备多物理用户的使用需求, 从Android 4.2 开始,在除了手机以外的其他设备均支持多物理用户的使用。由于LInux 的多用户管理特性已经被 Android  用于APP管理, 所以Android 在上层通过用户管理系统服务(UserManagerService), 重新实现了多用户管理。关于Android  是否支持多物理用户, 可以在 Android 源代码的 UserHandle.java中查看 MU_ENABLED 是否设置为 true


Public static fianl Boolean MU_ENABLED = true


在多用户使用的情况下, 不同用户可能安装相同的APP, 在前述的运行模式下,不同用户安装相同的APP 时,系统里的UID 是相同的。为了区分不同的用户安装的APP ,Android 会为每一个安装的APP生成一个新的UID,  保证了即使不同的用户安装了相同的APP, 各自的新“UID”也不会相同,进而获取相互隔离的运行沙箱。


面向多用户的 “UID”使用过物理用户的ID 和对应的程序ID计算得到的,其中在单物理用户系统下,APPID就是UID,具体的计算方法在 UserHandle.java中找到。

public static finale int getuid(int userid , int appId){  if(MU_ENABLED){      return  userId*PER_USER_RANG E+ (app      Id%PER_USER_RANG)}else{      return appId}}




Android 系统的安全模型
Android  系统沙箱


Android 系统的安全模型


Android 为APP 分配UID, 根据UID 的不同来对不同的APP进行隔离, 将不同的APP分配到不同的沙箱之中。除此之外,Android 沙箱还对APP在存储空间上的安装目录进行限制,不同APP 空间无法互相访问文件,包括文件的读取和写入。

我们可以把沙箱形象的理解为房间, UID 相当于钥匙,Android 为不同的APP 提供了一个独立的房间,APP通过UID进入各自的房间,房间之间互相隔离。


当APP安装成功之后, 系统会分配一个UID, UID的值在 /data/system/packages.xml文件中,当APP 或者他的组件需要运行时, 系统便为其创建一个标识该APP UID的进程, 进程实例化一个Dalvik 虚拟机来执行APP的字节码,不同的APP 在各自的 Dalvik 虚拟机中运行。


APP 在安装之后会在单用户设备的 /data/data/ 目录下, 多用户设备在 /data/user/userID 目录下, 以自身的包名为文件名创建文件夹, 存放APP运行所需的文件和资源。系统用UID 标识 /data/data/[packsges-name] 或者 /data/user/userID[packsges-name]  目录该APP的相关资源, 系统设置权限之后, 非该UID的APP 进程无法访问该UID 标识的文件和资源。


Android 系统的安全模型





Android 系统的安全模型


原文始发于微信公众号(无界信安):Android 系统的安全模型

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月5日11:07:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Android 系统的安全模型https://cn-sec.com/archives/764983.html

发表评论

匿名网友 填写信息