Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86395784

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

問題描述

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