看雪论坛
发新帖
3

[翻译]安卓O内核的加固

梦野间 2017-9-6 21:14 1004

本文由安卓安全团队的高级软件工程师Sami Tolvanen发表

 

安卓用户空间的加固使得越来越多攻击者开始研究linux内核,这使得去年发现的安卓安全的漏洞,1/3都在内核上。在安卓8.0(Oreo)中,程序员们做出了巨大的努力来加固内核,以减少安全漏洞。

 

Android Nougat通过把内核和用户进程隔离开来,使用SELinux ioctl进行过滤,并请求seccomp-bpf的支持(能够在处理不受信任的输入时,过滤对系统调用的访问),以保护内核。安卓8.0重点关注内核上的保护,其中主要有4个安全加固特征,并在第一个发行版发布时,将之以补丁的形式发布所有支持的设备上。

 

加固用户复制功能

用户的复制功能原理是将用户空间的数据传输到内核中,然后再返回到用户空间中。从2014年开始,缺少或是不合理的边界检查已经导致了45%的安卓内核漏洞。加固的用户复制功能添加了边界检查,它可以帮助开发者定位误用并修复他们代码中的bug。当然,如果出现隐蔽的驱动bug,这些功能的加固使得这样的bug难以被利用。

 

这些特征在linux内核4.8版本中有介绍,我们将这些补丁打到了安卓的linux 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 */
}

上述是加固后的用户复制功能预防漏洞的一个例子。

 

Privileged Access Never(PAN)仿真

加固的用户复制功能能够帮助我们找到并防御安全问题,也能在开发者使用它们的时候起到作用。目前,所有的内核代码,包括驱动,都能直接访问用户空间的内存,这会导致各种各样的安全问题。
为了防御这个瓿,CPU供应商介绍了一些诸如
x86平台上的Supervisor Mode Access Prevention (SMAP),ARM v8.1上的Privileged Access Never (PAN)。这些特征可以预防内核直接访问用户空间,并确保开发者访问它通过用户复制功能。不幸的是,这些特征还并没有在设备上得到广泛应用。

 

Linux的Upstream介绍一种使用软件模拟PAN在ARM版的4.3内核和ARM64版的4.10内核上的应用的方法。
使用加固的用户空间,PAN模拟能帮助我们在Pixel手机上的4个内核驱动上,找到并修复漏洞。

 
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)

安卓使用了内核地址空间布局随机化这个技术已经好几年了。随机化的内存布局使得代码重用攻击不再一定起作用,也就使得攻击者尤其是远程攻击者更难进行利用。安卓8.0把这个特征带到了内核。Linux从3.14版本开始已经支持x86平台上的KASLR,ARM64平台上的KASLR也已经从4.6版本开始支持。安卓8.0使得KASLR在安卓内核4.4上和更新的版本开始受到支持。
KASLR通过在每次启动时随机化内核代码的地址来防御内核漏洞。例如,在ARM64平台上,它根据设备的内存配置,添加了13-25位的熵,这会使得代码重用攻击更加困难。

 

初始化时确定的只读内存

最终的加固特征继承了内核已有的内存保护,这种保护机制通过在内核初始化后,创建标记为只读的内存区域。这使得开发者在初始化阶段,当数据需要可写权限时有可能改善保护机制,但在那之后不能再进行修改。使得可写的内存变得更少可以减少来自内核的攻击,使得漏洞利用更加困难。

 

在初始化时确定的只读内存在内核4.6中有介绍,我们把它移植到了安卓3.18内核以及更新的版本上。当我们应用这些保护机制到内核的一些数据结构上时,这一特征对于那些工作在内核驱动的开发岗位上的开发者非常有用。

 

总结

安卓O包含了防御内核上的大多数的安全漏洞机制。这非常重要,因为安卓上85%的内核安全漏洞来自于驱动供应商,并且缺少详细的代码审查。这些更新使得驱动开发者在开发时更容易发现公共的漏洞,并在它们到达用户设备之前阻止它。

 

本文由 看雪翻译小组 梦野间编译
原文链接(需翻墙):https://android-developers.googleblog.com/2017/08/hardening-kernel-in-android-oreo.html

 
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (2)
哆啦咪 2017-9-7 14:43
2
Android  Oreo  新  Bug:开  Wi-Fi  仍使用移动数据 

据 Reddit 网友 Unusual_Sauce 爆料,Android Oreo 新发现了一个 Bug,可能导致用户在开启了 Wi-Fi 之后仍被吞噬宝贵的移动数据。不过 Google 方面已经知晓了此事,现正在抓紧制作修复补丁。Unusual_Sauce 表示,他在前一晚升级 Android Oreo 后发现 —— 如果同时开启了 Wi-Fi 和移动数据,系统可能会无视已经连上的无线热点,而是继续只使用移动数据。

“在联系支持人员后,我被告知他们已经获悉此事,且正在制作一个修复。与此同时,我必须到家就手动关闭移动数据开关,以确保仅使用 Wi-Fi 网络”。

当然,该问题的起因是开发人员选项中的某个设置。为了方面测试,Android Oreo 最终编译版本中默认启用了“始终开启移动数据”这个功能。如果你想要预防这个 bug,也只需手动关闭此选项。


来源:cnbeta
tangsilian 2017-9-9 22:45
3
内核漏洞更难挖了
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 域名 加速乐 保护 | SSL证书 又拍云 提供 | 微信公众号:ikanxue
Time: 0.012, SQL: 9 / 京ICP备10040895号-17