本书自底向上描述了Android 的安全架构,深入探究与安全相关的Android 子系统、设备和数据组件的内部实现。其中包括包和用户管理,权限和设备策略,以及一些特殊机制——密码服务、凭据存储和安全元件的支持等。
本书面向所有对Android 安全体系架构感兴趣的读者,希望对Android 整体或子系统进行评估的安全研究员,以及致力于定制和扩展Android 的开发人员。读者最好具有Linux 系统和安卓开发的相关知识。
架构层面深度剖析移动安全的书出现了!安卓安全重要一环终于补上!
推荐序
《Android安全架构深究》一书正如其书名一样,着重从架构角度介绍 Android平台的安全机制。近几年,Android安全研究的热点一直围绕着恶意软件攻防、应用加固与逆向、支付安全、应用层与框架层漏洞挖掘和内核漏洞挖掘利用这几个方向。目前,已有数位研究者将应用逆向和应用层漏洞评估整理成书籍,但其他安全研究方向仍以碎片化的形式存在于各大安全会议或部分书籍之中。究其原因,我认为是一些高级的安全问题需要必要的平台安全机制方面的知识做铺垫,不然,初学者会感到难以上手。《Android安全架构深究》一书介绍的正是铺垫性的知识。
该书自底向上地描述了 Android的安全体系架构,深入探究与安全相关的 Android子系统、设备和数据组件的内部实现,并介绍了新引入的安全特性,如受限用户支持、全盘加密、硬件支持的凭据存储和集中式设备管理的支持。
本书前 4章首先简要介绍 Android的体系结构和安全模型。体系结构方面与其他书籍无异,介绍 Android系统重要组件的基本概念,包括 Linux内核层、Dalvik虚拟机、Java运行时库、Binder机制和 Android框架库,其中对 Binder机制的介绍较为详细。安全模型方面简要介绍了沙箱机制、应用层权限、IPC通信、多用户支持和 SELinux机制,尤其在 SELinux机制中,介绍了引入 MAC机制的必要性和 DAC机制的先天不足;并详细讲解了 Android权限的声明、使用和执行过程。开发过简单的 Android程序的人明白权限声明是怎么一回事儿,但这一部分具体阐述了当安装 App时,包管理器是如何将 App声明的权限标识记录到已安装包的核心数据库/data/system/package.xml文件中的。对于权限赋予,先将系统所有程序分为两类:高层组件(安装的 App和系统服务)和低层组件(本地进程),高层组件的权限赋予仍以包管理器通过 package.xml数据库来决定,低层组件的权限赋予依赖进程 UID、GID和补充 GID来决定。在权限执行的讲解中,作者还是按照自底向上的结构讲解内核层权限的执行、原生守护进程级别权限的执行和框架层权限的执行。实现内核层权限执行的关键在于 Android内核在普通 Linux内核访问控制机制的基础上,又增加了一些特有的访问控制机制,如对网络的访问,上层 App申请了 Internet权限后,内核层才能判断 App对应的进程是属于 inet组的(属于该组才能访问 Internet)。原生守护进程的权限执行采用标准文件系统权限机制进行权限控制。框架层权限执行正是我们熟知的 AndroidManifest.xml配置文件机制。该部分接着对四大组件的权限执行、共享用户 ID、自定义权限、四大组件声明权限进行了介绍,与基本的 Android开发无异;然后,作者详细讲解了 Android的包管理机制,包管理机制主要负责 APK包的安装和校验。在介绍 APK的安装过程之前,先介绍了 APK文件的格式和 APK文件的签名,这一部分已是老生常谈。之后针对 APK安装包的安装形式,介绍了其安装步骤:解析和验证包(从 AndroidManifest.xml中提取信息和包签名,验证 APK完整性)→接受权限和启动安装进程(显示应用申请的权限)→复制到应用程序目录( /data/)→包扫描→创建数据目录(由 installd进程负责)→生成 Optimized DEX文件( installd运行 dexopt命令)→文件和目录结构→添加到 package.xml数据库(包名、包属性、路径、权限……)→签名验证,一个 APK的安装过程大致如此;最后,介绍了 Android的多用户支持,并描述了在多用户设备上数据隔离的实现。多用户机制在 Android 4.2中就已经加入,但只支持平板模式;在 Android L中,多用户机制已支持手机模式。在该部分中,详细介绍了用户类型,每个用户类型所对应的用户元数据及对用户所有的应用程序的管理。
第 5章和第 6章介绍的是加密服务和 PKI机制,这两部分作为安全架构的重要组成部分同时也是 Android安全开发所关注的内容。 Android上的加密服务主要依赖 JCA引擎,在介绍加密服务的章节中,该书对 JCA引擎类中重要的类方法进行了较为细致的介绍,如安全随机数 SecureRandom、消息摘要 MessageDigest、签名 Signature、加密算法 Cipher和密钥 Key等。PKI机制一直在网络安全中扮演重要角色,在 Java语言中, Java安全套接字扩展 JSSE实现了 SSL和 TLS协议,并提供数据加密、服务器验证、消息完整性和可选客户端验证等机制。Android上 JSSE的实现极大地方便了开发人员在 Android App中部署 PKI方案。该章节对 Android JSSE实现的描述,对开发人员有着重要的参考意义。
接下来,该书详细介绍了 Android系统中引入的新的安全特性,比如硬件支持的凭据存储、集中式设备管理的支持和全盘加密技术的实现。在凭据存储部分,介绍了 Android的凭据存储,并介绍了提供给应用的安全存储密钥的 API。对于在线账户管理,本书详细分析了账户管理在 Android系统中的具体实现和认证模块的具体细节。在集中式设备管理方面,本书详细介绍了 Android VPN技术的各个细节和 Wi-Fi EAP认证的具体方法,这对开发企业安全应用有着重要的参考价值。随后的设备安全部分,介绍了验证启动( verified boot)、磁盘加密和 Android锁屏的实现,并展示了安全 USB调试和设备加密备份的实现。接着概述了 Android的 NFC栈,深入探究了安全元件( SE)的集成及其 API,并介绍了基于主机的卡模拟(HCE)。以上介绍的安全机制被引入 Android系统的时间并不长,而且,目前对这些技术的公开详细介绍并不多见。该书对这些新的安全机制的介绍不仅为安全研viii Android安全架构深究究人员提供了新的研究方向,还为开发人员运用这些新的安全机制提供了重要的参考。
在该书的最后一部分,作者详述了 Android平台引入的最为重要的安全机制 ——SELinux。众所周知,SELinux是 Linux 2.6内核引入的一个全新的安全机制,不同于 Linux DAC机制,它是一种强制访问控制 MAC机制。从 Android 4.3开始, Android基于 SELinux机制,实现了 SEAndroid机制来加强系统安全性。为了能让读者对 SEAndroid有更细致的了解,作者先对 SELinux的实现细节做了详细描述,包括 SELinux的架构、SELinux模式、安全上下文、策略声明、类型转换和域转换等。接着描述了 Android上的实现,最后介绍了Android 4.4的SELinux策略。至此,从简要介绍 SELinux的架构和策略语言开始,详细讲解为集成进Android,SELinux 所做的改进,并概述了Android基础的SELinux策略,一步一步让读者对 Android平台的 SELinux机制有更清晰的认识。
总的来说,《Android安全架构深究》一书对 Android平台的安全机制做了较为细致的剖析。全书专注于对 Android平台重要安全机制的分析,尤其对新引进的安全机制的分析弥补了该方面的空白,这无论是对新手还是对安全有一定研究的人员和开发者都具有重要的参考价值。
——Only_Guest(张瑞冬) 四川无声双螺旋安全研究院院长、攻防实验室负责人
序
在 Android 4.0 Ice Cream Sandwich发布之后,我第一次发现 Nikolay在 Android安全方面所做的高质量工作。那时,我需要一些对 Android新引入的备份机制的更好解释,因为我对 Android新版本添加的特性和备份文件格式掌握得不够透彻,所以在编写漏洞的利用代码时非常纠结。他睿智、深入的解析帮助我深入理解了这些问题,使我快速编写了漏洞利用代码,并快速对量产设备中的漏洞打上了补丁。自此之后,我经常造访他的博客,并以其来温故知新。
当我很荣幸地被邀请撰写此序时,我真的不敢相信虽然我已致力于 Android安全多年,但还是从这本书里学到了这么多东西,而事实确实如此。当我阅读并消化了一些我曾认为已经彻底了解的主题的新信息时,我的脑海中会经常浮现我曾遗漏了的问题和更好的解决方法。为什么在我最初专注于 Android之时,就没有一本像这样的参考书呢?
这本书向读者娓娓展开了包罗万象的安全主题:从 Android权限与沙箱机制到 Android SELinux实现—— SEAndroid。本书提供了非常优秀的微妙细节和罕见特性的解说,例如 dm-verity。当细读此书之后,你将会像我一样对 Android安全特性有更深入的理解。本书将在我办公室的书架上永久占据一席之地。
Jon “jcase” Sawyer Applied Cybersecurity有限责任公司 CTO 写于华盛顿安吉利斯港
关于作者
Nikolay Elenkov过去十年一直致力于企业安全的项目,开发过从智能卡、 HSM到 Windows平台、Linux服务器等各种平台下的安全软件。 Android面世之后,他便很快对 Android产生了浓厚的兴趣,并且在 Android 1.5版本发布之后一直在开发 Android应用。 Android 4.0发布之后,Nikolay更加关注Android系统内部实现细节,并且在过去的三年中,他一直在其博客( http://nelenkov.blogspot.com/)上整理发布他的发现并撰写与 Android安全相关的文章。
关于技术审校
从 2009年开始, Kenny Root就一直是 Android平台的核心贡献者,他一直专注于安全和加密方面。他是 Android第一个 SSH应用 ConnectBot的作者,并且一直是一个非常积极的开源贡献者。在研究软件的闲暇时间,他会与妻子和两个孩子共度美好时光。他同时是斯坦福大学、哥伦比亚大学、香港中文大学和贝克大学的校友,他出生并成长在拥有最好户外烧烤环境的堪萨斯城。
致谢
感谢出版社参与此书出版的所有人。尤其感谢 Bill Pollock,他使我杂乱无章的文字变得更加可读,以及 Alison Law的耐心将之出版为一本真正的书籍。
特别感谢 Kenny Root复审了所有章节的内容,并分享了某些 Android安全特性的背景故事。
感谢 Jorrit“Chainfire”Jongma对 SuperSU的维护工作,以及对 13章相关部分的复审工作。
感谢 Jon“jcase”Sawyer不断地对我们关于 Android安全的设想的质疑,并感谢他为本书作序。