Android中的应用沙箱和UID

参考:
《Android安全架构深究(美)NIKOLAY ELENKOV》

Linux 用户和用户组管理:
https://www.runoob.com/linux/linux-user-manage.html

Android系统多用户:
https://blog.csdn.net/qq_14978113/article/details/94654401

1 Linux中的UID

Linux系统是一个多用户的操作系统。任何一个物理用户,必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

一个用户不能访问其他用户的文件(除非有明确的授权)。

每个进程以启动它的用户UID和GID运行(例外情况是当可执行文件的SUID或SGID被设置时)。

也就是说,Linux中的UID主要是用来 区分不同物理用户和系统守护进程 的。

这里需要注意,在Linux系统中,一个UID可以被分配给某个通过shell执行命令的物理用户,也可以被分配给某个系统服务守护进程。这是因为,守护进程通常可以通过网络被访问, 每个守护进程使用专用的UID,可以降低守护进程被攻击后带来的损失。

2 Android中的UID

2.1 UID的作用

Android 最初是为智能手机设计的, 由于智能手机是私人设备, 所以不需要区分物理用户。所以 UID被用来区别应用程序。这构成了Android应用程序沙箱的基础。

在每个app的安装阶段, Android自动为每个app赋予一个专属的UID该UID的值是恒定的。app执行时就在自身UID对应的进程内运行。

另外, 每个app都有一个只有它具有读写权限的私有数据目录

因此, 安卓app是隔离的,包括进程级隔离(分别运行在各自的进程中) 和文件级隔离(具有私有的数据目录)。

系统服务和应用程序都在恒定的UID 下运行。例如,重启手机后,各服务/应用的UID不会发生变化。

2.2 UID与用户名

  • 系统服务的UID从1000开始;1000是AID_SYSTEM,具有一些特殊权限
  • 应用程序的UID从10000开始;10000是AID_APP
    • 在不支持多用户的Android中,UID对应的用户名是app_XXX,其中XXX是UID从AID_APP起的偏移。
    • 在支持多用户的Android中(Android 从4.2 开始真正支持多用户),UID对应的用户名是uY_aXXX,其中Y是当前物理用户的user ID,XXX是UID从AID_APP起的偏移。

例如,10037 UID对应的用户名可以是u0_a37,其中0是当前物理用户的user ID,37是10037-10000。Android的主用户(所谓“机主”)的user ID为0,之后添加的新用户的user ID从10开始递增。比如,新添加的第一个用户的user ID是10,第二个用户是11。

如下,添加新用户后,使用ps -A,能看到user ID为10的用户:

重启系统后,app的UID和用户名不变,如下面的com.oneplus.faceunlock:

2.3 UID的存储

app的UID会被写入/data/system/packages.list
例如对于com.oneplus.faceunlock:

com.oneplus.faceunlock 10122 0 /data/user/0/com.oneplus.faceunlock default:privapp:targetSdkVersion=28 none 0 20390141

这里:
第一个字段com.oneplus.faceunlock是包名,
第二个字段10122是应用 UID ,
第三个字段0是调试标志位 (1表示可调试),
第四个字段/data/user/0/com.oneplus.faceunlock是app的数据目录路径,
第五个字段default:privapp:targetSdkVersion=28是seinfo标签(由SELinux使用)。
第六个字段none是supplementary GID 列表。每个 GID 通常与一个A ndroid 权限相关联,GID 列表基于赋给应用程序的权限而产生。

普通用户app,例如:

com.atominvention.rootchecker 10236 0 /data/user/0/com.atominvention.rootchecker default:targetSdkVersion=26 3003 0 2

2.4 共享UID

应用程序可以使用同一个 UID 安装,叫作共享UID,在这种情况下,它们共享文件,甚至在同一个进程中运行

为模块化考虑,共享用户ID被广泛应用系统app之间,因为系统app需要在不同的包之间共享使用相同资源。

比如,在Android 4.4中,系统UI和键盘锁(实现锁屏)共享同一 个 UID 10012:

grep ‘10012’ /data/system/packages.list
com.android.keyguard 10012 0 /data/data/com.android.keyguard platform 1028,1015,1035,3002,3001
com.android.systemui 10012 0 /data/data/com.android.systemui platform 1028,1015,1035,3002,3001

共享用户ID 对第三方app来说也是可用的。

为共享同一个UID,app需要使用同一个开发者密钥进行代码签名。

共享UID不可以追加,只有应用一开始就设计使用UID才行。

2.5 特殊UID

参考:https://blog.csdn.net/SweetTool/article/details/72864229

AID_ROOT是0

可以通过检测系统中的特权文件来判断设备的Root状态,例如Root过的设备中通常会增加一些uid为0(root用户的UID)的文件。

【Android安全】Android中的应用沙箱和UID | Android多用户相关推荐

  1. 微信扫码 android sdk,H5中js-sdk扫码功能,Android手机微信中无法调用扫码?

    我的H5对接微信JS-SDK中的扫码功能,发现在Android手机微信中无法调用扫码功能,在苹果手机微信中可以使用. 报如下错误: errMsg:scanQRCode:permissi on deni ...

  2. Android实例开发中如何创建第一个项目(android studio)

    当我们配置好android环境后,如何创建第一个项目,每一项代表了什么意思,这里以Android studio 为例,其他软件如eclipse等是类似的操作 当我们安装好AS后 这里我们选择第一项 其 ...

  3. Android 8.0学习(31)---Android 8.0 中的 ART 功能改进

    Android 8.0 中的 ART 功能改进 在 Android 8.0 版本中,Android Runtime (ART) 有了极大改进.下面的列表总结了设备制造商可以在 ART 中获得的增强功能 ...

  4. android程序root权限,android应用程序中应用root权限

    android应用程序中使用root权限 要在android应用程序中使用root权限,那么运行程序的设备必须具有root权限. http://www.eoeandroid.com/code/2012 ...

  5. android单例模式代码,设计模式(一):Android 源码中的单例模式

    设计模式(一):Android 源码中的单例模式 2020-08-17 22:51 阅读数 57 <>什么是单例模式? 单例模式(Singleton) 是最常见也最简单的设计模式,它的目的 ...

  6. Android 在xml中更改纯色图片颜色

    Android 在xml中更改纯色图片颜色 使用Android:tint属性,设置想要的颜色,就是发现纯色图片变为设置的颜色了

  7. 设计模式(一):Android 源码中的单例模式

    什么是单例模式? 单例模式(Singleton) 是最常见也最简单的设计模式,它的目的就是在全局只生成一个类的实例. 什么场合用单例模式 应用中经常有多任务进行信息共享的需求,比如火车票售卖示例中,多 ...

  8. android preference-headers 字体颜色,android 批改preference中view属性(title,summary字体颜色等)...

    当前位置:我的异常网» Android » android 批改preference中view属性(title,summary字 android 批改preference中view属性(title,s ...

  9. Android 10 根文件系统和编译系统(十八):Android.bp语法

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:AOSP Android10.0 设备:Android x86模拟器 前言 由于make在编译时表现出效率不够高.增 ...

最新文章

  1. .Net Core分布式部署中的DataProtection密钥安全性
  2. 网络爬虫--11.XPath和lxml
  3. 计算机网络应用是学什么类型的,计算机网路中服务类型及应用
  4. 利用ambassador实现container跨主机连接
  5. atheros蓝牙设备驱动 小米_双十一值得买的蓝牙耳机,真无线蓝牙耳机音质排行榜...
  6. PCA(主成分分析)和FA(因子分析)区别
  7. JavaScript:Web APIsDOMBOM
  8. Visual Studio 最常用的13个快捷键
  9. 阿里云正式发布云原生人才培养合作计划
  10. 大学生计算机vfp,计算机vfp教学课件
  11. 火绒软件+软媒雷达(win10,弥补了火绒无优化内存服务)
  12. ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤
  13. 高中补习数学:导数与函数的综合问题(2019年测试题)
  14. (转)男人的梦想之野性篇 什么是真正的越野车
  15. Excel 中超链接转换为相应的 URL
  16. PTA(接口)用java写 7-10 房屋、住宅、写字楼类
  17. 【单片机】含有闹钟的时钟设计
  18. 不蒜子实现网站访问量访客数统计
  19. 允许或禁止未知来源apk的安装
  20. python求圆柱表面积_ZZULIOJ.1011: 圆柱体表面积 —— 1021:三个整数的最大值(C语言 Vs Python)...

热门文章

  1. 编程设计思路怎么写_微商软文怎么写吸引人?写作高手的内功心法
  2. 程序员的9个经验教训,只有亲身经历才会懂
  3. js 唤端(js唤起手机App)
  4. 前端项目设置点击手机号码唤起拨号功能
  5. android支付宝客户端html5网页偶尔无法自动关闭问题
  6. Java二手交易平台
  7. Express框架介绍_李孟_新浪博客
  8. 百度云管家不用客户端下载大文件
  9. 数组中find的用法
  10. 在IE右键添加菜单项和任务栏按钮