【技術(shù)分享】使用CTS進(jìn)行漏洞檢測(cè)及原理淺析
團(tuán)隊(duì)介紹
360 Vulpecker團(tuán)隊(duì) 隸屬360信息安全部,致力于Android應(yīng)用和系統(tǒng)層漏洞挖掘以及其他Android方面的安全研究。我們通過(guò)對(duì)CTS框架的研究,編寫(xiě)了一個(gè)關(guān)于漏洞檢測(cè)方面的文檔,以下為文章的全文。
CTS 全稱 Compatibility Test Suite(兼容性測(cè)試),Google開(kāi)發(fā)CTS框架的意義在于讓各類(lèi)Android設(shè)備廠商能夠開(kāi)發(fā)出兼容性更好的設(shè)備。其中有一些模塊的關(guān)于手機(jī)安全方面的檢測(cè),本文以此為主題,進(jìn)行了漏洞檢測(cè)方面的研究。包括如何下載編譯,以及分析了其中的security模塊是如何調(diào)度使用的。
1. CTS運(yùn)行流程
1.1 下載編譯Android CTS源碼
通過(guò)git clone https://android.googlesource.com/platform/cts -b xxxxxxx 可以下載cts并且進(jìn)行編譯,或者可以下載完整的Android 源碼進(jìn)行編譯,編譯好源碼之后再編譯CTS,命令是make cts;在/home/venscor/AndroidSource/least/out/host/linux-x86/cts下生成關(guān)于CTS的幾個(gè)文件,其中cts-tradefed可以啟動(dòng)CTS測(cè)試程序。
1.2 CTS 運(yùn)行環(huán)境
Android官網(wǎng)上對(duì)CTS運(yùn)行環(huán)境要求嚴(yán)格,但是我們目前關(guān)注的是測(cè)試安全模塊,所以只要基本的測(cè)試環(huán)境就可以了。例如打開(kāi)adb,允許adb安裝apk,不設(shè)置鎖屏等。
1.3 CTS運(yùn)行流程
在源碼中可以看到,cts-tradefed實(shí)際上是個(gè)腳本文件。首先做些環(huán)境檢查,滿足運(yùn)行環(huán)境后,去android-cts/tool/目錄下加載對(duì)應(yīng)的jar文件,從android-cts/lib加載所有的需要庫(kù)文件。***,加載android-cts/testcase/目錄下的所有jar文件,然后執(zhí)行。
CTS console功能的實(shí)現(xiàn)在CompatibilityConsole類(lèi)中,也是程序的加載點(diǎn)
1.4 啟動(dòng)腳本進(jìn)入CTS測(cè)試程序的console
CTS測(cè)試套件由很多plans組成,plans又可以由很多subplan和modules組成,我們只關(guān)心和CTS和安全相關(guān)的的東西,即和安全相關(guān)的modules。其中 和安全相關(guān)的測(cè)試模塊 有4個(gè):
CtsAppSecurityHostTestCases
CtsJdwpSecurityHostTestCases
CtsSecurityHostTestCases
CtsSecurityTestCases
其中,CtsAppSecurityHostTestCases、CtsJdwpSecurityHostTestCases不包含CVE,其實(shí)是一些App層安全檢測(cè)和安全策略檢測(cè),我們可以先跳過(guò)這兩個(gè)模塊著重分析CtsSecurityHostTestCases和CtsSecurityTestCases。
2. CTS中的安全模塊
2.1 CtsSecurityHostTestCases模塊
CtsSecurityHostTestCases模塊對(duì)應(yīng)的源碼路徑在:./hostsidetests/security。即在cts console中通過(guò)輸入run cts --module CtsSecurityHostTestCasess加載起來(lái)的。
CtsSecurityHostTestCases主要測(cè)試Linux內(nèi)核和各類(lèi)驅(qū)動(dòng)的漏洞,都是以C/C++實(shí)現(xiàn)的漏洞檢測(cè)PoC。
2.1.1 測(cè)試流程
可以通過(guò)run cts --module CtsSecurityHostTestCases來(lái)測(cè)試整個(gè)模塊,也可以通過(guò)run cts --module CtsSecurityHostTestCases –test 來(lái)測(cè)試具體的方法。例如要測(cè)試CVE_2016_8451,可以通過(guò)--test android.security.cts.Poc16_12#testPocCVE_2016_8451來(lái)進(jìn)行。
下面我們通過(guò)一個(gè)例子看具體的測(cè)試流程,以對(duì)CVE_2016_8460的檢測(cè)為例,來(lái)具體分析下測(cè)試過(guò)程。在CTS下,運(yùn)行run cts --module CtsSecurityHostTestCases --test android.security.cts.Poc16_12#testPocCVE_2016_8460。程序?qū)⑦\(yùn)行到CtsSecurityHostTestCases模塊下的testPocCVE_2016_8460()函數(shù)。
其實(shí)這個(gè)測(cè)試過(guò)程,就是將CtsSecurityHostTestCases模塊下對(duì)應(yīng)的可執(zhí)行文件CVE_2016_8460 push到手機(jī)的sdcard,然后執(zhí)行此可執(zhí)行文件,即執(zhí)行poc檢測(cè)程序。
2.1.2 結(jié)果管理
CTS測(cè)試完成后,會(huì)生成可視化的結(jié)果,結(jié)果存在cts/android-cts/results目錄下,分別有xml格式和.zip打包格式。所以對(duì)安全模塊的結(jié)果管理也是一樣的。
結(jié)果頁(yè)面里面只有兩種結(jié)果,一是pass,表示測(cè)試通過(guò),說(shuō)明不存在漏洞。二是fail,出現(xiàn)這種結(jié)果,可能原因有兩種,一是測(cè)試環(huán)境有問(wèn)題,二是存在漏洞,可以看報(bào)告邊上的詳細(xì)顯示。
2.1.3 添加與剝離testcase
按照CtsSecurityHostTestCases模塊的測(cè)試原理,添加新的測(cè)試case時(shí),完全可以剝離CTS的測(cè)試框架,直接使用C/C+編寫(xiě)測(cè)試代碼,編譯完成后添加到/data/local/tmp目錄然后修改執(zhí)行權(quán)限,執(zhí)行即可。
對(duì)于CtsSecurityHostTestCases模塊中現(xiàn)有的對(duì)漏洞的檢測(cè)代碼,也可以直接為我們所用。我們可以下載CTS的源碼查看漏洞檢測(cè)PoC的代碼,可以自己編譯也可以直接使用CTS編譯好的可執(zhí)行文件來(lái)檢測(cè)對(duì)應(yīng)的漏洞。
2.2 CtsSecurityTestCases模塊
CtsSecurityTestCases模塊基于動(dòng)態(tài)檢測(cè),采用的是觸發(fā)漏洞來(lái)檢測(cè)的方式,使用Java或者JNI來(lái)觸發(fā)漏洞,直到數(shù)據(jù)被傳遞到底層漏洞位置。這個(gè)模塊所在源碼的路徑是.test/test/security。
2.2.1 測(cè)試流程
測(cè)試流程和CtsSecurityHostTestCases模塊一致,其實(shí)這也是CTS框架的測(cè)試流程。測(cè)試整個(gè)模塊采用run cts --module的方式,而使用測(cè)試模塊里面具體的方法來(lái)執(zhí)行測(cè)試時(shí)。使用run cts --module <module> --test <package.class>的方式。
以下以檢測(cè)cve_2016_3755為例說(shuō)明此模塊運(yùn)行過(guò)程。
首先,在CTS框架中輸入run cts --module CtsSecurityTestCases --test android.security.cts. StagefrightTest#testStagefright_cve_2016_3755。
然后,CTS框架會(huì)找到testStagefright_cve_2016_3755()方法并執(zhí)行測(cè)試。
2.2.2 結(jié)果管理
CtsSecurityTestCases模塊也受CTS統(tǒng)一的結(jié)果管理。所以上面CtsSecurityHostTestCases模塊一樣。測(cè)試結(jié)果出現(xiàn)在xml文件中,pass表示成功不存在漏洞,fail給出失敗原因。
對(duì)測(cè)試結(jié)果的監(jiān)控都是通過(guò)assertXXX()方法來(lái)進(jìn)行的,通過(guò)測(cè)試過(guò)程中的行為來(lái)確定漏洞情況。例如:
2.2.3添加與剝離testcase
添加case:在這模式下添加case,需要知道知道怎么觸發(fā)漏洞。CtsSecurityTestCases模塊應(yīng)該是基于Android上的JUnit測(cè)試程序的,所以要知道應(yīng)該可以按照編寫(xiě)JUnit的方式添加測(cè)試的代碼,然后重新build。其實(shí),編寫(xiě)測(cè)試代碼時(shí)候如果可以脫離CTS的源碼依賴或者可以引用CTS的jar,應(yīng)該可以直接脫離CTS架構(gòu)。
剝離case:和添加一個(gè)道理,需要讓提取的代碼脫離依賴可執(zhí)行。
3. 總結(jié)
在Android手機(jī)碎片化嚴(yán)重的今天,各個(gè)手機(jī)廠商的代碼質(zhì)量也是良莠不齊。所以Android手機(jī)的安全生存在較為復(fù)雜的生態(tài)環(huán)境,因此Android手機(jī)方面的漏洞檢測(cè)是十分必要的。本文對(duì)谷歌官方開(kāi)源的CTS框架進(jìn)行了調(diào)研,對(duì)Android手機(jī)的漏洞檢測(cè)方面進(jìn)行了研究。希望能拋磚引玉,對(duì)Anroid安全研究能帶來(lái)更多的幫助。