李星政 黃曉昆 紀勝龍 覃鐵偉 馮丙文
(1.暨南大學網(wǎng)絡空間安全學院,廣東 廣州 510635;2.工業(yè)和信息化部電子第五研究所,廣東 廣州 511370;3.奇安信科技集團股份有限公司,北京 100044)
根據(jù) Statcounte (2021)[1]研究顯示,目前安卓以72%的份額主導智能手機市場,遠超其他移動智能操作系統(tǒng)。這樣龐大的市場引起大量攻擊者的注意。盡管安全研究人員以及相關公司不斷地改善安卓系統(tǒng),但是軟件應用安全仍然是一個嚴峻的問題,其中,敏感數(shù)據(jù)泄露尤為嚴重。因此,作為數(shù)據(jù)檢測主要手段之一的污點分析引起了極大的關注。在污點分析[2-3]中,研究者通過污點分析過程中是否需要運行程序將污點分析分為靜態(tài)污點分析和動態(tài)污點分析。筆者采用靜態(tài)污點分析作為信息泄露的檢測方案,靜態(tài)污點分析指在程序不運行的情況下,通過代碼對程序進行分析,避免出現(xiàn)路徑覆蓋不完整的問題。同時,該文提出通過構建雙向污點流圖來加速信息泄露檢測方案的檢測效率。
在安卓應用程序上,靜態(tài)污點分析有多種應用方式[4]。在早期的安卓安全研究中,Hu、Enck 等人[5]提出了幾款輕量級檢測工具,這些工具基本都是通過分析請求的權限或調用的API方法來判斷安卓應用的安全性。這些方法僅對代碼進行了粗略分析,盡管這些工具的檢測成本較低,但其檢測的精度也比較低,常常會出現(xiàn)誤判和少判的情況,很難達到一個較高的準確率。隨著對信息泄露檢測的重視,檢測的方案也不斷進步,Arzt S等人[6]提出1個適用于上下文、流、場和對象敏感的靜態(tài)污點分析工具FlowDroid,它將前向污點分析與后向別名分析結合起來,從而實現(xiàn)高效精確檢測,但是FlowDroid在一些大型應用程序中的運行成本較高。
在近幾年的研究中,不少研究者針對安全檢測的效率和精度進行了改進,Cai等人通過減少對當前應用版本與之前的版本中相同代碼的檢測來減少需要檢測的代碼數(shù)量,以達到降低成本的要求,但是在沒有舊版本記錄的情況,這種方法無法達到一個較好的效果。張婕等人[7]提出用FastDroid將污點分析和別名分析結合起來,從程序中抽象提取污染變量關系圖和潛在污染流,并對其進行驗證,從而提升檢測效率。
為了檢測Android工業(yè)App是否存在信息泄露的問題,該文基于靜態(tài)污點分析技術設計了1個信息泄露檢測方案。如圖1所示,該方案主要分為3個模塊,預處理模塊、污點分析模塊和污點流驗證模塊。其中,預處理模塊作為基礎,為方案的后續(xù)工作提供各種信息和配置,污點分析模塊作為方案核心,以完成系統(tǒng)信息泄露檢測的工作,污點流驗證模塊作為方案的增補,可以提高方案的準確率。該方案在預處理模塊中對待檢測的軟件應用進行分析,提取軟件應用的各種信息,同時配置系統(tǒng)的靜態(tài)污點分析策略。在污點分析模塊中,根據(jù)預處理模塊采集的軟件信息并結合預設好的規(guī)則對軟件應用進行分析,從而構建污點流圖。最后在污點流驗證模塊中利用污點分析模塊生成的污點流圖提取軟件的污點流,在控制流圖和調用關系圖上進一步檢查、證明污點流的可行性。

圖1 檢測方案
在預處理模塊中,系統(tǒng)會根據(jù)軟件應用以及預設的規(guī)則收集應用的信息以及配置系統(tǒng)的檢測規(guī)則。首先,系統(tǒng)利用反編譯工具對APK文件進行逆向處理,反編譯出Dex文件等一系列與軟件相關的文件。其次,為了更好地對應用進行靜態(tài)污點分析和構建污點流圖,系統(tǒng)會進一步根據(jù)一定規(guī)則將Dex文件反匯編為可以被用戶更好理解的Smali代碼文件。再次,系統(tǒng)利用詞法分析算法和APK分析工具對軟件應用進行解析,從而構建與軟件對應的調用關系圖(Call graph,CG)以及組件內的控制流圖(Control flow graph,CFG)等分析信息,這些軟件應用信息可以為靜態(tài)污點分析模塊檢測軟件應用信息泄露情況提供幫助。最后,系統(tǒng)將預先設置好的靜態(tài)污點分析的規(guī)則與軟件應用的權限申請進行匹配,根據(jù)應用申請的權限情況對之后的信息泄露檢測的規(guī)則進行配置,如果應用申請的權限涉及敏感信息,系統(tǒng)便對該權限對應的規(guī)則進行配置,反之則不配置該權限的污點分析規(guī)則,例如應用如果存在申請外部文件讀寫權限的情況,系統(tǒng)就會增加針對外部文件泄露檢測的規(guī)則,這樣避免了對應用進行不必要的完全檢測。如果應用并沒有申請短信權限,但系統(tǒng)依舊對應用進行的短信泄露敏感信息進行檢測,就會導致浪費大量的資源。同時,該配置可以達到有針對性檢測的效果,這樣可以滿足信息泄露檢測的需求,從而加快檢測速度。
在預處理模塊中,對一個待檢測的應用軟件進行反編譯后會得到一些對應的Smali文件,這些Smali文件具有良好的結構以及可讀性,可以通過這些文件較好地對應用軟件進行靜態(tài)污點分析。同時,通過對應用軟件的靜態(tài)分析,構建該軟件對應的CG圖和CFG圖,這些CG圖和CFG圖在污點分析模塊和污點流驗證模塊上可以較好地為函數(shù)內執(zhí)行順序以及軟件調用關系等提供幫助。最后通過過濾應用申請的權限得到有針對性的靜態(tài)污點分析策略,這個策略在后續(xù)的模塊中縮小了檢測的范圍,減少了不必要的工作。
2.2.1 靜態(tài)污點分析
污點分析模塊主要根據(jù)配置的污點分析策略對敏感的數(shù)據(jù)進行追蹤分析,并根據(jù)信息流傳播路徑來判斷該數(shù)據(jù)是否存在泄露的可能性。Smali代碼相較于應用原生代碼更容易被人理解和分析,因此該文針對安卓的Smali代碼進行分析,從而實現(xiàn)靜態(tài)污點分析模塊,該模塊設計的污點分析過程如圖2所示。

圖2 污點分析
首先,系統(tǒng)根據(jù)預處理模塊配置的策略選擇對應的Source和Sink,并構建靜態(tài)污點分析的入口點函數(shù)。其次,通過匹配入口點函數(shù)相關的Smali語句對可能涉及的污點數(shù)據(jù)進行標記。最后,結合預處理模塊的控制流圖和預設的污點分析規(guī)則在函數(shù)內進行語法分析和污點數(shù)據(jù)追蹤,如果發(fā)生函數(shù)間的調用情況,則根據(jù)污點分析規(guī)則結合調用關系圖進入下一個函數(shù)繼續(xù)進行污點分析。以外部文件泄露的Sink點作為入口點為例,系統(tǒng)先將寫入外部文件的數(shù)據(jù)作為污點數(shù)據(jù),之后定位該相關Smali語句,用該語句結合控制流圖向前分析。如果發(fā)現(xiàn)該污點數(shù)據(jù)來自函數(shù)參數(shù),則通過調用關系圖查詢調用該函數(shù)的函數(shù)。如果發(fā)現(xiàn)該污點數(shù)據(jù)來自函數(shù)返回,則根據(jù)調用的函數(shù)繼續(xù)向前追蹤。如果發(fā)現(xiàn)該污點數(shù)據(jù)來自與Source無關的新數(shù)據(jù),則結束該污點流。系統(tǒng)通過反復函數(shù)內外的污點分析直到完成整個應用代碼檢測或者檢測到信息泄露的存在,即Source到Sink存在一條或多條未經(jīng)過無害化處理的信息流傳播路徑,則這條信息流傳播路徑可能是造成敏感信息泄露的路徑。
在污點分析模塊中,靜態(tài)污點分析作為模塊中的核心功能,其主要功能是通過分析軟件構建Source到Sink的污點流圖,這些污點流圖中包括Source到Sink所有的信息流傳播路徑。這些污點流圖將在之后的污點流驗證模塊中通過檢測這些路徑的正確性來進一步獲取更準確的污點流圖,從而得到軟件的檢測結果。
2.2.2 雙向分析
因為在傳統(tǒng)的靜態(tài)污點分析過程中常常會隨著分支語句的出現(xiàn)導致分析的數(shù)據(jù)越來越龐大,最后出現(xiàn)檢測效率降低的情況,所以為了提高污點分析的效率,系統(tǒng)提出了一種新的污點流圖構建方法。該方法是通過Source和Sink同時雙向展開靜態(tài)污點分析,從而減少單向分析造成多分枝的情況,進而實現(xiàn)減少一個需要分析的數(shù)據(jù)流傳播路徑的方法。具體來說,它首先在Source和Sink的相關Smali語句處同時展開靜態(tài)污點分析,之后根據(jù)系統(tǒng)預定義的污點傳播規(guī)則同時向后和向前遍歷相關的Smali語句,以檢測污點值及其別名的傳播,并在多次污點傳播迭代后構造應用的污點流圖。如果污點流圖中的Source和Sink中能夠形成一條通路,則說明該應用存在信息泄露問題。以獲取位置的Source點和寫入外部文件的Sink點為例。首先,系統(tǒng)定位獲取位置的函數(shù)的Smali語句和寫入外部文件的Smali語句。其次,根據(jù)預設規(guī)則標記它們涉及的數(shù)據(jù)作為污點數(shù)據(jù)。最后,Source點的污點數(shù)據(jù)向后分析,Sink點的污點數(shù)據(jù)向前分析,2種分析交替進行,直到它們相遇或某個方向完成分析。該方法可以更快地檢測到軟件信息泄露的可能性,大大減少了檢測所需要的時間。
系統(tǒng)中1個構建完成的污點流圖必定存在1條或多條Source到Sink的數(shù)據(jù)傳播路徑,可以將這些數(shù)據(jù)傳播路徑看作未確認的污點流。而在污點分析模塊中構建污點流圖的過程中可能會因為一些執(zhí)行語句順序上的錯誤產(chǎn)生一些錯誤的判斷,從而導致發(fā)現(xiàn)的數(shù)據(jù)傳播路徑是1條虛假污點流,這種虛假污點流盡管也可以在Source和Sink中形成1條通路,但這條路徑可能在到達Sink之前就對來自Source的污點數(shù)據(jù)進行數(shù)據(jù)替換或進行數(shù)據(jù)加密等無法找回原有數(shù)據(jù)的操作,該情況并不會造成數(shù)據(jù)泄露。因此,系統(tǒng)添加1個污點流驗證模塊來檢測污點流是否是正確的污點流,這個污點流驗證模塊對整個系統(tǒng)檢測數(shù)據(jù)泄露的準確性起到至關重要的作用,能夠大大減少系統(tǒng)對應用誤判的情況,提高系統(tǒng)整體的準確率。
首先,在污點流驗證模塊中,系統(tǒng)通過抽取污點流圖中Source到Sink的污點值流轉路徑作為待驗證污點流。其次,通過結合軟件的調用關系圖以及控制流圖來檢測該污點流是否符合軟件的調用過程和執(zhí)行次序,如果污點流中的污點值流轉次序不符合軟件的執(zhí)行次序,則判斷該污點流是虛假的污點流。最后,系統(tǒng)將檢測為正確的污點流作為結果呈現(xiàn)給用戶。
為了對所提出的檢測方案進行驗證,該文實現(xiàn)了一個自動化的檢測工具,同時通過該信息泄露檢測工具對大量APK進行檢測,以驗證其有效性。在檢測工具中,筆者對設備的敏感信息(例如位置信息、圖片、設備信息和聯(lián)系人等)是否在短信、網(wǎng)絡、藍牙、郵件以及設備存儲等渠道發(fā)生信息泄露情況進行檢測。
在試驗中,筆者通過檢測一款讀取用戶位置信息,并把位置信息存儲為gpx文件的應用程序來測試該工具是否可以成功的檢測應用的信息泄露情況。
檢測結果見表1,該工具成功地檢測出安卓應用中存在將位置信息泄露存儲到內部文件的情況。同時,從檢測結果來看,該自動化檢測工具可以清晰地展示應用可能造成的敏感信息泄露的信息流傳播路徑,可以較好地為之后的應用修復提供參考,具有較好的實際應用場景。

表1 運行時間測試
為了更好地分析該方案的運行時間,筆者選擇了3個生活中不同大小、真實使用中的APK文件進行檢測,同時記錄該工具檢測應用程序所需要的運行時間,見表2。

表2 運行時間測試
從表2中可以看出,該檢測工具的運行時間主要與APK文件的大小有關,通常APK文件越大,其檢測時間越長。
目前,市面上大多數(shù)的信息泄露檢測工具都需要人工的幫助來完成檢測,這些檢測時間周期大多為幾十分鐘到幾天不等。該文所提出的自動化信息檢測工具從具體的執(zhí)行時間結合生活實際使用的應用來看,應用檢測時間小于10 min,完全可以滿足實際工作中對時間的需求。
該文針對安卓應用的敏感信息泄露情況提出了一個高效的檢測方案,與以往的檢測方案不同,該檢測方案更專注于Source到Sink的情況,減少對應用全局的檢測,從而提高檢測效率。一系列試驗結果表明,該方案具有更高效的檢測效率以及更高的準確率。在未來工作中,將在該方案的基礎上提高檢測的靈活性,配置更全面的檢測面。