-
-
[翻译]安卓O内核的加固
-
发表于:
2017-9-6 21:14
7737
-
本文由安卓安全团队的高级软件工程师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版本的内核上了。
上述是加固后的用户复制功能预防漏洞的一个例子。
加固的用户复制功能能够帮助我们找到并防御安全问题,也能在开发者使用它们的时候起到作用。目前,所有的内核代码,包括驱动,都能直接访问用户空间的内存,这会导致各种各样的安全问题。
为了防御这个瓿,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个内核驱动上,找到并修复漏洞。
以上是PAN模拟防御安全漏洞的一个例子。
安卓使用了内核地址空间布局随机化这个技术已经好几年了。随机化的内存布局使得代码重用攻击不再一定起作用,也就使得攻击者尤其是远程攻击者更难进行利用。安卓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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!