安卓O内核的加固

简介:

236762_6i9mpat4yla0zw1.jpg


安卓用户空间的加固使得越来越多攻击者开始研究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%的内核安全漏洞来自于驱动供应商,并且缺少详细的代码审查。这些更新使得驱动开发者在开发时更容易发现公共的漏洞,并在它们到达用户设备之前阻止它。

相关文章
|
2月前
|
Web App开发 小程序 前端开发
【产品上新】小程序新内核来了!提升安卓浏览器性能,支持WebRTC
【产品上新】小程序新内核来了!提升安卓浏览器性能,支持WebRTC
38 0
|
3月前
|
Linux Android开发
Android 正常运行所需的一系列 Linux 内核接口
Android 正常运行所需的一系列 Linux 内核接口
53 0
|
4月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
27天前
|
移动开发 监控 小程序
mPaaS 常见问题之Android 14uc内核不生效如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
15 0
|
Linux 编译器 Android开发
【Android 逆向】Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )
【Android 逆向】Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )
209 0
【Android 逆向】Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )
|
Android开发
【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )(二)
【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )(二)
268 0
|
Android开发
【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )(一)
【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )(一)
141 0
【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )(一)
|
安全 Android开发
研究称Android内核存在漏洞 黑客可窃取电邮
北京时间11月1日消息,据国外媒体报道,Coverity通过研究发现,Android智能手机操作系统内核存在漏洞,部分漏洞可以被黑客用来窃取用户的电子邮件和其他敏感信息。 Coverity是在宏达电Droid Incredible手机的Android中发现这些漏洞的,但表示,其他Android手机也可能存在相同的漏洞。
628 0
|
Web App开发 JavaScript Java
Android 项目集成腾讯X5浏览器内核
1、为什么要集成腾讯 X5 浏览器内核 肯定是事出有因,简单来说,JS代码写的不标准,与部分机型内嵌套的浏览器内核产生矛盾,出现底层(os)bug导致,不得不费事搞一个其它内核进行加载网页,具体原因。
2727 0