Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

From Zygote to Morula: Fortifying Weakened ASLR on Android

Abstract

本文分析了Android平台上的ASLR技术,发现Android特有的Zygote机制会导致ASLR的保护能力大幅降低。针对这个问题,作者同时设计了来自本地和来自远程的攻击,攻击了两款真实的软件,Chrome和VLC。最后为了补救这个问题,作者设计了名为Morula的Android进程管理机制来替代Zygote。在增加少量(13MB)内存的情况下,增强了ASLR的效果并提升了进程加载速度。

Introduction

Android上的所有进程全部是从Zygote进程上fork出来的,这样的机制会给ASLR带来2个问题,第一个是对于同一个app来说,每次都会被加载到相同的地址空间中,第二个是对于不同的app来说,都从Zygote进程中继承了通用的库(比如libc),而这些库的内存地址都是一样的。这两个问题大大降低了ASLR带来的保护效果,这样的机制导致了在Android平台上可以很容易的无视ASLR,构造ROP攻击。作者同时发现,在Chromium OS和Chrome浏览器中存在同样的问题,可见Google非常喜欢这种fork进程的做法。这样的做法的确能加快启动速度,不过同时也降低了安全性。为了解决这个安全隐患,最直接的做法就是抛弃Zygote机制,但是这样会导致移动设备内存紧张(因为每一个app都需要一个独立的内存空间)以及超过3s的app加载延迟(需要生成独立的内存空间),为了在解决ASLR弱化问题的同时还能够保有Zygote的有点,作者开发了名为Morula的Zygote的替代品,通过维护一个包含有若干个不同Zygote进程的进程池的方法,来同时满足两点需求。

BackGround

介绍Android Zygote机制、Android平台ASLR的发展

Exploiting Android’s ASLR

首先介绍了如何绕过ASLR机制以及如何利用这一点开展ROP攻击。绕过ASLR机制带来的好处是对内存空间的充分理解,但是要利用这一点构造攻击,前提是需要有一个溢出点。

远程攻击实验选取了Android平台上的Chrome和VLC作为攻击对象。远程攻击依赖两种漏洞,一个是内存地址信息泄漏,还有一个是控制流劫持。对Chrome的攻击,首先依赖于一个已知的漏洞,最后完成out-of-blound memory read.对VLC的攻击依赖于一个缓冲区溢出漏洞,最终劫持了VLC的控制流,完成了ROP攻击。

本地攻击实验则不依赖内存地址信息的泄漏,通过向目标设备植入一个恶意的app,攻击者可以轻易的获得libc等关键库在内存地址中的位置,然后攻击者就可以利用这一点通过Intent或者Binder这样的进程通信机制来攻击其他的app,让其他app读入恶意的数据,并开展ROP攻击,从而获取其他app沙盒内的数据和共享权限。

最后作者对两者攻击进行了定量分析,全是数据公式,感觉很高级的样子。

MORULA:Effective And Practical Mitigation

作者首先尝试了使用process_wrap这个OS debugging feature去hook新进程的创建,对每个新进程都进行一次完整的内存映射和加载,而不是简单的从Zygote fork出来。但是这样的方案会带来不可接受的系统性能损耗,所以无法应用在现实中。

之后作者提出的Morula方案是Zygote和上一个方案的结合体。在系统空闲的时候,Morula会向Zygote请求fork一个备用的进程,之后对这个进程重新进行内存映射和加载,这样就得到了一个ASLR过的备用进程。在有新的进程需要开启时,系统会向备用进程中写入新进程有关的信息,这样就节省了大量的启动时间。而借助Linux kernel的copyt-on-write机制,每一个备用进程在创建的时候,并没有占用更多的内存,而是将原先的内存进行一个映射,这样就节约了大量的物理内存。

此外,Morula还包含有两个优化机制,on-demand loading和selective randomization。提出on-demand loading这个优化方案是因为作者发现在DVM在创建进程的时候,会实现加载2541个Dalvik classes,但是根据作者对110014个app的调查,这2541个classes中仅有5%左右的classes会被使用,所有作者决定加入on-demand loading这个机制,取消这个事先加载的过程,转而使用Dalivk的动态加载机制来处理需要使用到的classes。这也是为什么Morula会有比Zygote更短的启动时间。另一个优化机制是selective randomization,这是一个在安全和性能之间的平衡机制,可以选择性的对新创建的进程进行随机化,可以有效的节省资源。

Evaluation

首先是对ASLR安全性的评估,用了一些信息论的知识,高大上。 之后对Wrap方案和Morula方案都进行了系统启动时间和内存使用的评估,然后做了app的启动时间和内存使用评估,之后做了电量损耗评估。 最后使用Android Compatibility Test suite做了Compatibility测试。

Discussion

讨论了对其他使用了类似Zygote机制的操作系统的安全性和selective randomization的局限性。

个人总结

这篇文章的研究点很好,比较新而且和现实问题相关,其次做了很扎实的工作,系统底层的设计和实现都是很繁复的,值得一提的是在系统设计中充分考虑了系统在现实中的价值。此外实验也做的很充分,还有很多高大上的数学公式。不愧是S&P的文章,值得学习。