于炳虎,蹇詩婕,樊子民
(公安部第一研究所,北京 100048)
近年來,移動應用安全事件頻發,據相關機構統計,2021年全球近四分之一的企業組織均發生過移動或物聯網數據泄露事件。據國際安全機構Check Point Research(CPR)在2021年4月發布的《全球威脅指數》報告顯示,十三款Android應用暴露了包括社交信息、電子郵件、賬戶密碼和圖片照片在內的多項個人隱私數據,受影響用戶數量多達1億。海量移動應用在為用戶提供便利的同時,極大地加劇了數據安全風險。如何有效防范移動互聯網存在的安全威脅,已經成為當前應用廠商、研究機構和政府相關部門關注的重點內容。我國網絡安全等級保護制度2.0系列標準已發布并實施,針對移動應用存在的被篡改、被假冒的問題,標準要求采用校驗技術保證代碼的完整性,并提出了采用可信計算技術構建主動免疫安全體系的具體要求[1]。相關組織機構應根據國家政策、標準規范完善移動應用安全體系,貫徹落實安全措施,保障移動應用市場安全。
為提高移動應用的安全防護能力,本文提出了一種基于可信計算的移動應用靜態度量方法。該方法以可信計算主動免疫體系為基礎,從應用度量角度出發,通過對移動應用組成結構、加載運行機制等方面進行研究分析,利用可信度量機制、判定機制和可信基準庫,聯合完成對宿主基礎軟件系統應用的安全防護,保證應用運行時的代碼完整性。
目前,針對移動應用的安全防護措施主要以應用加固技術手段為主,通過對程序文件加殼加密,防范應用被破解、反編譯、調試、篡改、冒充、二次打包等。除此之外,還有應用安全檢測、漏洞掃描、分發渠道監測,以及一些專業場景下的安全解決方案,如安全SDK、應用簽名認證等。但是,以上方式僅在一定程度上滿足了應用啟動運行前的安全要求,無法保證應用在長期使用過程中的安全性。可信計算中的度量機制是解決上述問題的一個主要方法,能夠實現對應用程序進行靜態完整性度量,保證應用程序的可信啟動。國內外基于可信度量機制實現的相關解決方案,大多應用在網絡系統和服務端應用,缺少針對移動應用的度量方案。針對上述問題,本文提出了一種可落地實現的基于移動應用的靜態度量方法。
近年來,可信安全防護技術不斷迭代升級,從早期的可信計算1.0時代發展到現在的可信計算3.0時代。防御方式由被動防御轉變為主動免疫,防護對象由主機、個人計算機,延伸至整個網絡環境,應用場景擴大至云計算、物聯網、區塊鏈,可信計算已覆蓋信息技術領域的多個方面,并且在跨行業領域也具有廣闊的應用前景。可信計算技術支撐了計算機網絡安全防護能力的提升,并且逐步發展成為網絡安全領域的主流防護技術之一[2]。
與此同時,隨著互聯網技術的不斷發展,移動安全已成為網絡安全領域關注的重點問題。后疫情時代,智能手機和互聯網已成為人們工作生活中不可缺少的一部分,遠程辦公的普及使得人們更習慣使用手機中的各種移動應用處理工作,導致敏感信息更容易被不法分子獲取,存在較大安全隱患,安全防護能力亟待加強。可信計算作為信息安全領域研究的熱點之一,在移動安全領域中應用廣泛、場景豐富,例如移動票據、移動支付、可信終端等[3]。
移動應用的靜態度量,關鍵技術是靜態度量方法以及針對特定移動操作系統的設計實現。本文討論的移動應用專指以移動終端為載體、運行在移動操作系統之上的應用程序。移動操作系統目前主要分為Android系統和iOS系統兩大陣營。近兩年,國產華為鴻蒙系統發展迅猛,國產操作系統市場占有率逐漸擴大。iOS系統是一個封閉的移動操作系統,無法在系統層面進行定制與集成,相比之下,Android與Open Harmony均為開源系統,在系統層面可靈活設計與定制[4]。
本文研究設計的基于可信計算的移動應用靜態度量方法適用于各類型移動操作系統。考慮到方法的通用性、廣泛性和驗證的可行性,本文以Android系統為基礎,進行方法設計與后續驗證。基于Android系統的移動應用是以Android應用程序包(Android Application Package,APK)為文件格式的應用程序,其本質是壓縮包文件,文件中包含開發者簽名信息,用于在安裝過程中對開發主體進行認證,應用簽名驗簽機制可作為應用合法性認證的原理基礎。應用程序的兩項關鍵流程是安裝與啟動,由操作系統的包管理服務(Package Manager Service,PMS)和活動管理服務(Activity Manager Service,AMS)來處理,同時安裝與啟動也屬于可信計算應用度量的兩個重要的計算節點[5]。應用安裝流程中系統調用PMS,應用啟動流程中系統調用AMS。其中,PMS服務是Android系統的核心服務之一,主要負責各種APK的安裝、卸載、優化和查詢。AMS服務主要負責系統中組件的啟動、切換、調度及應用進程的管理和調度等工作。
可信計算包括可信根、信任鏈、可信度量和可信報告四部分,要求系統嚴格按照設計和策略運行。可信度量分為靜態度量和動態度量,靜態度量是可信度量的一種重要度量手段。對于移動操作系統,靜態度量包括系統側靜態度量和應用側靜態度量[6]。其中,系統側靜態度量是指針對系統鏡像、內核驅動、系統關鍵服務進行的完整性檢查和非法性判斷。移動終端處于出廠狀態第一次引導時或系統鏡像更新后第一次引導時,自動采集生成靜態可信度量基準值。應用側靜態度量是在可信白名單的基礎上對應用可執行文件進行度量檢查,可執行程序在可信白名單檢查通過的情況下方可運行,否則運行失敗[7]。度量方法為通過使用可信計算密碼平臺提供的哈希函數接口,計算度量對象的完整性校驗值,并與基準值進行比較。
可信計算靜態度量的主要思路:首先確定度量對象,通過合法性校驗后,使用度量算法生成度量對象的基準值,維護可信基準庫。在度量對象啟動運行前,獲取所述度量對象的度量值,對比所述度量對象的度量值和基準值。最后根據判斷機制,判定所述度量對象的可信性,決定是否啟用度量對象。以上思路是本文所述方法的主要依據。
移動應用靜態度量的總體架構包括兩條業務主線和兩個組件服務,所有處理邏輯都在系統的框架層運行。兩條主線即應用的安裝與啟動,貫穿系統的PMS服務和AMS服務。兩個組件服務即應用認證服務和靜態度量服務,其中認證服務主要用于驗證應用的合法性,此服務可參考應用簽名驗簽機制來設計實現,可定制化較高,通過認證服務后可根據應用信息計算生成基準值。靜態度量服務主要用于計算應用度量值,根據判定機制,結合可信基準庫,決定應用是否能夠啟動運行。
總體架構流程如圖1所示,本文將從應用的安裝、啟動、更新和卸載四個使用場景詳細介紹處理流程。

圖1 總體架構流程圖
應用APK程序包下載至移動終端后,系統加載應用文件,執行PMS服務安裝程序。首先PMS調用應用認證服務對APK文件進行合法性認證,認證通過后在可信基準庫中創建應用初始化信息,然后繼續執行系統的安裝流程。安裝完成后,立即使用可信度量算法模塊生成應用程序可執行文件的基準值,覆蓋存儲上步生成的應用初始化信息。
應用啟動運行時,系統執行AMS服務流程,首先使用可信度量算法模塊計算應用可執行文件的度量值,在可信基準庫中查找此應用的基準值,并根據判定機制,將度量值與基準值進行對比校驗。通過校驗后即可啟動應用,如果判定失敗,則禁止啟動應用,并給出相應安全風險提示。最后將度量計算結果等信息保存至可信記錄文件,供后續審計使用。
更新應用程序包,步驟與應用安裝流程相同。系統加載文件,執行PMS服務安裝程序,對APK文件進行合法性認證,通過認證后進行覆蓋安裝,并重新生成基準值,覆蓋可信基準庫中此應用的初始基準值。
卸載應用程序,系統調用PMS服務,執行卸載流程,并刪除可信基準庫中此應用的基準值,同時刪除可信記錄列表中此應用的數據。
根據安裝使用分類,移動應用一般分為內置應用、預裝應用和三方應用。其中,內置應用是終端系統自帶的應用,以手機移動操作系統為例,內置應用包括電話、短信、聯系人、藍牙等系統基礎功能應用;預裝應用是第三方軟件商通過刷機渠道強制裝入的軟件,或者是一些定制需求中預裝的應用;三方應用是用戶通過應用市場安裝或其他途徑安裝至終端的應用。參與度量的應用范圍如圖2所示[8]。

圖2 參與度量的應用范圍
內置應用是用戶使用頻率較高的一類應用,提供了系統的基礎性功能。啟動速度和使用體驗是用戶優先考慮的兩大因素。在可信度量過程中,文件加載、度量值計算和校驗占用了一定時間,因此會影響應用的啟動速度。并且內置應用要求權限高,需要系統簽名才能安裝更新,程序中不包含三方組件和邏輯,風險較低,因此內置應用不在度量的應用范圍內。預裝應用和三方應用涉及第三方軟件廠商的干預,因此必須參與度量校驗,屬于需參與度量的應用。
經對Android系統分析驗證,三方應用安裝完成后可在系統/data/app/[package]目錄下找到相關安裝文件,通常包括三類文件,如圖3所示,包括base.apk文件、lib目錄文件和oat目錄文件。其中base.apk文件是安裝程序包的鏡像文件;lib目錄下是應用的動態庫文件;oat目錄下是應用的可執行字節碼文件,在混合編譯模式下會生成dex、odex、vdex等文件[9]。

圖3 應用中參與度量的文件范圍
oat目錄下主要存放經過優化的可執行字節碼文件,Android 7.0版本后采用混合編譯的模式,應用程序直接安裝,不再預先編譯,但系統會在空置或充電等狀態下對部分熱點代碼進行編譯,編譯后的熱點代碼不再進行重復編譯。應用再次運行時,如本地有相關機器碼,將直接運行。熱點代碼信息維護在應用所屬的一個屬性文件中,隨著應用使用情況的變化而變化,因此oat下的可執行文件會隨著熱點代碼信息而改變。靜態度量的原理是對不發生改變的靜態文件進行度量與計算,因此oat目錄下的文件不參與度量[9]。
base.apk文件可理解為應用程序在系統中的鏡像文件,如果應用未在后臺運行,每次啟動應用時系統會加載此文件,解析出相關資源文件,若此時可執行字節碼文件不存在,將根據系統編譯機制生成相關文件,base.apk文件在系統中的狀態和屬性會保持不變,并提供了應用程序運行所需的完整資源,因此base.apk文件需要參與度量[10]。
lib目錄下包含了應用所需的動態庫文件,此類文件通常包含應用的主要功能邏輯,動態庫文件的狀態和屬性都是靜態不變的,一旦發生變化即表明應用程序被惡意篡改,因此lib目錄下的所有動態庫文件都需要參與度量[11]。
可信靜態度量的機制是度量值與基準值進行對比校驗。應用安裝完成后生成基準值,每次啟動應用時計算其度量值,通過對二者進行對比校驗,判斷應用是否合法。基準值通過合法性認證后生成,其中,合法性認證可根據行業需求定制不同的方案,例如可利用簽名驗簽機制保證應用的完整性和來源的合法性。
本節將通過程序實例驗證上述方法的可行性。在實驗環境的準備上,以通用主流、具有代表性為主要依據。實驗樣機采用手機型智能終端,規格參數屬行業中上水平,樣機系統應獲得超級管理員權限,實驗中選用了2款Android系統測試樣機,樣機的基本設備信息如表1和表2所示,后續測試數據截圖以樣機1為代表進行展示,樣機2的測試數據做補充描述。

表1 樣機1基本信息表

表2 樣機2基本信息表
實驗應用樣例選用百度地圖開發者平臺提供的Android版本樣例應用,此應用為提供給廣大開發者參考使用的樣例,具有廣泛使用性,應用基本信息如表3所示。

表3 應用基本信息表
首先將應用安裝至實驗樣機,安裝過程調用應用認證服務,通過合法性驗證,生成應用的基準值。在實驗環境下查看可信基準庫文件,此處為方便查看結果,基準庫以加密文件的方式進行演示,如圖4所示。對數據進行加密處理,以“KEY=VALUE”格式存儲每條應用的數據,其中,“=”為分割標識,“KEY”為應用標識(可使用包名等信息作為唯一標識),“VALUE”為應用的基準值。

圖4 可信基準庫文件
在未對應用進行任何篡改處理的情況下正常啟動應用,查看可信記錄文件,日志數據如圖5所示,若應用度量結果返回值為true,則允許應用啟動運行,符合預期。

圖5 日志數據
由表3可見,此樣例程序的安裝文件總計7個,按照度量文件范圍分析的結論,排除oat目錄下的2個可執行文件,此應用參與度量的文件包含以下5項,如表4所示。

表4 度量文件列表
樣例應用共包含5個參與靜態度量的文件,可對任意文件進行篡改,方式包括修改文件、刪除文件和增加文件等,均可達到篡改應用的目的。篡改方法中使用了Android調試橋工具(Android Debug Bridge,adb),此工具和命令可對Android系統下的文件進行操作。
(1)修改文件:首先使用adb pull命令將base.apk文件拉出,使用編輯工具打開文件,在文件任意位置插入非法字符,使用adb push命令將修改后的base.apk文件推入至原目錄下,覆蓋原始文件,完成上述操作后啟動應用查看結果。
(2)刪除文件:以超級管理員權限進入lib目錄,執行刪除命令,將動態庫liblocSDK8b.so刪除,完成上述操作后啟動應用查看結果。
(3)增加文件:準備一個非法動態庫文件libtesterror.so,使用命令adb push,將此非法文件推入至lib目錄下,完成上述操作后啟動應用查看結果[12]。
以上三種篡改方式執行后,樣機1的度量結果如圖6所示。三種篡改方式的度量結果返回值均為false,表示禁止應用啟動,樣機1的實驗結果符合預期。

圖6 篡改應用后度量結果
經驗證,樣機2在相同的實驗步驟下,實驗結果同樣符合預期,僅在度量處理耗時上略有差異。綜上結果證明,所提方法能夠有效阻止攻擊者對移動應用進行篡改,保證了應用在使用過程中的合法性和完整性。
基于可信計算的移動應用靜態度量方法的性能瓶頸是度量算法。在上節實驗中,樣例應用大小為93.4 MB,樣機處理器參數屬主流水平。由測試結果數據可見,度量計算時間在3 s以上,在后續的測試中發現,隨著應用文件大小的增加,度量時間也會等比例增長。對于使用者而言,在應用高頻的使用和切換過程中,啟動一個應用的等待時間需要3 s,非常影響用戶體驗。同時,近年來,隨著終端存儲配置的大幅提升,各類應用文件大小也成指數級增長,尤其游戲類應用,通常大小都在500 MB以上,參照上述結論推算,度量時間可能需要15 s以上,這將極大地影響用戶體驗,通常用戶難以接受。除此之外,Android系統中單個虛擬機內存大小默認為256 MB[13],受此限制,度量計算過程中,如果應用程序文件過大,超過虛擬機內存上限,就會造成系統服務異常崩潰。針對以上兩個問題,優化度量算法是解決問題的關鍵,本文提出了一種較為獨特的文件度量算法。
下面對未經優化的原始度量算法和優化后的度量算法進行對比說明。未經優化的原始度量算法如圖7所示,一次性將應用文件全部讀取至虛擬機中處理,虛擬機中啟用一個線程執行計算操作,輸出結果。在此處理過程中,如果應用文件大小超過虛擬機內存上限,勢必會導致內存溢出,并且由于是單線程執行,效率低,計算耗時[14]。

圖7 原始度量算法
優化后的度量算法如圖8所示,借鑒分治算法思想,將文件分塊分組處理。虛擬機中每次讀入1個分組,利用線程池,在計算單元并發計算多個分塊,并按照后續順序執行其他分組,合入最終結果。

圖8 優化后的度量算法
優化后的度量算法能夠有效解決內存溢出和計算耗時的問題,合理設置計算資源,合理劃分文件分塊分組大小[15],進一步提升了計算效率。
采用上述優化算法后的度量結果,樣機1的數據如圖9所示,對于相同的樣例應用,優化后的度量算法所需度量計算時間為0.107 s,相較于未經優化的原始度量算法所需的3 s度量計算時間,性能提升了96.433%,相同實驗步驟下,樣機2性能提升了95.965%,綜上分析可見,優化后的度量算法效果顯著。

圖9 優化后算法度量時間
本文基于可信計算靜態度量實現思路,研究設計了一種針對移動應用的靜態度量方法,通過設計應用度量流程與架構,分析應用和文件的度量范圍,優化度量算法,結合實驗測試,驗證所提方法的可行性與正確性。所提方法流程清晰,實現簡單,理論基礎同樣適用于其他類型的移動操作系統,應用范圍較廣,可落地性極強,從一定意義上來看,填補了當前移動安全領域應用靜態度量實現方案的空白,解決了移動應用在長期使用過程中存在的安全機制缺失的問題。
隨著國內移動終端定制化安全需求的激增,以及等保、可信計算相關行業標準的落地與實施,尤其是對政企等一些重要行業和領域,本文所提方法具有一定的指導意義,能夠為移動應用安全領域的相關工作提供建設性參考。