V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pk000
V2EX  ›  Android

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

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

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

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

    没深入接触过,有文档吗?
    honeycomb
        10
    honeycomb  
       2019-02-19 08:41:46 +08:00 via Android
    3,有,rikka 写的 storage redirect,依赖于 magisk
    ysc3839
        12
    ysc3839  
       2019-02-19 08:51:23 +08:00 via Android
    (1) 和 (2) 严格来说都不行。
    Android 有分私有存储空间和共享存储空间 (这两个词可能不是官方的称呼,仅仅是我自己的称呼)。
    私有存储空间是每个应用单独分开的,其中的数据在正常情况下只有应用自身才能访问,其他应用要访问的话必须要 root 才行,在这里读写数据不需要用户授权。
    共享存储空间不单独分开,不过其中 ./Android/data/包名 / 的目录下可以看作是为应用单独划分的空间,在这里读写数据也不需要授权。读写其他地方则需要授权,而且能读写这块“单独划分”的空间。
    所以实际上 (1) 和 (2) 能不能实现还要看应用如何设计的,如果把数据全都放在共享存储空间中那是能被授权了的程序读取的。
    (3) 可以使用 存储重定向 https://play.google.com/store/apps/details?id=moe.shizuku.redirectstorage
    pk000
        13
    pk000  
    OP
       2019-02-19 09:13:21 +08:00 via Android
    @ysc3839
    共享存储空间不单独分开,不过其中 ./Android/data/包名 / 的目录下可以看作是为应用单独划分的空间,在这里读写数据也不需要授权。读写其他地方则需要授权,而且能读写这块“单独划分”的空间。
    这个是不是说,应用 A 有存储授权的情况下,可以读取./Android/data/B 包名 /内应用 B 的数据?
    TomVista
        14
    TomVista  
       2019-02-19 09:16:28 +08:00
    @ysc3839 问一下,在 /data 下的应用私有路径无法被其他应用申请访问,那么在 /sdcard/android 目录下的应用私有路径可以被申请权限访问吗?
    yukiww233
        15
    yukiww233  
       2019-02-19 09:25:50 +08:00   ❤️ 1
    @pk000 #13
    有存储权限可以访问其他应用的 Android/data/packagename 目录
    敏感数据是在 /data/package name,这个才是私有的
    qwlhappy
        16
    qwlhappy  
       2019-02-19 10:01:18 +08:00
    #2 说得对。
    存储权限对应的是 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 吧...是不是加个外部就不会有理解上的问题了。正常情况下安卓会保护各个应用独立的沙箱环境的
    skylancer
        17
    skylancer  
       2019-02-19 10:10:26 +08:00
    上面说(1)不可以的怕是忘了科恩强奸支付宝那单事情
    skylancer
        18
    skylancer  
       2019-02-19 10:11:33 +08:00
    不过 /data/data/[package]是不可能访问的,只是能访问 /data/media/xxx/(/sdcard)的数据而已
    catalina
        19
    catalina  
       2019-02-19 10:20:19 +08:00   ❤️ 7
    补充一下:
    (以下内容以 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
        20
    catalina  
       2019-02-19 10:34:54 +08:00
    我去,v2 把我的排版彻底毁了!
    zcm3579
        21
    zcm3579  
       2019-02-19 10:52:27 +08:00
    然而 B 应用按照储存规范把数据存在 sdcard/Android/data/包名 里面, 但还是能被获取了存储权限的应用访问读取 , 这点才是最骚的
    est
        22
    est  
       2019-02-19 10:59:16 +08:00
    @fan123199 没错!
    honeycomb
        23
    honeycomb  
       2019-02-19 11:42:17 +08:00 via Android
    @catalina 现在 storage redirect 已经这么厉害啦?
    skylancer
        24
    skylancer  
       2019-02-19 12:02:55 +08:00
    @catalina 规规矩矩申请是很正常的,因为你当前进程上下文不能直接提升至 root,直接用 root 来处理比你乖乖申请权限其实要麻烦的多
    pk000
        25
    pk000  
    OP
       2019-02-19 14:29:53 +08:00 via Android
    @catalina v2 把你的排版毁了,但是看上去依旧很清晰,讲解得很明白!谢谢解答。
    catalina
        26
    catalina  
       2019-02-19 14:42:41 +08:00 via Android   ❤️ 1
    @honeycomb
    呃。。。我的这个版本是出去后用 ApkPure 下载的。至于版本号。。。太长,直接看截图吧。。。
    https://imgchr.com/i/kgmR0g
    https://imgchr.com/i/kgmW7Q
    还有,为啥这么厉害,可以问 @RikkaW


    @skylancer 好的,谢谢告知。
    honeycomb
        27
    honeycomb  
       2019-02-19 16:31:03 +08:00 via Android
    @catalina 应该是我很长时间没关注 storage redirect 导致的
    ysc3839
        28
    ysc3839  
       2019-02-19 19:27:37 +08:00 via Android   ❤️ 1
    @pk000 是的。
    @TomVista 可以。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2897 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:07 · PVG 11:07 · LAX 19:07 · JFK 22:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.