|
发布人:Android 安全团队 Jeff Vander Stoep
Android 高度依赖 Linux 内核来增强其安全模型。为了更好地保护这个内核,我们已经在 Android 系统中启用了一系列保护机制。概括地讲,保护机制可分为内存保护和减少攻击面这两大类。
内存保护
内核提供的重要安全功能之一是以地址空间分离的形式为用户空间进程提供内存保护。不同于用户空间进程,内核中的各项任务都在同一个地址空间内运行,内核中任意位置上的漏洞都可能会影响系统内存中与其无关的部分。内核的内存保护机制设计用于在存在漏洞的情况下仍能保持内核的完整性。
1. 将内存标记为只读/不可执行
该功能将内核内存划分为多个逻辑区段,并限定每个区段的页访问权限。将代码标记为只读可执行。将数据区段标记为不可执行,并进一步将其细分为只读区段和读写区段。该功能通过配置选项 CONFIG_DEBUG_RODATA 启用。该功能是由 Kees Cook 汇集 Grsecurity 中的 KERNEXEC 部分功能(由 Brad Spengler 实现)和 Qualcomm 的 CONFIG_STRICT_MEMORY_RWX 部分功能(由 Larry Bassel 和 Laura Abbott 合作实现)而实现的。位于 arm/arm64 上游内核的 CONFIG_DEBUG_RODATA 已向后移植到 Android 的 3.18+ arm/arm64 通用内核。
2. 限制内核对用户空间的访问
该功能通过阻止内核直接访问用户空间内存来增强对内核的保护。这样可以增大许多攻击的难度,这是因为攻击者对于可执行的内核内存(特别是启用 CONFIG_DEBUG_RODATA 的内存)的控制力要弱得多。类似的功能已经存在,Grsecurity 的 UDEREF 最早提供了此项功能。该功能通过配置选项 CONFIG_CPU_SW_DOMAIN_PAN 启用,由 Russell King 完成了该功能的 ARMv7 实现,并由 Russell King 向后移植到 Android 4.1 内核。
3. 增强对堆叠缓冲区的溢出保护
与其前身 stack-protector 非常类似,stack-protector-strong 不但可以防止系统出现堆叠缓冲区溢出,还额外提供对更多数组类型的保护,而其前身仅保护字符型数组。Stack-protector-strong 由 Han Shan 实现并添加到 gcc 4.9 编译器。
减少攻击面
减少攻击面试图在不破坏合法功能的情况下尽量减少暴露内核的入口点。减少攻击面可以包括删除代码、取消对入口点的访问权或者选择性地曝光功能。
1. 取消对调试功能的默认访问权
内核的 Perf 系统提供了性能测量基础架构,可用于分析内核和用户空间的应用。虽然 Perf 对开发者而言是个非常有用的工具,但对绝大多数的 Android 用户而言,它会增大不必要的攻击面。在 Android Nougat 中,默认情况下将会阻止访问 Perf。开发者仍可以通过启用开发者设置,然后使用 adb 设置“adb shell setprop security.perf_harden 0”属性来访问 Perf。
用于阻止访问 Perf 的补丁集可分解为内核和用户空间两部分。内核补丁由 Ben Hutchings 实现,派生自 Grsecurity 的 CONFIG_GRKERNSEC_PERF_HARDEN(由 Brad Spengler 实现)。对于用户空间的更改则来自 Daniel Micay 的贡献。在此感谢 Wish Wu 以及其他负责发现 Perf 安全漏洞的人士。
2. 限制应用访问 ioctl 命令
很多 Android 安全模型都是由 SELinux 进行说明和强制执行的。系统调用 ioctl() 表示 SELinux 粒度执行中的重大缺陷。现已新增 SELinux 的 Ioctl 命令白名单,作为对 SELinux 系统调用 ioctl 进行逐条命令控制的手段。
报告的有关 Android 的大多数内核漏洞都出现在驱动程序中,使用 ioctl 系统调用均可找到,例如 CVE-2016-0820。第三方应用可能需要用到某些 ioctl 命令,但大多数 ioctl 命令都不会用到,因此,可以限制访问这些命令,而不会破坏合法功能。在 Android Nougat 中,只有少数被列入 ioctl 套接字命令白名单中的命令可供应用使用。对于部分设备,应用对 GPU ioctl 命令的访问也具有类似限制。
3. 要求支持 seccomp-bpf
Seccomp 提供了额外的沙盒机制,允许进程使用可配置的过滤器来限制系统调用和系统调用参数。限制系统调用的可用性可以显著减小内核暴露的攻击面。seccomp 最初是在运行 Lollipop 的 Nexus 设备上引入的,自那以后,我们始终在稳步提升其在整个 Android 生态系统中的可用性。在 Android Nougat 中,所有设备都要求支持 seccomp。在 Android Nougat 中,我们将 seccomp 引入 mediaextractor 和 mediacodec 进程,这也是媒体加固项目的一部分。
不懈努力
我们还在开展其他保护内核的项目:
- 内核自我保护项目旨在开发针对上游内核的运行时和编译器防护功能。
- 而在 AOSP 中,我们正在进一步收紧沙箱和减少 SELinux 攻击面。
- Minijail 提供了一种便利机制,用于应用内核提供的多个遏制和沙盒功能,包括 seccomp 过滤器和命名空间。
- kasan 和 kcov 之类的项目则会帮助模糊器发现引起崩溃的根本原因,并智能地构建能够增大代码覆盖范围的测试用例,最终实现更高效的缺陷跟踪过程。
我们期望,通过这些努力和其他措施,能够不断提高内核的安全性。我们一如既往地感谢您对我们工作的反馈,欢迎就改进 Android 提供宝贵建议。请通过 security@android.com 联系我们。
|
|