Skip to content

Latest commit

 

History

History
71 lines (49 loc) · 5.32 KB

File metadata and controls

71 lines (49 loc) · 5.32 KB

加强Android Oreo内核

原标题:Hardening the Kernel in Android Oreo
链接:https://android-developers.googleblog.com/2017/08/hardening-kernel-in-android-oreo.html
作者:Sami Tolvanen (Android安全高级软件工程师)
翻译:arjinmc

Android用户空间的加强越来越多地使底层的Linux内核成为攻击者更有吸引力的目标。因此,去年在内核中发现了超过三分之一的Android安全漏洞。在Android 8.0(Oreo)中,重要的努力已经加强了内核,以减少安全漏洞的数量和影响。

Android Nougat致力于通过添加SELinux ioctl过滤与用户空间进程隔离来保护内核,并需要使用seccomp-bpf支持,允许应用程序在处理不受信任的输入时过滤对可用系统调用的访问。Android 8.0专注于内核自我保护,四个安全强化功能从上游Linux返回到首次发行的设备中支持的所有Android内核。

硬化Usercopy

内核使用Usercopy功能将数据从用户空间传输到内核空间内存并重新进行。自2014年以来,缺少或无效的边界检查已经造成Android的内核漏洞约占45%。硬化Usercopy对用户复制功能添加了边界检查,这有助于开发者在其代码中发现误用和修复错误。此外,如果模糊的驱动程序错误通过,加强这些功能可以防止这种bug被利用。

该功能在上游内核版本4.8中引入,我们已经将其转移到Android内核3.18及更高版本。

int buggy_driver_function(void __user *src, size_t size)
{
    /* potential size_t overflow (don’t do this) */
    u8 *buf = kmalloc(size * N, GPF_KERNEL);
    …
    /* results in buf smaller than size, and a heap overflow */
    if (copy_from_user(buf, src, size))
    return -EFAULT;

    /* never reached with CONFIG_HARDENED_USERCOPY=y */
}

强化usercopy防止的安全问题的示例

特权访问从不(PAN)模拟器

虽然强化usercopy功能有助于查找和减轻安全问题,但只有在开发者实际使用它们的情况下,它们才有帮助 目前,所有内核代码(包括驱动程序)都可以直接访问用户空间内存,从而导致各种安全问题。

为了减轻这一点,CPU供应商在x86中引入了Supervisor Mode Access Prevention(SMAP)和ARM v8.1中的Privileged Access Never(PAN)特性。这些功能可防止内核直接访问用户空间,并确保开发者执行usercopy功能。不幸的是,这些硬件功能在大多数Android用户今天的设备中尚未广泛使用。

上游Linux引入了ARM内核版本4.3ARM64中的4.10PAN软件模拟器。我们已经将这两个功能都从3.18开始向Android内核汇出。

与强化usercopy一起,PAN模拟器帮助在Pixel设备中找到并修复了四个内核驱动程序中的错误。

int buggy_driver_copy_data(struct mydata *src, void __user *ptr)
{
    /* failure to keep track of user space pointers */
    struct mydata *dst = (struct mydata *)ptr;
    …
    /* read/write from/to an arbitrary user space memory location */
    dst->field = … ;    /* use copy_(from|to)_user instead! *//* never reached with PAN (emulation) or SMAP */
}

PAN模拟器减轻的安全问题的一个例子。

内核地址空间布局随机化(KASLR)

Android已经包括对地址空间布局随机化(ASLR)的支持多年。随机存储器布局使得代码重用攻击具有概率性,因此攻(https://lwn.net/Articles/569635/),但是从64位开始,[ARM64 KASLR](https://lwn.net/Articles/673598/)仅在上游可用。Android 8.0使得KASLR在Android内核4.4和更新版本中可用。

KASLR通过随机分配每次启动时加载内核代码的位置来帮助缓解内核漏洞。例如,在ARM64上,根据设备的内存配置,它增加了13-25位熵,这使得代码重用攻击更加困难。

初始化后的只读存储器

最终的硬化功能通过创建在内核初始化后标记为只读的内存区域来扩展内核中现有的内存保护。这使得开发者有可能在初始化期间改进对需要写入的数据的保护,但在此之后不应进行修改。具有较少的可写内存可以减少内核的内部攻击面,从而使开发更加困难。

在上游内核版本4.6中引入了初始化后的只读内存,我们已经将其转移到Android内核3.18和更新版本。虽然我们将这些保护应用于核心内核中的某些数据结构,但是对于内核驱动程序的开发人员来说,此功能非常有用。

结论

Android Oreo包括针对内核中最常见的安全漏洞来源的缓解。这是特别相关的,因为Android中的85%的内核安全漏洞在供应商驱动程序中往往受到较少的审查。这些更新使驱动开发人员更容易在开发过程中发现常见bug,并在终止用户设备之前停止它们。