总贴 在这里。

支持文件系统隔离

我们管这个叫做文件沙盒。其实android的沙盒是不彻底的,因为sdcard下的路径全部APP共享。 到了android 8,App就算不用外部sdcard也可以放一堆东西,通过FileProvider也可以提供跨应用的数据。但是正如大家诟病的,许多APP还是会申请sdcard的读写权限。
我们在测试的过程中,发现某些安全库,会写死一些边边角角的可读写的地方,去放东西,这个很恶心。

哦,说句题外话,android系统的东西都是放在/data/data下的,许多奇奇的目录都是符号连接,rm -rf /data/data/* 就可以达到出厂设置的效果。

ok,我们的方案是怎么做的呢,有几个点:

  • 要根据上文的instance_no,来新建文件目录
  • 在zygote初始化的时候动态mount新建的目录,设置这个目录可读写
  • 在kernel中,如果是多开进程的文件访问,都给截获,重新映射到这个mount的目录

instance_no部分上一篇博客说了,mount部分是这样做的:
在zygote的 pid_t pid = fork() pid != 0之后

if (access (abs_path, F_OK) < 0) {ALOGW ("Zg: Target path %s for %s does not exist: err=%d, skip it.", abs_path, source_path, errno);continue;
}if (TEMP_FAILURE_RETRY (mount (source_path, abs_path, NULL, MS_BIND, NULL)) < 0) {ALOGE ("Zg: Failed to mount %s to %s: err=%d", source_path, abs_path, errno);closedir (app_root);RuntimeAbort (env);
}

值得一提的是,zygote fork进程之后,通过设置

SetCapabilities(env, permittedCapabilities, effectiveCapabilities);

把linux上的权限给阉割了,这也是为什么su 要在另外一个进程执行的原因(因为zygote 建出来的进程就没有任何权限)

kernel部分,主要是修改syscall部分。就是把open、access等系统调调的时候,获取标识位,看看是不是hook过的,如果是的话,就映射下读取路径。这样的话,/data/data 下的文件路径就被映射到我们上面mount的路径中去了。

kernel/fs/open.c

#ifdef CONFIG_INTERCEPT_FILE_SYSCALLS/* Lionfore for ML. Sep 11th, 2017 */if (this_process_should_be_intercepted ()) {xd_access_syscall_req_t req;xd_access_syscall_res_t rsp;res = __filename_absolute_path (dfd, filename, lookup_flags, req.path);if (res < 0)goto __trace_syscall; /* Lionfore for ML. Sep 15th, 2017 */req.hdr.type = XD_ACCESS_SYSCALL_REQ;req.hdr.len = sizeof req;req.hdr.pid = current->pid;req.hdr.app_tag = get_process_inst_no (current);req.mode = mode;req.uid = __kuid_val (current_cred ()->euid);req.gid = __kgid_val (current_cred ()->egid);rsp.hdr.len = sizeof rsp;res = intercept_syscall (&req.hdr, &rsp.hdr);if (res < 0)goto __trace_syscall; /* Lionfore for ML. Sep 15th, 2017 */if (rsp.hdr.err < 0) {res = rsp.hdr.err;goto __trace_syscall; /* Lionfore for ML. Sep 15th, 2017 */}}
#endif

需要注意的是 readlink 这个系统调用也要改,代码在

kernel/fs/namei.c

关于软连接和硬连接的介绍,看这里

小结一下。上面介绍了通过zygotekernel的系统调用的修改。在打开新应用的时候动态创建目录,动态映射目录,做到了文件系统隔离的效果。

其实在android8之后,规范的写android,机会可以不用用到外部存储,所以应用里面的简单沙盒其实是够用的。

不够用的时候,可能是出于 唯一标识 && 安全 方面的考量。

  • 比如我在每个碎片话的系统(mi,huawei、魅族)在一些边边角角可读可写的目录,用户不会清理到的地方,放一点自定义文件,存着key,然后全家桶都用这个key来作为用户标识。
  • 如果在两个不同的账号下同时读到同一个key,那就是多开了:)

android虚拟手机云之三:文件沙盒相关推荐

  1. android虚拟手机云之一:总述

    年前福哥离开了,今天和强哥交接了下代码.强哥从头介绍了下项目,挺伤感的.我也记一下强哥的介绍,加上我自己的理解,理清下整个虚拟手机云项目.下面是给我自己的笔记.希望以后在改到android框架的时候能 ...

  2. IOS数据存储之文件沙盒存储

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...

  3. iOS文件(沙盒目录,文件创建、移动、复制等)

    目录获取 获取沙盒的主目录路径: + (NSString *)homeDir {return NSHomeDirectory(); } 复制代码 获取沙盒中Documents的目录路径: + (NSS ...

  4. 重置 Android 虚拟手机

    Stack Overflow 上的回答: https://stackoverflow.com/questions/9810560/how-do-i-restart-an-android-emulato ...

  5. android 模拟器手机如何添加文件到sd卡?

    在DDMS中直接添加文件到模拟器sd卡如果出现错误类似:Failed to push XXXXX.txt on emulator- : Read-only file system的错误,原因是你的sd ...

  6. android 查看手机存储空间以及文件状态及大小

    1,df df或者df -h df命令能够输出当前目录文件夹的状态以及大小,-h能够保证大小以kb,Gb等我们能够熟悉的单位进行显示. 输出如下: Filesystem 1K-blocks Used ...

  7. Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)...

    一.前言 去年年底支付宝的被克隆漏洞被爆出,无独有偶就是腾讯干的,其实真正了解这个事件之后会发现,感觉是针对支付宝.因为这个漏洞找出肯定花费了很大劲,主要是因为支付宝的特殊业务需要开启了WebView ...

  8. ios沙箱软件_ios真机和模拟器沙盒文件(一)

    版本记录 版本号 时间 V1.0 2017.06.11 前言 我们有时候需要在沙盒中存储东西,所以总有需求就是查看沙盒文件里面存储的文件,这就需要我们查看沙盒文件,沙盒文件包括真机的沙盒文件和模拟器的 ...

  9. Windows沙盒技术调研

    转载自:移动云开发者社区 一. Windows沙盒技术介绍 Windows沙盒提供了轻型桌面环境,可安全地隔离运行应用程序. 沙盒环境中Windows软件保持"沙盒"状态,并独立于 ...

最新文章

  1. centos6.5下部署用于生产的hadoop,并使用C语言API连接hadoop
  2. Java Optional 的 orElse() 和 orElseGet() 的区别
  3. C++11 多线程相关知识的学习
  4. linux send 失败_Epoll学习服务器的实现-Linux内核原始Epoll结构
  5. ajax post 提交无法进入controller 请求200
  6. c语言结构体菜单显示框架,请教c语言结构体嵌套问题。field `atItem' has incomplete type...
  7. Android版本Oppo电视,OPPO 智能电视 R1
  8. 如何将 Mac 置入睡眠状态或唤醒 Mac?
  9. 整流四 -三相PWM整流器的工作原理分析
  10. JDBC 实现数据库增删改查
  11. 如何在Ubuntu 20.04上安装和使用Docker
  12. lombok get/set 方法未生效,解决办法
  13. 考驾照--驾驶证考试
  14. 增值电信业务经营许可证办理续期流程
  15. 用变量定义数组的几个方法
  16. 交通安全综合服务管理平台
  17. html中如何倒圆角,html – 在CSS中颠倒圆角?
  18. 以IM为例看58同城典型技术架构演变
  19. 谷歌X最新开源任务驱动的类级别机器人抓取CaTGrasp!
  20. 64位W7系统安装内存8G,但是系统只显示3.2G,是怎么回事?

热门文章

  1. 双系统:Windows和Linux合二为一
  2. python中set()函数的用法,python中set()函数简介及实例解析
  3. matlab end用法
  4. 我所理解的线程和进程
  5. Arduino 机械爪 (适合初学者-舵机-蓝牙-触点开关-小喇叭)
  6. pycharm从安装到全副武装,学起来才嗖嗖的快,图片超多,因为过度详细!
  7. windows 2003 下的 apache(2.2.23)+tomcat(7.0.35)+php(5.3.21) 集成
  8. 关于后盾网yii框架的学习小结(10)--使用AR类的增删改查
  9. 物联12:rfid超高频和微波天线技术
  10. 用lua 实现一个 nginx 负载均衡