Android安全学习笔记1-系统设计与架构
安卓架构
一、Android系统架构
-
Android总体架构分为五层:应用层、框架层、Dalvik虚拟机层、用户空间原生代码层、linux内核层。
DalvikVM是一种基于寄存器的虚拟机,为底层操作系统提供抽象层。
二、安全边界和安全策略
- 安全边界是系统中分隔不同信任级别的特殊区域,如内核空间和用户空间的边界。
- Android使用两套权限模型:
- 底层 - Android沙箱,使用用户和用户组对文件系统实体进行访问控制;
- 上层 - 用DalvikVM和Android框架实现,定义应用拥有的权限。
- Android沙箱
- 核心机制:标准Linux进程隔离、大多数进程拥有唯一UID、严格限制文件系统权限。
- Android ID(AID)映射表:我的理解是 - 不同AID字段代表特定权限,该字段可以映射到某个特定的进程ID或辅助用户组 ,即表示某些进程或用户组具有该权限。
- Android权限模型:API权限、文件系统权限、IPC权限
- 应用权限由PackageManager在安装应用时从AndroidManifest.xml中提取,并存储在/data/system/packatges.xml中。
- 权限至用户组映射表存储在/etc/permissions/platform.cml 中,被用来确定应用设置的辅助用户组GID。
- API权限:存在于Android API、框架层、第三方框架等。
- 文件系统权限:依赖于严格的Unix文件系统权限模型,每个文件/文件夹具有唯一对应的用户和用户组。
- IPC权限:设计应用组件之间的通信。
- 安卓各层次理解:
- 应用层:
- 分类:预装应用与用户自装应用,统一保存在/data/app目录下
- 预安装应用包经过特殊平台**签名,具有system权限。
- 应用组件介绍:
- AndroidManifest:包括
- 唯一的包名、版本、Activity/Service/BroadcastReceiver等定义、权限申明、外部程序库信息、其他支持性指令。
- Intent:一种消息对象,用来进行应用间传递信息,如调用浏览器、电话等。
- Activity:界面UI
- BroadcastReceiver:在应用希望接受某一匹配特定标准的隐式Intent时出现。可以注册一个Receiver并使用Intent Filter来匹配android.provider.Telephony.SMS_RECEIVED动作。
- Service:一类后台运行组件,无直接交互。通过Intent来触发停止、启动、绑定等动作。
- Content Provider:为通用、共享数据存储提供结构化访问接口,如联系人、日历等信息。开发过程中可自定义某些共享数据的访问权限。
- 框架层:
- 定义:各种执行通用任务的组件——包、类、管理器等。
- DalvikVM:
- 基于寄存器,应用执行过程为:java代码 -> 编译成.class文件 -> 翻译成DEX可执行文件 -> 交由DalvikVM执行。
- 第一次启动的DEX文件会被经过特定优化转为ODEX文件,该文件无法在不同设备通用。
- DalvikVM通过Java Native Interface(JNI)与底层原生代码交互。
- 系统启动流程:Zygote运行 -> Zygote启动以特权权限运行的system_server进程 -> 启动其他服务及Android框架 。
- 用户空间原生代码层
- 两大组件:程序库和核心系统服务。
- 程序库 :Android框架层中许多高层类库依赖的底层功能是通过共享程序库的方式实现,并通过JNI访问的。
- Bionic库可以探索一下,因为开发不完全可能导致各种神奇的攻击?
-
核心服务 :指简历基本操作系统环境的服务与Android原生组件。
- init:对用户空间环境初始化。/init.rc
- Property服务:位于Android的初始化服务中,可通过getprop和setprop进行读取和设置。
- 无线接口层(RIL):通讯功能用。
- debuggerd崩溃报告守护进程:打开到Android日志功能的一个连接 -> 在抽象命名空间套接字监听客户端连入 -> 程序运行 -> 连接器安装信号处理程序 -> 崩溃发送 -> 捕获到信号 -> 内核执行信号处理函数 debugger_signal_handler( )连接到由DEBUGGER_SOCKET_NAME定义的套接字上 -> 链接器通知debuggerd目标进程崩溃 -> debuggerd调用处理流程 -> 创建崩溃报告。
- ADB(Android 调试桥)
- Volume守护进程:负责安装和卸载文件系统的服务(包括ASEC和OBB)。
- 其他服务
- 应用层: