問題描述
Android 市場的開放性導致了惡意軟件(Malware)的盛行。據360 安全中心報告,每天都能截獲數万個Android 惡意軟件,使得Android Malware Detection 成為研究人員熱議的話題。傳統的Android 惡意軟件檢測方法主要依賴於基於規則或簽名的檢測機制,其中使用yara 實現相對簡單。但這種基於簽名的檢測方法是信息密集型的,需要持續收集新的簽名,而基於規則的實現則極為複雜,極易導致誤報或讓狡猾的惡意軟件逃過檢測。
隨著機器學習的流行,越來越多的研究人員開始嘗試利用機器學習來實現惡意軟件的檢測。核心思路是從Android 的APK 文件中提取信息,用於訓練模型,隨後預測其他APK 文件是否為惡意軟件。根據信息提取方法的不同,主要分為兩類:一類是通過靜態分析,從APK 中提取permissions、intents、receivers 等組件,以及通過反編譯提取代碼調用,利用這些信息進行模型訓練;另一類是通過實際安裝運行APK,攔截網絡請求和監聽系統API 調用來獲取數據,作為模型訓練的基礎。
在探討此問題時,由於“Incinerator”項目的動態檢測功能尚未完全實現,我們暫時缺乏研究動態分析的條件,因此選擇採用靜態分析方法進行研究。
當前主流方案
基於靜態分析的機器學習訓練方案主要包括以下幾類:
權限提取訓練:
從AndroidManifest.xml中提取permissions信息進行模型訓練。
綜合信息提取訓練:
從AndroidManifest.xml中提取permissions、intents、receivers等信息,並通過反編譯從APK 中基於規則抽取Android 系統API 調用等信息進行模型訓練。
整體APK 訓練:
將整個APK 文件作為機器學習訓練的輸入,包括將APK 文件的二進製字節流作為輸入,或通過反編譯抽取opcode作為訓練輸入。
據文獻報導,這些方案可實現90% 以上的準確率。尤其是方案3,準確率在92%-93% 之間,而方案1 和2 在多數研究中可達到95% 以上的準確率。
我們試圖重現文獻中的方案,首先著手基於permissions的方案進行驗證。
數據源:
惡意軟件集合:
a. 來自威脅情報公司abuse.ch 的Malware APK 集合2000 個(簡稱MB)
b. VirusShare 2020/2021/2022 的Malware 集合(簡稱VS2020/VS2021/VS2022)
良性軟件集合:
a. 從應用寶下載的APK 10000 個
b. 從APKPURE 下載的APK 10000 個
訓練方法
通過靜態分析從APK 的AndroidManifest.xml中抽取AOSP (Android Open Source Project) permissions,並通過One-hot Encoding 的方式輸入模型進行訓練。模型選擇採用傳統的機器學習二分類模型如隨機森林、SVM 等進行訓練。經測試,隨機森林的效果最佳,準確率可達98%。
我們選擇應用寶的APK 作為良性樣本,VS2022 作為惡意軟件樣本,進行訓練。訓練數據如下:
模型PrecisionRecallFPR隨機森林0.9830.9830.056SVM0.9810.9770.063
然後我們對其他數據集進行測試驗證:
數據集PrecisionRecallFPRAPKPure0.0NAN0.59MB1.00.95NANVS20201.00.96NANVS20211.00.94NAN
在進行APKPure 數據集的驗證時,發現模型的假陽性率異常高,超過了50%,這表明模型在不同數據集的交叉驗證上表現不佳。同時,在MB、VS2020、VS2021 數據集上得到的高準確率由於高假陽性率而變得無意義。
為了深入理解模型的預測表現,我們選擇使用LinearSVM(線性支持向量機)來解釋模型的預測結果,並嘗試探討可能出現的問題:
在訓練過程中,共有265 個權限被用於訓練模型。我們重點分析了對於Malware 預測結果影響最大的30 個權限:
01.9507425950717683android.permission.READ_SMS
11.6805547441380115android.permission.SEND_SMS
21.5291784053142392android.permission.RECEIVE_SMS
31.281383891333467android.permission.WRITE_SMS
41.1385944832617678android.permission.GET_DETAILED_TASKS
51.0870145778775504android.permission.MANAGE_USERS
60.9822953162458009android.permission.SET_TIME_ZONE
70.9815855293627985android.permission.REQUEST_DELETE_PACKAGES
80.8705538278525148android.permission.ACCOUNT_MANAGER
90.7701851337780519android.permission.ACCESS_CACHE_FILESYSTEM
100.7493889020376178android.permission.PERSISTENT_ACTIVITY
110.742267985802697android.permission.SET_PREFERRED_APPLICATIONS
120.6575763216374741android.permission.USE_SIP
130.6423455602781643android.permission.MODIFY_PHONE_STATE
140.5733719308777389android.permission.READ_CALL_LOG
150.5713221448442122android.permission.WRITE_SECURE_SETTINGS
160.5177117115666185android.permission.CLEAR_APP_CACHE
170.5013751180995185android.permission.WRITE_SYNC_SETTINGS
180.47540432455574055android.permission.INJECT_EVENTS
190.450576746748121android.permission.BIND_ACCESSIBILITY_SERVICE
200.4497437629117625android.permission.READ_SYNC_STATS
210.40721040702182304com.android.alarm.permission.SET_ALARM
220.3958974436391258android.permission.GET_PACKAGE_SIZE
230.35828369132005317android.permission.TRANSMIT_IR
240.3538089622374305android.permission.CHANGE_COMPONENT_ENABLED_STATE
250.3303834311984685android.permission.STATUS_BAR
260.3277728921018696android.permission.WRITE_USER_DICTIONARY
270.31322691738916597android.permission.SET_DEBUG_APP
280.28600828593282673android.permission.INSTALL_PACKAGES
290.27804088205285526android.permission.SHUTDOWN
導致Benign 結果最重要的30 個權限:
1-1.0280830288092226android.permission.FORCE_STOP_PACKAGES
2-1.0244749163270055android.permission.DELETE_CACHE_FILES
3-0.9235183435775582android.permission.READ_PRIVILEGED_PHONE_STATE
4-0.7975588094210508android.permission.USE_BIOMETRIC
5-0.7691538868495551android.permission.READ_CELL_BROADCASTS
6-0.7288571523071693android.permission.REQUEST_INSTALL_PACKAGES
7-0.7278186994140812android.permission.WRITE_CALL_LOG
8-0.7029898754031535android.permission.READ_SEARCH_INDEXABLES
9-0.6832562629713737android.permission.ACCESS_NOTIFICATION_POLICY
10-0.6442707037030093android.permission.BIND_NOTIFICATION_LISTENER_SERVICE
11-0.6229441323892875android.permission.CAPTURE_AUDIO_OUTPUT
12-0.5951302503005503android.permission.REORDER_TASKS
13-0.552113274404841android.permission.FACTORY_TEST
14-0.5512329811397917android.permission.CAMERA
15-0.5415431826751977android.permission.PACKAGE_USAGE_STATS
16-0.5373788445105623android.permission.READ_SYNC_SETTINGS
17-0.5300427083556158android.permission.ACCESS_WIFI_STATE
18-0.48952375397337794android.permission.READ_PHONE_NUMBERS
19-0.4822239255635727android.permission.STOP_APP_SWITCHES
20-0.4525220364959383android.permission.WRITE_MEDIA_STORAGE
21-0.4133049145725493com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
22-0.3902532535519829android.permission.CAPTURE_VIDEO_OUTPUT
23-0.34681147328619505android.permission.READ_FRAME_BUFFER
24-0.34134222449779317android.permission.WRITE_GSERVICES
25-0.3335042039412585android.permission.BIND_APPWIDGET
26-0.3263774109427998android.permission.AUTHENTICATE_ACCOUNTS
27-0.3136298914538836android.permission.NFC
28-0.3000955825422318android.permission.READ_EXTERNAL_STORAGE
29-0.2846046321402758android.permission.CALL_PRIVILEGED
30-0.28338090002182315android.permission.READ_CALENDAR
在表格中,第二列顯示了通過SVM 計算得到的權重值。由於在標籤設定中,Malware 被標記為1,而Benign 被標記為0,且訓練數據的格式是0,1,1,0,0,1,1,0,這樣的布爾值,因此,當權重為正時,該權重在計算Malware 的預測結果時具有較高的重要性;權重值越大,其重要性越高。相反,當權重為負時,該權重在計算Benign 的預測結果時具有較高的重要性;權重值越小,其重要性越高。
通過分析這些權限及其功能,我們發現Malware 相關的權限通常比Benign 相關的權限具有更高的危害性。在一定程度上,這種模型的設計是合理的。例如,模型成功識別了與SMS 相關的權限主要與Malware 相關,並賦予了較高的權重,這意味著,基本上,一個APP 如果包含SMS 權限,就非常可疑。實際上,普通的APP 不應該請求此類權限,因為短信管理通常是系統APP 的職責。
然而,這裡存在一個問題:權限的存在是因為Android 系統認為某些行為可能不妥,需要用戶確認。所以,理論上,所有需要請求的權限都有可能對用戶造成損害。因此,沒有請求權限應該被視為一個加分項。但在二分類機器學習的情境下,模型會做出區分,因為Benign 類別的存在意味著一定會有一部分權限被視為支持Benign 的證據。
現在我們來分析為什麼會出現如此高的假陽性率: 我們使用LinearSVC 來解釋模型的預測結果,並對一些具有假陽性的權限信息進行分析:
0.1773649887447295android.permission.WAKE_LOCK
0.01285824377030036android.permission.INTERNET
-0.1357928094523775android.permission.ACCESS_NETWORK_STATE
0.43102404170044467com.android.alarm.permission.SET_ALARM
0.1773649887447295android.permission.WAKE_LOCK
0.14741402851800423android.permission.SYSTEM_ALERT_WINDOW
0.02740438240042149android.permission.FOREGROUND_SERVICE
0.01285824377030036android.permission.INTERNET
-0.1357928094523775android.permission.ACCESS_NETWORK_STATE
-0.15043626374678254android.permission.WRITE_EXTERNAL_STORAGE
-0.1975995718519041android.permission.CHANGE_WIFI_STATE
-0.20461138790573433android.permission.VIBRATE
-0.511067438637911android.permission.ACCESS_WIFI_STATE
0.1773649887447295android.permission.WAKE_LOCK
0.02740438240042149android.permission.FOREGROUND_SERVICE
0.01285824377030036android.permission.INTERNET
-0.1357928094523775android.permission.ACCESS_NETWORK_STATE
-0.33867385510052594android.permission.READ_EXTERNAL_STORAGE
-0.511067438637911android.permission.ACCESS_WIFI_STATE
而真陽的權限信息:
0.32757400447767016android.permission.INSTALL_PACKAGES
0.2870058866311678android.permission.READ_PHONE_STATE
0.1773649887447295android.permission.WAKE_LOCK
0.1545767541451571android.permission.FLASHLIGHT
0.14613075920332474android.permission.BLUETOOTH_ADMIN
0.140268653568319android.permission.GET_ACCOUNTS
0.08641386050999389android.permission.MOUNT_UNMOUNT_FILESYSTEMS
0.06460516872049353android.permission.ACCESS_COARSE_LOCATION
0.01285824377030036android.permission.INTERNET
-0.009804892771664459android.permission.ACCESS_FINE_LOCATION
-0.12321341834571817android.permission.READ_LOGS
-0.1357928094523775android.permission.ACCESS_NETWORK_STATE
-0.15043626374678254android.permission.WRITE_EXTERNAL_STORAGE
-0.15994619600450963android.permission.CHANGE_NETWORK_STATE
-0.16005902734200772android.permission.WRITE_SETTINGS
-0.1975995718519041android.permission.CHANGE_WIFI_STATE
-0.20461138790573433android.permission.VIBRATE
-0.23536025455979454android.permission.CALL_PHONE
-0.24802834827531783android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
-0.30018060973660377android.permission.BLUETOOTH
-0.33867385510052594android.permission.READ_EXTERNAL_STORAGE
-0.511067438637911android.permission.ACCESS_WIFI_STATE
-0.5625902678304402android.permission.CAMERA
-0.7242676191415552android.permission.REQUEST_INSTALL_PACKAGES
通過分析,我們發現了一個模式:擁有較少權限的APK 往往會被誤判,而權限較多的APK 基本能得到正確的預測。深入探究後,我們理解到這種現象的出現主要是由於APKPure 樣本中大多數APK 的權限數量較少,而我們的訓練模型主要基於權限較多的應用寶APK 樣本。因此,預測誤差的產生在一定程度上是由樣本差異導致的。
為了解決這個問題,一個直接的方法是將APKPure 的數據也納入訓練過程,以增強模型的泛化能力和預測準確性。
我們採取了以下措施:從APKPure 樣本中隨機抽取一半,即5000 個APK,同時從應用寶樣本中隨機抽取一半,約5000 個APK,一同用於模型的訓練。然後,我們使用這個新訓練得到的模型來預測未參與訓練的樣本。結果顯示,新模型的預測準確率得到了顯著提高。
模型PrecisionRecallFPR隨機森林0.9940.9670.008SVM0.9940.9670.008
然後我們對其他數據集進行測試驗證:
數據集PrecisionRecallFPRAPKPure 未參與訓練的樣本0.0NAN0.018MB1.00.878NANVS20201.00.92NANVS20211.00.89NAN
假陽性率已降至可接受的水平。這個實驗揭示了一個重要的現象:在訓練集上獲得理想的結果相對容易,但在現實世界中準確預測卻可能面臨挑戰。無人能保證所收集的樣本完美地反映了現實世界的情況,而我們的目標是識別那些真正與惡意軟件(Malware)相關的特徵。因此,我們決定嘗試探索其他可能的解決方案。
1. 基於 Intents 和 Receivers 的訓練
隨後,我們擴展了特徵集,加入了從AndroidManifest.xml中提取的intents和receivers信息進行訓練,然而,這並沒有提高模型的準確率。
2. 基於系統 API 調用的訓練
我們進一步嘗試提取APK 中的所有系統API 調用,將其轉換為適合卷積神經網絡(CNN)的格式,並通過CNN 來訓練模型。在訓練集上,模型達到了令人滿意的97% 的準確率,但在數據集交叉驗證時,表現仍然不盡如人意。
在這過程中,我們遇到了幾個問題:
API 調用頻率的不明顯差異: 最初,我們通過反編譯提取了所有出現過的API 調用,卻發現這些API 的調用頻率並沒有明顯差異。例如,我們原本認為accessibilityservice 的調用明顯與惡意軟件相關,卻發現在良性軟件中也頻繁出現。後來我們了解到,這主要是因為大多數APK 都依賴於android 這個庫,而該庫中包含了大量的系統API 調用。由於Malware 和Benign APK 都依賴於大量的第三方庫,這些庫中存在大量的系統API 調用,使得我們難以從系統API 調用的統計結果中區分Malware 和Benign。即便我們使用了incinerator 的SCA 分析功能來檢測和剔除這些第三方庫,結果仍然不盡如人意。
第三方庫的干擾: 我們發現,很少有研究考慮到第三方庫的干擾,並提出剔除第三方庫的具體方案。如果不剔除這些庫,基於靜態分析的方法幾乎毫無意義,因為靜態抽取會抽取出大量未被調用的API