非常感谢!我是李月锋, moony, wotongyi, 乙方安全公司架构,从PC,osx,mobile上的安全沙箱转moibile,IOT漏洞攻防与0day挖掘。之前有幸参加过blackhat会议,这是第一次有幸受段老师邀请参加国内大型安全会议,非常有幸能够结识国内安全圈子的人。
我这次主要是讲一下安卓0day平台上的漏洞检测、漏洞挖掘和检测,主要是基于沙箱系统的设计和实现,里面涉及到整体设计原则和大致怎么实现的坑,给同行做以借鉴
这是我要讲的Agenda:项目背景介绍、项目设计与实现、Summary。
我个人主要是在乙方做安全架构,前几年主要是做Windows、mac上沙箱系统的开发,最近几年转到Mobile0day漏洞挖掘,还有攻防对抗,有幸参加过几次blackhat会议,跟国外同行接触得相对多一点。
首先快速过一下安卓攻防对抗尤其是0day漏洞相关的演进。大家知道,漏洞我们都称之为是攻防上尤其是攻击这块的“安全王冠”,它相当于普通的APT或者Malware攻击在植入方式更加先进,一般我们把它分为1-Click攻击、0-Click攻击等不同类型。1-Click远程攻击比如URL访问,当发给你短信链接,你打开之后,对方可以远程执行你的微信等权限,再利用本地的漏洞提权成root。乃至还可以支持所谓的0-Click攻击,假设你的手机有WiFi、基带、蓝牙相关漏洞,理论上不需要受害者做任何处理,他开放的服务就会被黑客攻击。
攻防本质就是对抗,安卓系统本身在0day漏洞也在不断完善。我们可以看看从安卓1.0到安卓7,它加入了非常多的从用户态到内核态的,尤其像CPU里面我们做漏洞挖掘经常遇到类似于这样一些机制,它相当于内核态不能执行以后态的代码,内核态不能读写用户态相关的代码。
我们看一下近期安卓8、安卓9,以及马上要发布的安卓Q,里面也加入一些新的,像Post-init read-only memory,Hardened Usercopy,关键API做了加强,还有APN,KASLR。到安卓9都在CFI做了代码,Integer Overflow Sanitization,在地址和代码越界做了更深的check。安卓Q在lld linker做了更深级别的CFI。
像刚才讲的那样,攻和防,就是漏洞利用和漏洞发现,或本身就是一种对抗,我们左边可以认为是安全厂商,尤其是像谷歌这样操作系统可能会产生的采用手段,右边是普通的黑客或者高级黑客通过挖掘相关的漏洞,我们大概总结了一些,比如典型的oob和UAF相关漏洞,等等这些我们称为基础的漏洞类型,利用各种各样的技巧转换成任意代码执行,然后再配合一些,比如它开始smap的机制,可能需要leak内核态地址为堆喷做准备,然后利用相关的技巧去过左边的这些mitigations。Mitigations也分内核态和用户态的mitigation,演化进程就像刚才提到的列表。
这是另外一张更加好看一点的mitigation的对抗图,左边的也一样,一般通过找到用户态内核态的bug,这些bug是相对来讲是比较初始的。我们要绕过的一些对象,就是图里面用红框框起来的那些各种各样的mitigation,比如pxn、pan、cfi。
dev目录是像谷歌这样的厂商为了减少攻击界面,在设备初始化时,它会初始化它的设备数,这个设备数会往dev,然后通过iosctrl渠道注册内核态的,像Windows有些不必要的,不允许那些低权限的去访问,乃至直接从dev目录里把用户态可以访问的渠道cut掉。把一些还有一些没有必要暴露给用户态的Sys call减少掉,也会减少很大的攻击量。
下面selinux有点类似于分权的概念,就像mac里的root,即使你拿到到root权限,要做高权限事情的时候,比如访问或者读写关键的文件目录结构,或者访问高级别的servers时,都会受限。
古语说“知己知彼、百战不殆”,我们先从攻击界面和可选方案上大致梳理一下思路。左边是一个典型的安卓系统,看它大致可能会从哪些渠道被攻击,右边是站在防御或者防守的角度,我们可能会采取哪些溯源或者方案。
要梳理攻击界面,我们需要对安卓架构有相对比较深入的了解。我们用户态一般分高级和低级,高级别的它主要是指高权限的system servers,低权限的就是mobile user权限或者adb shell权限。另外浏览器的JS engine比如Wekit,V8引擎等也是一个很常见的攻击渠道。
因为普通的APP都是受限的沙箱环境里,如果我拿到了APP权限之后还需要额外的沙箱逃逸漏洞去逃逸到外面去执行更多行为,乃至如果需要的话我可以提供系统权限,这个内核态度或者能访问的就会更多。这个时候就可能要通过一些Driver、Socket等等,尤其高通闭源的driver的漏洞提前拿到一些权限。
从这样的角度来看,大家可以看到,一般真正安卓的攻击,典型的像远程相关的可能是一些js脚本,或者字体、多媒体等文件解析,典型的像2016年左右有一个的多媒体解MP4时出现了libstagefright远程代码执行的bug,这样只需要发某一种畸形的MP4文件的文件交给那个库去做解析,这个库恰好是高权限的serivce,相当于我远程可以拿到它系统权限。
它有这样一些,像音频视频这种文件类的,还有蓝牙、WiFi这样的近场或者远程的攻击渠道,最后一种是像APK,APK一般是用于典型的root提权漏洞,比如最新出现. 的Binder水滴漏洞是因为在底层的Binder驱动中出现了一个权限竞争,导致可以root安卓9之前的所有版本。这是所有攻击面的大概描述。
可选方案呢?大家做过沙箱方案的同事应该有一个印象是什么?普通的沙箱处理的是普通的File文件,它最大的问题是它可能跑出部分攻击行为来,但是我如果想还原出攻击第一环,比如远程越界的第一环,假如它是从流量打过来的,往往需要知道它的第一次访问的URL是什么,乃至它的URL具体对应的js脚本是什么。这样就有一个需求,往往都需要把某一个异常,比如某一个新创建的,之前的浏览器访问相关的Traffic包拿下来,做流量分析,有必要的话做些流量重放。
因为这里面会带一些除了APK之外,可执行文件的js脚本或者URL,它们打的本身就是像safari、chrome等这样的浏览器。这块其实需要类似于像webkit、V8引擎等等,我们需要对js脚本做emulation,可能会发现更多反混淆或者js上的潜在恶意行为乃至漏洞epxloit行为。
沙箱这块大部分是用户态的,可以通过一些Frida框架去拿到更多apk的so级别的行为分析,乃至我可以需要引入一些全系统的基于安卓整个虚拟机沙箱的经验。不管是动态还是静态,都有各自的优缺点,这也是为什么我们把静态、动态等方式综合在一起的原因所在,静态可能会有反逆向的手段和技巧来逃避检测,动态最大的问题是它的某些关键行为可能会有各种各样的条件依赖,导致这些代码虽然存在,但在动态环境下根本无法执行到,这涉及到很大的一个Anti-sandbox的领域,比如它会检测你当前的UI,用户是不是有特定操作,比如检测请求,看它的进程、文件、固件、CPU时差等这些信息等等。
还有比较一点是分阶段执行,拿到第一阶段的apk往往是很简单的一个壳,它本身不会做非常复杂的行为,它可能是等待时机,然后才会server端把后续重量级的有恶意行为的payload Down下来,这都没有非常好的工程化方案去解决。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-7-26 18:49
被wotongyi编辑
,原因: