授予存储权限能否保证应用数据隔离?

2019-02-19 08:10:45 +08:00
 pk000
很多 Android APP 没有按照设计规范,强制要求授予存储权限才运行。
( 1 )假设应用 A 强制要求存储权限才运行;应用 B 符合设计规范,不需要存储权限即可运行。那么授予了应用 A 存储权限,A 是否可以任意访问应用 B 的所有数据?
( 2 )应用 A 与应用 B 均安装在 Shelter 创建的 Work Profile 内,授予了应用 A 存储权限,A 是否可以任意访问应用 B 的所有数据?
( 3 )是否存在权限管理办法,限制授予了存储权限的应用访问其他应用的数据?
8341 次点击
所在节点    Android
28 条回复
loading
2019-02-19 08:15:06 +08:00
除非 B 应用牺牲存储性能,做了二次加密。
fan123199
2019-02-19 08:23:05 +08:00
1,不可以,除非 b 把数据存在公共区域。
2,没听过 shelter,搜了下,好像是沙箱 app,但理论上也是不可以。
3,本来就不行
codingadog
2019-02-19 08:26:16 +08:00
1 )不可以
2 )可以
3 )向你安利一下 storage redirect
fan123199
2019-02-19 08:26:31 +08:00
其实这个不规范,很多是 CSDN 造成的。(手动 doge,玩笑话)。上面的内容比较陈旧,大家开发时直接 xopy 过来,能运行就行。哪管你什么权限、隐私、目录结构等。
codingadog
2019-02-19 08:27:14 +08:00
2 我不清楚,蒙的🤣
greenskinmonster
2019-02-19 08:31:37 +08:00
3,root 后用存储重定向。

其实很多应用可以用 App Ops 忽略读 /写存储的权限,这样就不会向公共区域读写文件。大多数应用忽略存储权限后,也能正常运行。
TomVista
2019-02-19 08:33:14 +08:00
"不需要存储权限即可运行".
我想问一下,从开发角度,应用不需要存储权限即可运行吗?
我开发移动端用的 hbuilder,最小权限中有存储权限.
codingadog
2019-02-19 08:34:25 +08:00
@TomVista 不然 Android 的应用缓存是干什么用的呢
TomVista
2019-02-19 08:41:42 +08:00
@codingadog 应用缓存不属于存储权限吗? 我用 localstorage 存到本地....

存储权限是指那些权限啊?

没深入接触过,有文档吗?
honeycomb
2019-02-19 08:41:46 +08:00
3,有,rikka 写的 storage redirect,依赖于 magisk
greenskinmonster
2019-02-19 08:50:31 +08:00
ysc3839
2019-02-19 08:51:23 +08:00
(1) 和 (2) 严格来说都不行。
Android 有分私有存储空间和共享存储空间 (这两个词可能不是官方的称呼,仅仅是我自己的称呼)。
私有存储空间是每个应用单独分开的,其中的数据在正常情况下只有应用自身才能访问,其他应用要访问的话必须要 root 才行,在这里读写数据不需要用户授权。
共享存储空间不单独分开,不过其中 ./Android/data/包名 / 的目录下可以看作是为应用单独划分的空间,在这里读写数据也不需要授权。读写其他地方则需要授权,而且能读写这块“单独划分”的空间。
所以实际上 (1) 和 (2) 能不能实现还要看应用如何设计的,如果把数据全都放在共享存储空间中那是能被授权了的程序读取的。
(3) 可以使用 存储重定向 https://play.google.com/store/apps/details?id=moe.shizuku.redirectstorage
pk000
2019-02-19 09:13:21 +08:00
@ysc3839
共享存储空间不单独分开,不过其中 ./Android/data/包名 / 的目录下可以看作是为应用单独划分的空间,在这里读写数据也不需要授权。读写其他地方则需要授权,而且能读写这块“单独划分”的空间。
这个是不是说,应用 A 有存储授权的情况下,可以读取./Android/data/B 包名 /内应用 B 的数据?
TomVista
2019-02-19 09:16:28 +08:00
@ysc3839 问一下,在 /data 下的应用私有路径无法被其他应用申请访问,那么在 /sdcard/android 目录下的应用私有路径可以被申请权限访问吗?
yukiww233
2019-02-19 09:25:50 +08:00
@pk000 #13
有存储权限可以访问其他应用的 Android/data/packagename 目录
敏感数据是在 /data/package name,这个才是私有的
qwlhappy
2019-02-19 10:01:18 +08:00
#2 说得对。
存储权限对应的是 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 吧...是不是加个外部就不会有理解上的问题了。正常情况下安卓会保护各个应用独立的沙箱环境的
skylancer
2019-02-19 10:10:26 +08:00
上面说(1)不可以的怕是忘了科恩强奸支付宝那单事情
skylancer
2019-02-19 10:11:33 +08:00
不过 /data/data/[package]是不可能访问的,只是能访问 /data/media/xxx/(/sdcard)的数据而已
catalina
2019-02-19 10:20:19 +08:00
补充一下:
(以下内容以 Android6 以后为例,前期版本可能没有多用户功能*、或者 /sdcard/干脆就是闪存上直接分出来一块)

对应用来说,Android 有两个存储空间:

一个是用户公共存储空间(/data/media/$user_id/,映射为 /storage/emulated/$user_id/和该应用所在用户的 /sdcard),下称公共空间;

一个是用户私有存储空间(/data/user/user_id/$package_name/)。

(以上,$user_id 为用户的用户 id,机主为 0,Work Profile 一般为 10,部分系统自带的双开应用功能也会使用其他的用户 id 保存数据,$package_name 为应用的包名。)

(!!!切记!用户 id 与 Linux/android 系统的 uid 不同!!!)

应用使用私有空间存储数据不需要任何权限,应用使用公共存储空间前需要向系统申请权限(读取需要 android.permission.READ_EXTERNAL_STORAGE,写入需要 android.permission.WRITE_EXTERNAL_STORAGE )。

写在公共存储空间中的任何数据都可以被其它申请了公共空间读权限的应用访问到!!!

使用 su 提权获得 root 权限的应用可以获得对 /(根目录)的读写权限,同时执行 mount -o remount,rw /system 可以重新挂载 /system 以获取读写权限,因此对于获得了 root 权限的应用,数据隔离机制不起作用。(虽然实验发现,即使获得了 root 权限,这些应用还是在规规矩矩地申请公共存储权限。)

在系统启动的情况下,用户可管理的数据,只有公共存储空间这么一部分。

因此,情况如下*3:
假设:A 申请了公共空间读写权限,B 没有申请,C 申请了公共读写和 root 权限。A、B、C 安装在同一个用户下。
访问者 A 的公有数据 A 的私有数据 B 的私有数据
A rw- rwx ---
B --- --- rwx
C rw- rwx rwx
(注:r 读,w 写,x 执行,公有空间以 noexec 参数挂载,所以无法执行任何程序)

假设:A、B 均申请了公共空间读写权限。无应用申请 root 权限。A、C 安装在同一个用户下。
访问者 A 的公有数据 A 的私有数据 B 的公有数据 B 的私有数据
A rw- rwx rw- ---
B rw- --- rw- rwx

假设:A 申请了公共空间读写权限,B 没有申请,C 申请了公共读写和 root 权限,D 申请了公共读写权限。A、B 安装在同一个用户(假设为机主)下,C、D 安装在 Work Profile 内。
访问者 A 公 A 私 B 私 C 公 C 私 D 公 D 私
A rw- rwx --- --- --- --- ---
B --- --- rwx --- --- --- ---
C rw-*4 rwx rwx rw- rwx rw- rwx
D --- --- --- rw- --- rw- rwx

注解:
* 需要注意的是,设置里面没有多用户功能,不意味着没有!!!如果你的系统能使用 Work Profile*2,那么你的系统就有多用户功能
*2 Shelter、Island 均为 Work Profile 的具体应用,在 Island 内=在 Work Profile 内
*3 访问权限根据“应用的能力”,即通过回答一系列“什么应用想干什么能成功?”来得出结论
*4 C 对机主用户的公共空间的读写通过对 /data/media/0 的访问进行



@honeycomb 并不,storage 的 basic mode 使用 magisksu 或者 supersu 都可运行,虽然高级功能需要 magisk 模块 Riru 支持。


** 我尽力了,但排版还是不太好看
catalina
2019-02-19 10:34:54 +08:00
我去,v2 把我的排版彻底毁了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/536361

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX