什么是“应用数据隔离”?它如何防止恶意应用窃取数据?
解读
面试官想知道两点:
- 你是否清楚 Android 把每个应用当成“独立用户”来管理;
- 当攻击者尝试跨进程、跨存储甚至跨用户读取数据时,系统到底在哪几道门把他拦住。
回答时要体现“国内场景”——国内 ROM 普遍把 GMS 抽掉、加入自己的权限管家与分身空间,但底层仍依赖 Linux UID/GID + SELinux + 沙箱,因此必须点出“国产定制并没有推翻原生安全模型,只是再包一层”。
知识点
- Linux UID/GID 级隔离:安装时 PackageManager 为每个包分配唯一 UID,内核以 UID 为边界做文件系统权限判定。
- 应用沙箱(App Sandbox):/data/data/包名、/data/user_de/包名、/data/user/多用户实例 目录默认 700,其他 UID 无法 ls。
- SELinux MAC:即使 root 拿到 UID 0,在未进入 permissive 域前也无法直接访问 app_data_file 标签的目录。
- Binder IPC 签名校验:自定义 Service 先在 ServiceManager 注册,调用方通过包名 + 签名在白名单里才能拿到接口,防止伪装应用绑定。
- 权限模型与签名级 permission:android:protectionLevel=signature 的自定义权限只有同签名应用可获得,避免恶意程序声明后任意调用。
- FileProvider 与 ContentProvider grantUriPermission:一次性的 FLAG_GRANT_READ_URI_PERMISSION 把文件脱敏成临时 url,拒绝遍历目录。
- 国内 ROM 增强:MIUI“权限使用记录”、EMUI“沙箱访问审计”、ColorOS“隐私保险箱”都在内核 audit 日志之上再做可视化,面试时提一句表示你了解国内生态。
- 存储空间隔离(Scoped Storage,Android 10+):/sdcard 被 FUSE 重挂载,应用只能看到本包目录 + MediaStore 中自己创建的文件,阻断“遍历微信图片”类攻击。
- 多用户/工作资料:创建“工作资料”后,Personal 与 Work profile 的 UID 空间分开,交叉访问需 DevicePolicyManager 显式授权,国内政企项目常用。
- TEE + Keystore 密钥隔离:即使应用数据被拖走,AES 密钥在 StrongBox 里,密文无法离线解密。
答案
“应用数据隔离”是 Android 安全模型的第一道闸,核心思想是“一个应用一个用户”。
系统在安装 APK 时通过 PackageManager 为其分配独一无二的 Linux UID,并把私有目录置为 700 权限;内核层的 UID/GID 判定与 SELinux 强制访问控制叠加,确保即使同一台手机上的其他应用拿到 shell 权限,也无法直接读取该目录。
如果应用需要把数据暴露给外部,它只能使用 Binder 机制的四大组件之一,并在 Manifest 中显式声明权限;调用方必须动态申请且经用户同意,否则框架层会直接抛出 SecurityException。
对于真正敏感的数据,国内项目通常再加一道设备管理策略:把业务 APK 放进工作资料(Work Profile),利用多用户 UID 空间隔离,配合企业 MDM 关闭 adb 调试,这样即便恶意应用利用侧载手段进入个人空间,也触碰不到工作空间的沙箱。
最后,存储空间隔离(Scoped Storage)把外部存储切成碎片,应用只能访问媒体集里自己创建的行号,阻断传统“遍历 /sdcard/DCIM/WeiXin”式批量窃取。
通过“UID 级文件隔离 + SELinux MAC + 权限系统 + 存储沙箱”四层纵深,Android 把恶意应用窃取数据的攻击面压缩到最小。
拓展思考
- 国内无 GMS,推送通道集中在厂商联盟,很多 App 把敏感 token 放在 sharedUserId 相同的模块里。若面试官追问“sharedUserId 会降低隔离吗”,可答:只有同签名且显式声明相同 sharedUserId 的包才能共享 UID,攻击者无法伪造签名;但国内渠道包混杂,建议用 SDK 方式拆分而非 sharedUserId。
- 折叠屏/多窗口场景下,分屏的两个应用虽可见对方界面,但仍分属不同 UID,DragEvent 传递的 ClipData 若含 URI 必须再次 grantUriPermission,防止“拖一下就把文件拖走”。
- 未来隐私沙盒(Privacy Sandbox on Android)引入 Topics 与 FLEDGE,把广告相关数据放进系统级沙箱,应用侧再也拿不到原始 GAID,面试时补充这一点可展示你对最新公版动向的关注。