概述
漏洞分析是指在代码中迅速定位漏洞产生的位置(简称溯源),理解攻击原理,并根据漏洞类型、漏洞利用技术以及目标平台的漏洞缓解技术,准确评估该漏洞的利用方式和风险等级的过程。
步骤
收集信息
通过漏洞公布平台手机漏洞的信息,信息包括:漏洞厂商、影响版本、漏洞描述、漏洞发现时间、漏洞公布的时间、漏洞的状态以及漏洞POC、漏洞patch等。这些信息中比较重要的是漏洞的POC和patch,但有时漏洞公布不全面可能不包括POC,只有通过漏洞描述展开分析。
漏洞信息 | 描述 |
---|---|
漏洞厂商 | todo |
影响版本 | todo |
漏洞描述 | todo |
发现时间 | todo |
公布时间 | todo |
漏洞状态 | todo |
漏洞POC | todo |
漏洞patch | todo |
溯源
正确的判断漏洞产生的根源是漏洞分析中最重要的一步,在溯源过程中要明确两个问题.
- 漏洞的类型。对于Android系统这样庞大的代码体系,任何位置都有可能产生bug,但漏洞的类型就固定几种,典型漏洞类型包括:栈溢出、堆溢出、整型溢出、格式化字符串、双重释放(Double free)、释放重用(UAF)等。
- 漏洞的逻辑。通过一些技巧可以精确的定位漏洞产生的位置,但要更好的理解漏洞产生的根源,还是需要理解漏洞是如何被触发的,这就需要去了解漏洞所在的系统模块及其运作原理。
溯源方式
通常溯源展开方式依据我们能拿到的漏洞信息,可以分为三种情况: - 漏洞信息中提供了POC。此时需要部署实验环境,使用POC来重现漏洞攻击,并通过调试技术定位漏洞所在函数,进一步确定代码行数。
- 漏洞已经发布补丁。此时只需对照patch前后代码即可定位漏洞存在的代码位置。
- 只有漏洞描述。
调试方式
扎实的调试技术是定位漏洞和利用漏洞的基础。
在定位漏洞时,通常触发漏洞后,看到的是系统崩溃或者是更加隐秘的程序逻辑错误,不管哪种都说明程序偏离了原本的执行流程,我们可以借助调试技术来观察系统崩溃状态重要的寄存器、内存的值和状态,并根据反汇编代码逐步回溯找到根源。同时也可以通过函数调用栈回溯函数调用过程,了解漏洞执行过程,各个函数的参数值,能够找到触发漏洞的异常输入,并通过分析异常输出和正常输入,这样可以为理解错误原因提供帮助。
在利用漏洞时,调试技术可以帮助我们调试利用代码,辅助适配各个机型等。
android系统包括应用层、框架层、Native层、内核层。调试也是按层展开。
- smali动态调试:使用smalidea+android studio
- so库动态调试: http://eternalsakura13.com/2018/01/30/ali_re2/
- android系统Java源码调试及c/c++源码调试:这个需要下载AOSP源码,然后自己编译才能调试,编译过程参考,http://eternalsakura13.com/2018/02/24/bianyi/