沙箱(sandbox)是为执行中的程序提供隔离环境的一种安全机制。它通过严格控制执行的程序所访问的资源,以确保系统的安全。
1 基于Linux的权限模型
Android sandbox本质是为了实现不同应用程序之间的互相隔离,而这种隔离策略是通过让不同的应用程序运行于各自己的虚拟机进程中实现的。
UID/GID权限模型
Android中对文件资源的访问仍遵循Linux的UID/GID权限模型方式进行权限控制。Android将所有uid和gid资源统一为AID(system/core/include/private/android_filesystem_config.h)。应用程序隔离
类似Linux中的用户隔离策略(UID识别用户,确定访问权限),Android中通过DAC权限模型来实现应用程序的隔离(UID识别应用程序,确定权限权限)。Android在安装应用程序时向其分配UID,并保持不变。
2 Android沙箱模型
2.1 应用程序在独立进程(独享UID)
沙箱内的应用程序运行于独立的虚拟机进程中,该进程独享应用程序的资源且无法访问系统和其他应用程序的资源。
2.2 应用程序在共享进程(共享UID)
任何系统无法避免应用程序间共享资源的需求,在Android系统中共享UID是实现资源共享的一种方式。
Android应用程序中要实现UID共享需要满足以下之一:
- 共享的应用程序配置相同的manifest属性(即添加android:sharedUserId)
- 共享的应用做相同的签名(即Android.mk中增加LOCAL_CERTIFICATE)
3 总结
- Android是一个多用户的Linux系统,其每一个应用程序都是一个用户
- 系统默认赋予每个应用以唯一的UID,只有系统授权的UID可访问该应用的所有文件
- 每个进程都有独立的虚拟机,因此应用代码运行于相互隔离的环境中
- 每个应用运行于其进程内,Android系统来启动和关闭该应用
- 应用程序可通过共享UID和请求授权实现数据共享和访问系统服务:
1 https://developer.android.com/guide/components/fundamentals.html
2 http://blog.csdn.net/ljheee/article/details/53191397