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