当前位置: 首页 > 科技观察

【技术分享】CTS漏洞检测与原理分析_0

时间:2023-03-13 00:46:22 科技观察

团队介绍360Vulpecker团队隶属于360信息安全部,致力于Android应用和系统层漏洞挖掘等Android安全研究。通过对CTS框架的研究,我们整理了一篇关于漏洞检测的文档。以下为文章全文。CTS的全称是CompatibilityTestSuite(兼容性测试)。谷歌开发CTS框架的意义在于让各Android设备厂商能够开发出兼容性更好的设备。有一些关于手机安全检测的模块。本文以此为主题,对漏洞检测进行研究。包括如何下载和编译,分析安全模块是如何调度和使用的。一、CTS运行流程1.1下载编译AndroidCTS源码你可以下载cts通??过gitclonehttps://android.googlesource.com/platform/cts-bxxxxxxx编译,也可以下载完整的Android源码编译编译源码然后编译CTS,命令是makects;在/home/venscor/AndroidSource/least/out/host/linux-x86/cts下生成几个关于CTS的文件,其中cts-tradefed可以启动CTS测试程序。1.2CTS运行环境Android官网对CTS运行环境要求比较严格,但是我们目前主要针对安全模块进行测试,所以只需要一个基本的测试环境即可。比如打开adb,允许adb安装apk,不设置锁屏等。1.3CTS运行过程从源码中可以看到,cts-tradefed其实是一个脚本文件。首先做一些环境检查,满足运行环境后,到android-cts/tool/目录下加载相应的jar文件,从android-cts/lib中加载所有需要的库文件。***,加载android-cts/testcase/目录下的所有jar文件,然后执行。CTS控制台功能是在CompatibilityConsole类中实现的,也是程序的加载点。1.4启动脚本进入CTS测试程序的控制台。CTS测试套件由许多计划组成,计划也可以由许多子计划和模块组成。我们只关心CTS和security-relatedThings,也就是安全相关的模块。其中,安全相关的测试模块有四个:CtsAppSecurityHostTestCasesCtsJdwpSecurityHostTestCasesCtsSecurityHostTestCasesCtsSecurityTestCases其中CtsAppSecurityHostTestCases和CtsJdwpSecurityHostTestCases不包含CVE,但实际上是一些App层安全检测和安全策略检测。我们可以跳过这两个模块,专注于分析CtsTestCases。2、CTS中的安全模块2.1CtsSecurityHostTestCases模块CtsSecurityHostTestCases模块对应的源码路径为:./hostsidetests/security。即在cts控制台输入runcts--moduleCtsSecurityHostTestCasess来加载。CtsSecurityHostTestCases主要测试Linux内核和各种驱动的漏洞,都是用C/C++实现的漏洞检测PoC。2.1.1测试过程可以通过运行cts--moduleCtsSecurityHostTestCases来测试整个模块,也可以通过运行cts--moduleCtsSecurityHostTestCases–test来测试具体的方法。例如测试CVE_2016_8451,可以通过--testandroid.security.cts.Poc16_12#testPocCVE_2016_8451。下面通过一个例子来看看具体的测试过程,并以CVE_2016_8460的检测为例详细分析测试过程。在CTS下,运行runcts--moduleCtsSecurityHostTestCases--testandroid.security.cts.Poc16_12#testPocCVE_2016_8460。程序会运行到CtsSecurityHostTestCases模块下的testPocCVE_2016_8460()函数。其实这个测试过程就是将CtsSecurityHostTestCases模块下对应的可执行文件CVE_2016_8460推送到手机的sdcard中,然后执行这个可执行文件,即执行poc检测程序。2.1.2结果管理CTS测试完成后,会生成一个可视化的结果,以xml格式和.zip包格式保存在cts/android-cts/results目录下。所以对于安全模块的结果管理也是一样的。结果页面只有两个结果,一个是pass,表示测试通过,说明没有漏洞。二是失败。造成这一结果的可能原因有两个。一是测试环境有问题,二是存在漏洞。您可以在报告的侧面看到详细显示。2.1.3添加和剥离测试用例根据CtsSecurityHostTestCases模块的测试原理,在添加新的测试用例时,可以完全剥离CTS的测试框架,直接使用C/C+编写测试代码,添加到/编译后的data/local/tmp目录然后修改执行权限,执行。我们也可以直接使用CtsSecurityHostTestCases模块中现有的漏洞检测代码。我们可以下载CTS的源码查看漏洞检测PoC的代码。我们可以自己编译或者直接使用CTS编译出来的可执行文件来检测相应的漏洞。2.2CtsSecurityTestCases模块CtsSecurityTestCases模块基于动态检测,采用触发漏洞的方式进行检测,使用Java或JNI触发漏洞,直到数据传递到底层漏洞位置。该模块源码路径为.test/test/security。2.2.1测试流程测试流程与CtsSecurityHostTestCases模块一致。其实这也是CTS框架的测试过程。测试整个模块,使用runcts--module方法,使用测试模块中的具体方法执行测试。使用运行cts--module--test。下面以检测cve_2016_3755为例,说明该模块的运行过程。首先,在CTS框架中输入runcts--moduleCtsSecurityTestCases--testandroid.security.cts.StagefrightTest#testStagefright_cve_2016_3755。然后,CTS框架会找到testStagefright_cve_2016_3755()方法并执行测试。2.2.2结果管理CtsSecurityTestCases模块也接受CTS统一的结果管理。所以上面的CtsSecurityHostTestCases模块是一样的。测试结果出现在xml文件中,pass表示成功,没有漏洞,fail表示失败的原因。通过assertXXX()方法对测试结果进行监控,通过测试过程中的行为判断漏洞。例如:2.2.3Addandstriptestcase添加案例:在这种模式下添加案例,你需要知道如何触发漏洞。CtsSecurityTestCases模块应该是基于Android上的JUnit测试程序,所以你应该知道按照JUnit的写法应该可以添加测试代码,然后rebuild。其实如果能脱离CTS的源码依赖或者在写测试代码的时候引用CTS的jar,应该可以直接脱离CTS的架构。剥离case:并添加一个理由,就是要让提取出来的代码在没有依赖的情况下可执行。3.总结在Android手机碎片化严重的今天,各个手机厂商的代码质量也是参差不齐。因此,Android手机的安全存在于一个相对复杂的生态环境中,因此Android手机的漏洞检测是非常必要的。本文调研Google官方开源的CTS框架,研究Android手机的漏洞检测。希望抛砖引玉,为Anroid安全研究带来更多帮助。