我也来说说存储权限 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
s82kd92l
V2EX    Android

我也来说说存储权限

  •  
  •   s82kd92l 2018-01-07 12:59:52 +08:00 18210 次点击
    这是一个创建于 2907 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 相对于其他读取联系人 /短信 /电话权限,存储权限并不敏感。这些 app 不会把非常重要的资料放到公共存储区域。换个角度看,用户随便删除也不会造成太大麻烦。

    2. 的确是很多 sdk 要求存储权限,连 react-native 都不免俗。参加 https://github.com/faebook/react-native/issues/5886,根据里面的描述,即使 app 开发者在 manifest 中手动把权限去掉,gradle 也会自动加入。

    3. 限制难度更大。其他权限只要在 java 和 ipc 层就能拦截,文件系统权限需要内核 /命名空间等技术。纵观所有主流桌面系统,有哪个做到隔离每个运行进程的文件系统的? Windows/OSX 上面各种权限滥用的程度要比 mobile 严重得多,随便在文件系统乱拉屎更是司空见惯,也没见大家抱怨什么。( Linux 上非开源的二进制程序没人敢随便运行,只能放到 chroot/docker 里面)

    4. 只要可开关的权限,一定会有 app 耍流氓,但仅限部分有资格刷大牌的流氓。相反如果 android 像 ios 一样一刀切,用户连文件系统都看不到,用户也不见得喜欢。(这是我不喜欢 iphone 的最大原因)

    普通用户能做的就是眼不见为净,如果空间实在不够用,推荐大家用这个: https://f-droid.org/en/packages/com.google.android.diskusage

    @rikka 感觉如果要做到重定向,最佳入口是在 app_process fork 出进程之前,和 supersu 做 mount namespace isolation 类似。另一个入口是 fuse/sdcardfs

    第 1 条附言    2018-01-07 16:00:25 +08:00
    我不是站在开发者的角度洗地,而是站在用户角度理性分析如何做到伤害最小化,同时指出一些理念上的误区。我的主要论点是:存储权限 /乱拉屎行为,可见性非常高很容易引发用户不爽,但实际伤害小于其他流氓行为。
    23 条回复    2018-01-16 20:09:42 +08:00
    est
        1
    est  
       2018-01-07 13:14:31 +08:00 via iPhone
    感觉应该可以 hook 这种乱写文件的行为。

    保留 fd 但是删除 inode 引用。进程退出就清空间
    s82kd92l
        2
    s82kd92l  
    OP
       2018-01-07 13:20:41 +08:00
    @est 那还不如直接挂到一个 tmpfs 下面,工作量小多了,也没那么容易出 bug
    iwtbauh
        3
    iwtbauh  
       2018-01-07 13:27:52 +08:00 via Android   2
    1。存储权限敏感
    拥有存储权限的 app 能够窃取、泄漏你 sd 卡上的重要数据,比如密码数据库、私钥文件(尽管他们通常是加密的,但泄漏仍然是不好的)、图片和照片
    2。存储权限除了文件管理器 app 外其他应用没有必要使用
    app 不需要任何权限就可以读写 /sdcard/Android/data/包名 目录,根本没有必要要求访问完整的 sd 卡,而这些 app/sdk 偏偏这样做了,其动机令人怀疑
    3。我们常用的类 Unix 系统上,应用程序大部分都是开源的,因此是可控的,而 Android 上我们常用的的 App 是闭源专有的
    类 Unix 系统上,应用程序使用 ~/.config ~/.cache 存放数据,不会把用户的家目录搞得一团乱麻。而反观 Android,拥有 sd 卡权限的 App 将 /sdcard 搞得乱七八糟,连加个 . 隐藏都不做,使得用户找自己文件时相当痛苦
    honeycomb
        4
    honeycomb  
       2018-01-07 13:31:38 +08:00 via Android
    @s82kd92l

    所以你也得承认,只要没有访问 sdcard 分区的权限,谁都耍不了大牌。
    这个意义上,iOS 的做法真的是最好的
    s82kd92l/td>
        6
    s82kd92l  
    OP
       2018-01-07 14:00:14 +08:00
    @iwtbauh 密码数据库 /私钥文件还是别放 sd 卡上好,推荐你用 termux,默认不使用 sdcard,其他 app 没权限读取。图片照片是没办法控制,但哪怕是流氓如百度云,在上传照片前也会要用户允许的。 至于其他我自己的文件,我是直接用 Download,在文件管理器上加个迅速进入快捷方式(很少有 Download 下面未经允许拉屎的)。然后整个 /sdcard 你就把它当成~/.config 就好。

    我不是站在开发者的角度洗地,而是站在用户角度理性分析如何做到伤害最小化,同时指出一些理念上的误区。我的主要论点是:存储权限 /乱拉屎行为,可见性非常高很容易引发用户不爽,但实际伤害小于其他流氓行为。

    @honeycomb 不管是 android 还是 ios,想做到类 cookie 式的 fingerprint 方案多的是,iOS 给人的不是安全,而是“安全错觉”.

    @htfy96 非开源 root 程序,正常人不敢用
    pq
        7
    pq  
       2018-01-07 14:01:45 +08:00
    @iwtbauh 所以,最好别在移动设备上存放任何敏感数据,比如身份证照片、密码文件之类的,怎么都防不住流氓 app 们窥视的欲望的。
    我是比较困惑把手机当钱包的这种时尚潮流的,手机这东西,现在根本毫无安全性可言。
    nicevar
        8
    nicevar  
       2018-01-07 14:07:33 +08:00
    跟 iOS 一样一刀切是不错的方案,不好的地方就是配置文件想保留的也一并删除了,所以留个特定区域给 app 写入配置文件是很好的方案
    iwtbauh
        9
    iwtbauh  
       2018-01-07 14:19:46 +08:00 via Android
    @s82kd92l
    @pq
    Android 专门给每个 App 开辟了一处“/sdcard/Android/data/包名”放文件到 sdcard,这个目录不用权限,而实际上我们进入这个目录看看,在 sdcard 乱拉屎的 App 也几乎都用了这个目录,既然 App 们都知道有这个不用申请权限就能用的目录,而且也都用上了,还嚷嚷着要 sdcard 权限,确实很过分。

    有时候把一些数据放 sdcard 很方便,也方便和电脑直接复制。

    把 /sdcard 看成 ~/.config 令人感到不爽,文件管理器加个书签只能缓解这个问题。

    我的做法是 appops,将所有没有必要用 sdcard 的 App 的 sdcard 权限都 ban 掉,唯一的问题是一些 App 会以“找不到 sdcard ”为理由拒绝运行,对于这些 App 我选择不用。
    s82kd92l
        10
    s82kd92l  
    OP
       2018-01-07 14:22:30 +08:00
    @pq 想要防偷窥是能做到的,比如 signal/snapchat 之类自己给自己发照片密码,除了 root 程序或者设备制造商没法偷窥。目前的问题是各种流氓主动把自己数据暴露给另一个流氓偷窥。

    当钱包安全性阿里腾讯比用户责任大得多,他们没把握的话是不敢推广的。
    terence4444
        11
    terence4444  
       2018-01-07 14:40:51 +08:00 via iPad
    @s82kd92l 不明白你指的 “ iOS 是安全错觉” 具体指的是什么?
    虽然 iOS 11 在隐私保护上还有点后退了,但我觉得仍然比默认的 Android 安全得多。
    est
        12
    est  
       2018-01-07 15:21:08 +08:00
    @s82kd92l tmpfs 空间有限嗯。。。2G 内存用户发来贺电。。
    honeycomb
        13
    honeycomb  
       2018-01-07 16:26:24 +08:00 via Android
    @iwtbauh 这个才是正确的!
    honeycomb
        14
    honeycomb  
       2018-01-07 17:40:01 +08:00 via Android
    @s82kd92l

    既然不能保证它们不会滥用共享储存空间,那么“解决了所有潜在可能制造问题的人”的方法也是一个务实的办法:

    Android 的不使用储存权限的办法是这样:
    1,应用在 sdcard 有一个无需权限就能访问的半私有空间。
    2,有一个 API,应用可以索取访问单个目录的许可
    但是它们不肯用。
    既然这样的话,就应该让它们什么都没有。

    至于 fingerprint 方面,需要做到
    1:应用怎么着都做不到能够获得可用于识别设备的,且能存活于重置系统的识别码。
    只允许应用获得那些可被使用者重置的识别码。

    2:
    不同应用在同一个账户上能拿到的识别码是不同的。
    同一应用在不同账户,安装-卸载-安装之间能拿到的识别码不同。

    3:如果有可供获取的,全局相同的识别码,那么要参考 adid 的使用方式。

    4,应用在任何时候都不能试图在设备上存储持久识别码。除非是 hce 等场景。
    s82kd92l
        15
    s82kd92l  
    OP
       2018-01-07 18:40:31 +08:00
    @iwtbauh 目前我手机上有两个不给存储就罢工而我还必须用的流氓,微信和高德地图。估计绝大多数人也没法不用。

    @honeycomb 用文件系统做用户追踪,效率远不如用 deviceID,用户也随时能删除文件。而控制文件权限的技术成本远高于控制 deviceID 访问(appops 对文件没法很好控制)。在这 3 个选择中:a)完全不用 b)用非开源 root app 整 c)随他去吧 我觉得 c>a>b。
    honeycomb
        16
    honeycomb  
       2018-01-07 18:49:07 +08:00 via Android
    @s82kd92l 实际上你也注意到了,举个例子:

    阿里巴巴的 utdid 库会见缝插针,会同时在 system.settings 与 sdcard 根目录储存 utdid 的值。

    拿不到 IMEI/serial 的时候这个库也能生成有效的 utdid,所以这些途径都要封掉。最后的目的是,只要不是同一个应用,utdid 不同就可以了。
    iwtbauh
        17
    iwtbauh  
       2018-01-07 19:01:19 +08:00 via Android
    @s82kd92l 高德地图没有用过,微信可以用 appops 禁用 sdcard 权限,代价是聊天记录没法保存,但我只用微信首付款不受影响,注:Play 商店中的微信,国内版不知
    EchoChan
        18
    EchoChan  
       2018-01-07 19:34:09 +08:00 via iPhone
    Google 都不想解决的事妄图开发者会规范操作。
    0x23333333
        19
    0x23333333  
       2018-01-08 08:03:35 +08:00 via Android
    1.更改 mount namespace 只能在 root 下 zygote 都没有这个权限
    2.sdcardfs/fuse 过于依赖平台

    个人感觉 注入 app_process hook IO 调用(open/mkdir) 还是可行的
    pie
        20
    pie  
       2018-01-08 08:33:35 +08:00
    @EchoChan 本来就有歪心思吧……
    @s82kd92l “纵观所有主流桌面系统,有哪个做到隔离每个运行进程的文件系统的? Windows/OSX 上面各种权限滥用的程度要比 mobile 严重得多,随便在文件系统乱拉屎更是司空见惯,也没见大家抱怨什么。” 一、没有那么多敏感数据。一般不会存各种联系人数据+位置数据+生物数据(指纹、脸、声音),真要有一个动歪脑筋的 app 在你手机上,基本上,说是全裸,不为过。二、各种工具也相对多些,别的不说,限制外网连接总是比较容易些。当然,你也可以说,真要是技术厉害的,你的桌面电脑也不是你的……这个,我也大概承认。
    s82kd92l
        21
    s82kd92l  
    OP
       2018-01-09 14:47:00 +08:00
    @pie @0x23333333 @est 这两天查了下源代码,发现 android 无论是 appops 还是本身的动态存储权限,都是通过 namespace 来实现的:
    https://android.googlesource.com/platform/frameworks/base/+/master/core/jni/com_android_internal_os_Zygote.cpp#336
    https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/AppOpsService.java#320
    https://source.android.com/devices/storage/#runtime_permissions

    要动手脚肯定是在 namespace 上容易些,hook 到 open 开销非常大,不仅仅是 sdcard 上的文件受影响,而且是打开其他包括 system/data 上的文件也会被这个 hook 降低速度.
    est
        22
    est  
       2018-01-09 15:51:11 +08:00
    @s82kd92l 思路不错。一个 app 挂一个 volumn

    换我就直接给阿里系的全部挂 tmpfs。但是内存不够用唉 ()
    s82kd92l
        23
    s82kd92l  
    OP
       2018-01-16 20:09:42 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5393 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 09:13 PVG 17:13 LAX 01:13 JFK 04:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86