文章摘要
Android通过Linux权限机制保护App私有数据:每个App被分配唯一UID,其私有目录(如/data/data/<package_name>)权限设为700(仅所有者可访问)。进程运行时以该UID身份操作文件,内核会检查访问者UID与文件所有者是否匹配。由于其他App具有不同UID,即使知道路径也会被拒绝访问(Permission denied)。SELinux和root限制进一步加固安全,确保数据隔离。这种基于Linux用户-权限模型的机制,使App只能访问自身私有数据。
1. Linux用户与权限模型
Android系统基于Linux内核。Linux的文件权限模型是安全的基础:
- 每个文件/目录都有所有者(owner)、**所属组(group)和其他用户(others)**的权限设置(读r、写w、执行x)。
- 每个进程都以某个用户(UID)身份运行,访问文件时,内核会检查进程的UID与文件的owner UID是否一致。
2. App安装与UID分配
- Android为每个App分配一个唯一的Linux UID(如10056、10057等)。
- App进程启动时,系统会以该UID身份运行进程。
3. 私有目录的权限设置
- App的私有目录为
/data/data/<package_name>/
。 - 该目录的权限通常为
drwx------
(即700),所有者为App的UID。 - 目录下的文件权限一般为
-rw-------
(即600),所有者同样为App的UID。
例如:
drwx------ 3 u0_a123 u0_a123 4096 2024-06-01 10:00 com.example.app
其中u0_a123
就是App的UID。
4. 访问控制原理
- 当App进程尝试访问
/data/data/<package_name>/
目录或其下文件时,Linux内核会检查:- 进程的UID是否等于文件/目录的owner UID。
- 权限位是否允许该操作(如读、写、执行)。
- 只有UID一致的进程(即本App进程)才能访问这些文件,其他App(不同UID)即使知道路径也无法访问,尝试访问会被内核拒绝(返回Permission denied)。
5. 其他机制的补充保护
- SELinux:进一步细化了进程和文件的访问策略,防止越权访问。
- root权限:只有root用户(UID=0)可以访问所有文件,但普通App无法获得root权限。
6. 总结
本App UID可访问App私有数据的原理就是:
- Android为每个App分配唯一UID,App进程以该UID运行。
- App私有目录和文件的所有者UID就是App的UID,权限设置为仅owner可访问。
- Linux内核在每次文件访问时检查UID和权限位,只有本App进程(同UID)才能访问自己的私有数据,其他App进程(不同UID)无法访问。