利用更多的Linux内核防御保护Android

原文来自: Android Developers Blog —— Protecting Android with more Linux kernel defenses

Android主要依赖于Linux内核的安全​​模式执行。为了更好的保护好内核,我们在Android内启用了一系列的机制,在较高的等级下这些保护在一个组中被划分为两类——内存保护和减少攻击面。

内存保护

通过内核提供的主要安全功能之一,是对于用户空间进程在地址空间分离的形式进行内存保护。不像用户空间进程,内核的各种任务生活在一个地址空间,并且一个漏洞无论在内核的任意位置,可以潜在的影响到系统存储器的无关部分。内核内存保护是保持内核的完整性,不管漏洞而被设计。

标记内存为只读/不执行

这个功能细分内核内存到逻辑部分,并设置在每一个部分的限制页面访问权限。代码标记为只读+执行。数据片段被标记为不执行,并且进一步分段成只读和读写片段。这个功能特性利用配置选项CONFIG_DEBUG_RODATA进行启用。它是通过Kees Cook一起输入,是基于由Brad Spengler的Grsecurity的KENRNEXE功能的一个子集和Larry Bassel和Laura Abbott的高通的CONFIG_STRICT_MEMORY_RWX feature功能。CONFIG_DEBUG_RODATA在内核上游登陆对于arm/arm64,并且已经回迁到Android的3.18+arm/arm64常见的内核。

RESTRICT内核访问到用户空间

这个功能通过防止它直接访问用户空间内存来提高内核的保护。它能够使一系列的攻击变得更加困难,因为攻击者在内核内存有显著较少的控制可以去执行,尤其是利用CONFIG_DEBUG_RODATA启用。类似的功能已经存在,最早存在的是Grsecurity的UDEREF。这个功能可以利用配置选项CONFIG_CPU_SW_DOMAIN_PAN被启用,并且对于ARMv7是通过Russell King被实施,回迁到Android的4.1内核通过Kees Cook.

加强保护防止堆栈缓冲区溢出

就像它的前身,堆栈保护器.加强堆栈保护防止堆栈缓冲区溢出。但另外提供覆盖对于更多数组类型,因为原来只有保护的字符数组,加强堆栈保护是由Han Shan被实施,并加入到GCC编译器4.9

减少攻击面

减少攻击面,试图揭露较少的入口点到内核,而不会打破合法的功能。减少攻击面能够包括移除代码,移除访问入口点,或者选择性地曝光功能。

移除默认的调试访问功能

内核的perf系统对于性能测试提供基础设施,可用于分析内核和用户空间的应用程序。Perf是一个为开发人员提供了有价值的工具,但是对于绝大多数的Andr​​oid用户添加了不必要的攻击面。在Android牛轧糖,访问perf将会默认被阻止。开发者仍可以通过启用开发者选项和使用adb设置一个配置:”adb shell setprop security.perf_harden 0”进行启用访问。

为阻止访问perf的补丁集可被分解成内核和用户空间部分。内核补丁是通过Ben Hutchings并且是从Grsecurity的CONFIG_GRKERNSEC_PERF_HARDEN通过Brad Spengler被派生。用户控件是由Daniel Micay作出了贡献。感谢Wish Wu和其他对于在perf里负责任披露安全漏洞的其他人。

限制应用程序访问ioctl命令

很多Android安全模型是由SELinux进行描述和强制执行的。ioctl()系统调用代表了一大空白在强制粒度来源于SELinux。ioctl命令白名单和SELinux被添加作为一种手段来通过SELinux提供在ioctl系统命令控制.

在Android上,大多数内核漏洞报告发生在驱动程序和ioctl系统调用使用均达到。例如CVE-2016-0820.一些ioctl命令是需要通过第三方应用,但大多数都没有和访问能够不破坏合法的功能会受到限制。在Android牛轧糖,仅仅一小白名单套接字ioctl命令对于应用是可用的。对于选择的设备,应用的访问到GPU(图形处理器)的ioctl访问已经被受到类似的限制。

需要SECCOMP-BPF

Seccomp提供了一个额外的沙箱机制,允许一个进程使用可配在的过滤器来限制可用的系统调用和系统调用参数。限制系统调用的可用性可以显著的降低内核的攻击暴露的表面。自从Seccomp首次在棒棒糖的Nexus设备上被介绍,其整个Android生态系统的可用性稳步提高。Android牛轧糖,seccomp支持所有设备的请求。在Android牛轧糖上,我们正在使用seccomp在mediaextractor和mediacodec过程作为媒体硬化努力的一部分。

不断努力

这儿有其他一些针对于保护内核正在进行的项目:

  • 内核自身的保护项目是开发运行时和编译防御的上游内核。
  • 正在AOSP中进行对SELinux进一步的沙箱收紧和减少攻击面的操作。
  • Minijail提供了一个方便的机制,将内核提供的众多遏制和沙箱功能,包括过滤器的seccomp和命名空间。
  • kasankcov帮助模糊器发现崩溃的根本原因,并智能地构建测试用例增加代码覆盖率,最终导致更有效的缺陷跟踪过程。

由于这些努力和其他人,我们预计内核的安全​​性继续改善。在我们的工作上我们赞赏反馈,对于我们如何提高Android欢迎提出建议,在security@android.com和我们联系。

以上是对Anroid 官网博客文章的翻译,如果不足,欢迎指正,谢谢。

0%