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. Nginx之简介与安装(一)
  2. 给谷歌浏览器安装vue调试工具:vue-devtools
  3. nssl1258-naive的瓶子【贪心】
  4. java有理数类的封装_java实验报告有理数的类封装.doc
  5. NB-IoT---(0) NB-IoT技术
  6. CF540 B 贪心
  7. 一文入门区块链相关知识
  8. 常见问题一:Ext.Net的缓存与session值在当前页总是不变
  9. 自定义注解+AOP,优雅的打印方法接受和返回的参数内容
  10. web漏洞扫描器原理_面向WEB的分布式漏洞扫描器的设计与实践
  11. 内连接和外连接的区别
  12. cfiledialog对话框大小_CFileDialog类 通用对话框
  13. Fabric官方教程(release 2.2)翻译及总结——使用CouchDB
  14. wim工具扫描linux磁盘,WimTool Pro(WIM映像处理工具)
  15. 如何管理团队任务?如何跟踪任务进度?2023全新任务交办场景手册(免费领取)
  16. 修改linux xorg端口,修改/etc/X11/xorg.conf 调整分辨率为1024 768
  17. [图论] 平面图 平面性的判定
  18. Web全栈~09.JavaScript入门
  19. sublime简要笔记
  20. 零基础入门--中文实体关系抽取(BiLSTM+attention,含代码)

热门文章

  1. javaScript写的飞机大战小游戏
  2. 【网络安全管理员三级鉴定题】一
  3. u盘不小心格式化了怎么办?用u盘数据恢复软件
  4. 石油工业计算机应用是核心期刊吗,石油工业计算机应用杂志
  5. 精益生产的奥秘 -- 优思学院
  6. 计算机组成原理储存器系统实验,计算机组成原理实验存储器.ppt
  7. 计算机互联网络板书,初中信息技术:计算机互联网络》教学设计
  8. USB简述(Linux驱动开发篇)
  9. 大數據:到2020年您應該知道的70個令人難以置信的免費數據源
  10. 如何保护SSL证书的私钥安全?