楊中皇, 何便便
(1. 高雄師范大學(xué) 軟件工程與管理學(xué)系,臺灣 高雄 824442;2.西安郵電大學(xué) 無線網(wǎng)絡(luò)安全技術(shù)國家工程實(shí)驗(yàn)室, 陜西 西安 710121)
Android是一種基于Linux平臺開放源代碼的操作系統(tǒng),其開源性給Android平臺帶來了各種各樣的風(fēng)險,如黑客通過攻擊智能手機(jī)應(yīng)用軟件提取用戶信息等[1]。根據(jù)安全公司G Date2017年調(diào)查數(shù)據(jù)顯示[2],市場已經(jīng)出現(xiàn)了350萬全新的 Android 惡意軟件,比上一年增長了約7.6%。惡意軟件在攻擊Android系統(tǒng)時會修改系統(tǒng)配置文件,以便再次進(jìn)入運(yùn)行時不被發(fā)現(xiàn),從而盜取敏感信息進(jìn)行非法交易。
目前,采用MD5哈希算法可檢測文件數(shù)據(jù)的完整性,在保證文件完整性的條件下,再進(jìn)行內(nèi)存數(shù)據(jù)完整性檢測,最終獲得數(shù)據(jù)完整性結(jié)果[3];基于模糊哈希的Android變種惡意軟件檢測方法[4]根據(jù)Apk中字符串以及函數(shù)長度分布特征,生成模糊哈希值,使得同類變種的惡意軟件間的哈希值相似。但是,上述兩種檢測都從軟件層面實(shí)現(xiàn)檢測,未從Android系統(tǒng)底層源碼層面實(shí)現(xiàn)檢測功能,而對系統(tǒng)內(nèi)核層實(shí)現(xiàn)文件完整性檢測比較安全且容易檢測。
本文擬設(shè)計一種基于SM3的Android文件完整性檢測系統(tǒng),通過修改Android開放源代碼項(xiàng)目,實(shí)現(xiàn)對設(shè)備的文件完整性檢測。利用SM3密碼雜湊算法[5]計算文件哈希值,將其存儲在內(nèi)存文件中。對文件進(jìn)行完整性檢測時,再次對文件進(jìn)行SM3密碼雜湊算法計算,生成新的哈希值,將其與存儲的哈希值進(jìn)行對比,檢測文件是否完整,以此發(fā)現(xiàn)入侵行為。
文件完整性檢測[6]是指對于一個沒有被攻擊數(shù)據(jù)信息完好的系統(tǒng),選取系統(tǒng)中的關(guān)鍵文件,采用哈希算法對關(guān)鍵文件進(jìn)行計算,生成哈希值并保存。檢測時對比關(guān)鍵文件重新生成的哈希值與保存的哈希值,如果不相同,說明該關(guān)鍵文件被篡改,文件完整性被破環(huán)。
SM3密碼雜湊算法采用分組和迭代的方式,將消息經(jīng)過填充、擴(kuò)展和迭代壓縮,最終生成256比特的固定長度哈希值[7]。
對于長度為l的消息m,將比特“1”添加到消息的末尾,再添加k個“0”,k是滿足
l+1+k=448 mod 512
的最小非負(fù)整數(shù),最后再添加一個64位比特串,由長度l的二進(jìn)制表示。填充后的消息m′的比特長度為512的倍數(shù),將消息m′按512比特分組[7],即
m′=M0M1…Mn-1,
其中n=(l+k+65)/512。
分組消息Mi擴(kuò)展生成W0,W1,…,W67,W′0,…,W′63等132個字的具體步驟如下,其中1個字表示32位的比特串。
步驟1將Mi按32比特劃分為16個字W0,W1,…,W15。
步驟2在W0,W1,…,W15的基礎(chǔ)上,擴(kuò)展Mi。根據(jù)前52個字的生成表達(dá)式[8]
Wj=P1[Wj-16?Wj-9?(Wj-5<<<15)]?(Wj-13<<<7)?Wj-6(16≤j≤67),
計算得出W16,W17,…,W67。
步驟3根據(jù)后64個字的生成表達(dá)式[8]
W′j=Wj?Wj+4, 0≤j≤63,
計算得出W′0,W′1,…,W′63。
將每個分組消息按照上述步驟擴(kuò)展為132個字,用于壓縮函數(shù)的計算。
令A(yù)、B、C、D、E、F、G和H均為32位寄存器;S1,S2,T1和T2為中間變量,分別表示為
S1=[(A<<<12)+E+(Tj<< 利用壓縮函數(shù) V(i+1)=L(V(i),Mi), 0≤i≤n-1, 分別計算寄存器A、B、C、D、E、F、G和H的值。 1)分別將V(i)值賦給寄存器A、B、C、D、E、F、G和H。先將初始值V(0)賦給寄存器,則寄存器的初始化值可表示為 A=7380166f,B=4914b2b9, 2)計算新一輪寄存器的值。寄存器D的值是上一輪寄存器C的值;寄存器C的值是將上一輪寄存器B的值循環(huán)左移9比特;寄存器B的值是上一輪寄存器A的值;寄存器A的值是中間變量T1賦的值;寄存器H的值是上一輪寄存器G的值;寄存器G值是將上一輪寄存器F的值循環(huán)左移19比特;寄存器F的值是上一輪寄存器E的值;寄存器E的值由置換函數(shù)[8] P0(X)=X?(X<<<9)?(X<<<17),0≤j≤63,X=T2。 計算得出。將A、B、C、D、E、F、G和H寄存器新一輪的值,用于迭代運(yùn)算。 3)將新一輪A、B、C、D、E、F、G和H寄存器的值與V(i)進(jìn)行異或運(yùn)算得出的值賦給V(i+1),進(jìn)行迭代運(yùn)算。 當(dāng)消息的每個512分組處理完成后,最后一個分組的輸出就是消息的哈希值,即 ABCDEFGH←V(n), 哈希值 y=ABCDEFGH。 基于SM3的Android文件完整性檢測系統(tǒng)主要由創(chuàng)建內(nèi)存文件、計算文件SM3值、檢測、上報文件及更新等5個部分組成。模型如圖1所示。 圖1 Android文件完整性檢測模型 在內(nèi)存中創(chuàng)建一個文件,選擇需要檢測的文件,使用SM3密碼雜湊算法,計算得出文件哈希值并自動保存在內(nèi)存文件中。對文件進(jìn)行檢測時,需要重新對選擇的文件進(jìn)行SM3計算,將重新生成的哈希值與保存的哈希值進(jìn)行對比,若不同,則系統(tǒng)會進(jìn)行提示。第一次檢測時會生成一個上報文件,里面記錄完整性被破壞的文件信息,即文件存儲位置及文件名。檢測完成后,更新內(nèi)存文件哈希值,以免影響下一次檢測。 創(chuàng)建的內(nèi)存文件位于Android的內(nèi)部存儲中,其他應(yīng)用無法訪問這些數(shù)據(jù)。所以,將文件哈希值存儲內(nèi)存文件中,安全性增加。 文件完整性檢測系統(tǒng)在Ubuntu平臺上使用Android Studio開發(fā)環(huán)境開發(fā)應(yīng)用程序,利用Android開放源代碼項(xiàng)目(Android Open Source Project,AOSP)平臺[9-10],在Android 9.0源代碼基礎(chǔ)上添加文件完整性檢測應(yīng)用程序,將該應(yīng)用改為系統(tǒng)應(yīng)用,并編譯Android 9.0源代碼。 3.2.1 AOSP下載及編譯 1)下載源碼 考慮到Android官方網(wǎng)站國內(nèi)網(wǎng)站無法直接訪問,系統(tǒng)使用清華鏡像網(wǎng)站下載repo工具獲取Android 9源碼的具體步驟如下。 步驟1在清華鏡像網(wǎng)站下載repo工具并賦予其權(quán)限。將repo工具內(nèi)的REPO_URL地址改為清華鏡像源地址[11]http://mirrors.tuna.tsinghua.edu.cn/git/git-repo/。 步驟2建立工作目錄“Android_9”,倉庫初始化命令后,出現(xiàn)Android源碼版本信息。 步驟3選擇需要的Android版本,并進(jìn)行同步源碼樹。當(dāng)源碼同步結(jié)束后,工作目錄里就是源碼文件。 2)編譯Android 9.0源碼 編譯Android 9.0源碼時,需要在Ubuntu平臺配置編譯環(huán)境,如安裝OpenJDK8軟件和Android官方網(wǎng)站提供的依賴包[12-14]。具體編譯源碼步驟如下。 步驟1配置好編譯環(huán)境后,執(zhí)行#source build/envsetup.sh命令編譯源碼文件。 步驟2執(zhí)行l(wèi)unch選擇需要編譯設(shè)備的對應(yīng)編號,Pixel2手機(jī)是46。 步驟3設(shè)備對應(yīng)編號選擇完后,使用make命令即源碼開始編譯。 3.2.2 刷機(jī) 源碼編譯成功后在源碼目錄下會有/out目錄,此目錄下有系統(tǒng)鏡像文件,可以將這些鏡像文件“刷入”設(shè)備中。 刷機(jī)時需要打開“開發(fā)者選項(xiàng)”中的設(shè)備“USB調(diào)試”,將設(shè)備數(shù)據(jù)線連接計算機(jī)后,執(zhí)行以下操作。 1)設(shè)備處于Bootloader模式,使用命令#fastboot oem unlock對Bootloader進(jìn)行解鎖。 2)解鎖后使用命令#fastboot flashall -w將編譯好的鏡像文件一起刷入設(shè)備。 3.2.3 系統(tǒng)應(yīng)用的實(shí)現(xiàn) 文件檢測應(yīng)用開發(fā)完成后,需要將應(yīng)用置于Android源碼中再次編譯出新的鏡像文件,在刷機(jī)之后,文件檢測應(yīng)用將成為系統(tǒng)應(yīng)用,具體方法如下。 1)將“FileDetection” 代碼加入到Android_9/packages/apps中。 2)在FileDetection代碼的根目錄下,新建Android.mk文件,內(nèi)容為 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS:=user LOCAL_SRC_FILES:= $(call all-java-files-under,src)/ LOCAL_PACKAGE_NAME:= FileDetectioninclude $(BUILD_PACKAGE) 3)在Android_9/build/target/product目錄中,修改core.mk、min_dev.mk和sdk.mk文件,將工具代碼加入其中。 4)進(jìn)入Android源碼根目錄,重新編譯源碼,最后使用“make snod”命令,重新編譯系統(tǒng)鏡像。編譯完成后重新刷機(jī),文件完整性檢測應(yīng)用成為系統(tǒng)應(yīng)用程序。 系統(tǒng)功能測試環(huán)境由Android 9.0系統(tǒng)和Pixel2設(shè)備組成。Android 9.0系統(tǒng)內(nèi)置文件完整性檢測應(yīng)用程序,在Pixel2設(shè)備中運(yùn)行并測試。 系統(tǒng)應(yīng)用程序使用SM3密碼雜湊算法對初次登陸密鑰進(jìn)行哈希運(yùn)算并保存,再一次登陸時,將輸入密鑰進(jìn)行SM3計算,生成的哈希值和初始登陸保存的哈希值進(jìn)行對比,如果哈希值一致,則登陸成功。進(jìn)入系統(tǒng)主界面,進(jìn)行創(chuàng)建文件、文件選擇、檢測和更新等4個功能。選取名為aaa、bbb、ccc、ddd和eee 等5個文件對系統(tǒng)功能進(jìn)行測試。 1)創(chuàng)建文件 在Android設(shè)備內(nèi)存中,創(chuàng)建名為Hash的內(nèi)存文件,具體操作如圖2所示。 圖2 創(chuàng)建文件 2)文件選擇 通過“文件選擇”按鈕進(jìn)入文件管理器,選取5個測試文件進(jìn)行SM3計算,生成的哈希值自動保存在Hash文件中。具體實(shí)現(xiàn)的界面分別如圖3和圖4所示,生成的哈希值如表1所示。 圖3 選取測試文件 圖4 SM3計算 表1 文件的哈希值 3)檢測 對5個文件進(jìn)行刪除、修改和增添,通過修改文件內(nèi)容進(jìn)行文件完整性檢測。重新對5個文件進(jìn)行SM3計算,生成新的哈希值如表2所示。檢測時,將新的哈希值和保存在Hash文件中哈希值進(jìn)行比較。系統(tǒng)第一次進(jìn)行檢測,生成上報文件,如圖5所示,再將比較結(jié)果記錄上報文件中,上報文件內(nèi)容如圖6所示。 表2 文件的新哈希值 圖5 生成的上報文件 圖6 上報文件內(nèi)容 4)更新 檢測完成后,將內(nèi)存中的哈希值進(jìn)行更新,以便下次檢測時不再報告上次檢測結(jié)果。 綜上系統(tǒng)功能測試結(jié)果,應(yīng)用程序中的創(chuàng)建文件、文件選擇、檢測和更新的功能都可實(shí)現(xiàn)并使用。從表1和表2可以看出,哈希值發(fā)生變化的文件有aaa、bbb、ccc、ddd和eee,上報文件記錄結(jié)果也是aaa、bbb、ccc、 ddd和eee,表明系統(tǒng)應(yīng)用在Android系統(tǒng)上運(yùn)行良好且功能均可實(shí)現(xiàn)。 基于SM3的文件完成性檢測系統(tǒng)在Android Studio環(huán)境下使用C語言開發(fā)。服務(wù)器使用Ubuntu操作系統(tǒng),修改和編譯Android 9.0源碼,將應(yīng)用改為系統(tǒng)應(yīng)用。在Pixel2設(shè)備上對系統(tǒng)應(yīng)用進(jìn)行功能測試和效能測試。 設(shè)備CPU的頻率隨著功耗時刻變化,將會對測試結(jié)果造成影響,因此在測試前,盡可能清除設(shè)備中的應(yīng)用進(jìn)程并關(guān)閉WiFi和藍(lán)牙服務(wù)等設(shè)置[15]。測試環(huán)境如表3所示。 表3 測試環(huán)境 Pixel2設(shè)備為高通驍龍835處理器、4 G 運(yùn)行內(nèi)存和128 GB內(nèi)置存儲。 基于SM3的文件完整性檢測系統(tǒng)在Android 9.0系統(tǒng)上運(yùn)行,使用Pixel 2手機(jī)的測試結(jié)果為系統(tǒng)每秒可以計算43.73 MB的文件,即C語言實(shí)現(xiàn)的SM3算法對文件Hash計算的速率為43.73 M/s。在相同環(huán)境下,使用Java語言實(shí)現(xiàn)的SM3算法對文件Hash計算的速率為5.89 M/s,即每秒可計算大小為5.89 MB的文件。 從測試結(jié)果中可以得出,使用C語言實(shí)現(xiàn)的SM3算法對文件Hash計算速率高于Java語言實(shí)現(xiàn)的速率。因此,文件完整性檢測系統(tǒng)使用C語言實(shí)現(xiàn)比較高效,可以提高文件檢測速率。 基于SM3的Android文件完整性檢測系統(tǒng),利用SM3密碼雜湊算法計算文件的哈希值并保存,通過對比保存的哈希值和新生成的哈希值,判斷文件的完整性。通過修改Android開放源代碼項(xiàng)目,從Android系統(tǒng)內(nèi)核進(jìn)行文件完整性檢測。測試結(jié)果表明,該系統(tǒng)應(yīng)用內(nèi)置Android 9.0系統(tǒng)上運(yùn)行良好,文件完整性檢測功能可實(shí)現(xiàn),使用C語言實(shí)現(xiàn)的SM3算法對文件Hash計算的速率優(yōu)于Java語言。
C=172442d7,D=da8a0600,
E=a96f30bc,F(xiàn)=163138aa,
G=e38dee4d,H=b0fb0e4e。2.4 輸出
3 系統(tǒng)設(shè)計與實(shí)現(xiàn)
3.1 系統(tǒng)設(shè)計
3.2 系統(tǒng)應(yīng)用實(shí)現(xiàn)
4 系統(tǒng)功能測試
5 系統(tǒng)性能測試及分析
5.1 測試環(huán)境
5.2 測試結(jié)果
6 結(jié)語