VirtualApp(如下稱VA)是一個App虛擬化引擎(簡稱VA)。VirtualApp建立了一個虛擬空間,你能夠在虛擬空間內任意的安裝、啓動和卸載APK,這一切都與外部隔離,如同一個沙盒。運行在VA中的APK無需在Android系統中安裝便可運行,也就是咱們熟知的多開應用。緩存
VA免安裝運行APK的特性使得VA內應用與VA相比具備不一樣的應用特徵,這使得VA可用於免殺。此外,VA對被多開應用有較大權限,可能構成安全風險。安全
本報告首先簡要介紹VA的多開實現原理,以後分析目前在灰色產業的應用,針對在免殺的應用,安全雲對此的應對,並給出色情應用做爲例子。另外一方面,經過對樣本分析,展現了VA對於安裝在其內應用的高度控制能力,及其帶來的安全風險。最後對本報告進行總結。服務器
Android應用啓動Activity時,不管經過何種API調用,最終會調用到ActivityManager.startActivity()方法。該調用爲遠程Binder服務(加速該調用,Android應用會先在本地進程查找Binder服務緩存,若是找到,則直接調用。VA介入了該調用過程,經過如下方式:微信
1. 替換本地的ActivityManagerServise Binder服務爲VA構造的代理對象,以接管該調用。這一步經過反射實現。網絡
2. 接管後,當調用startActivity啓動多開應用時,VA修改Intent中的Activity爲VA中己聲明的佔位Activity。這一步的目的是繞過Android沒法啓動未在AndroidManifest.xml中聲明Activity的限制。併發
3. 在被多開應用進程啓動後,增長ActivityThread.mH.mCallback的消息處理回調。這一步接管了多開應用主線程的消息回調。框架
在以上修改的基礎上,多開應用的Activity啓動過程可分爲如下兩步驟:ide
步驟一 修改Activity爲己聲明的StubActivity函數
步驟二 mCallback從Intent中恢復Acitivty信息工具
AMS:Android系統的ActivityManagerService,是管理Activity的系統服務
VAMS:VA用於管理多開應用Activity的服務,大量API名稱與AMS雷同。
VApp:被多開應用所在的進程,該進程實際爲VA派生的進程。
由圖可知,VA在AMS和VApp中經過增長VAMS對啓動Intent進行了修改,實現了對Android系統的欺騙,而當應用進程啓動後,還原Activity信息。經過自定義Classloader令使得Android加載並構造了未在VA的AndroidManifest.xml中聲明的Activity。
以上是啓動過程的簡化描述,實際上,VA對大量Android 系統API進行了Hook,這使得運行在其中的應用在VA的控制下,爲VA的應用帶來可能性。
VA等多開工具將Android系統與VA內的應用隔離,使得應用的靜態特徵被掩蓋,目前己有惡意應用使用VA對自身重打包,重打包後的應用包名、軟件名與原應用不一樣,從而實現免殺。安全雲使用動態檢測關聯惡意應用和VA的方式應對該免殺技術。
免殺的常見作法是:惡意應用加密後打包在VA內,由VA在運行時解密APK,將惡意應用的APK安裝到VA內並運行。
通過打包後,VA用的包名、證書能夠與惡意應用不一樣,資源文件、二進制庫文件與惡意應用相互獨立。基於包名、證書等特徵維度的靜態檢測方式的準確性受到影響。
如圖,當靜態引擎對VA應用檢測時,得到的應用信息(包名、證書、代碼等)是VA的信息,沒有惡意特徵。而當VA運行時,能夠解密惡意應用APK,經過反射等技術欺騙Android系統運行未安裝在系統中的APK,實現了免殺。
傳統靜態檢測方式
針對該免殺方式,安全雲的APK動態檢測實現了VA內應用APK的自動化提取,可將VA母包與惡意應用APK子包進行關聯查殺。
如圖,動態引擎安裝並啓動APK,當識別出是VA應用時,提取出VA內的己解密的子包,對提取的子包進行檢測。根據子包檢測結果綜合斷定母包安全性,並對母包的安全風險進行標記查殺。
動態檢測查殺示意圖
免殺案例 色情應用
2017年8月以來,安全雲監測到部分色情應用使用VA的對自身打包,以達到繞過安全檢測的目的。這些應用使用了隨機的包名和軟件名,而且均對惡意應用子包進行了加密。部分包名如表所示:
從動態檢測引擎提取的子包看,一個色情應用子包對應的帶VA殼的母包(SHA1維度)數量從1到529不等。27個色情APK共對應1464個VA母包。
該類應用會以各類理由誘導用戶升到更高等級的VIP不斷支付:
讀取用戶短信收件箱:
而且能夠經過遠程服務器控制應用是否運行,控制支付寶和微信支付的開啓以逃避支付平臺打擊:
目前該類色情應用的VA母包和子包均己被標記爲灰色。
相較於以往反編譯後插入代碼進行打包編譯的方式,使用VA進行重打包具備如下優勢:
1. 不須要對原應用進行反編譯修改。
因爲VA是多開工具,這一優勢是顯然的。傳統的重打包方式是對應用進行反編譯成Smali代碼,對Application類或Activity進行修改,插入廣告展現等代碼,再重編譯打包回去。而VA重打包的應用只要讓應用運行在VA內便可。
2. 有效規避重打包檢測
應用可能經過檢測簽名、包名等方式檢查是否被修改。而VA對Android系統的API進行了Hook,其中包括PackageManager的API,這些API用於得到包括簽名在內的軟件包信息。
3. 通用性強
一樣的VA代碼未經修改就可打包衆多應用,可批量製造多開應用。
4. 功能衆多
因爲應用運行在VA進程內,VA代碼具備與應用等同的權限,從下面的例子可知VA能作到包括但不限於:模擬點擊、截圖、在Activity建立時插入廣告。以
以某一類重打包樣本爲例,應用被重打包後啓動界面增長一個插屏廣告,如圖:
點擊插屏廣告後,將下載對應的應用(圖中爲「鬥地主」及」炸金花」)並安裝到VA中,並在桌面添加圖標。區別於其餘應用推廣方式,此種方式安裝的應用沒必要經過Android的包管理器進行安裝,必要時也可靜默安裝。
除了增長啓動時的插屏廣告,該應用還有如下行爲
1. 檢查反病毒軟件
檢查手機上是否安裝了反病毒軟件,若是存在,則不鏈接服務器獲取命令。
反病毒軟件列表由服務器下發:
內容以下:
主流的手機安全應用如30、QQ手機管家、LE安全大師等均在該列表中。
若是存在,則不鏈接服務器讀取命令腳本:
2. 啓動應用
可由服務器下發指令控制運行VA內的指定應用:
3. 模擬點擊
可對運行在VA內的應用進行點擊。
1) 當VA內應用啓動時註冊Broadcast Receiver:
2) 接收服務器腳本,發送廣播
3) 執行點擊腳本
(1) 得到DecorViews,該View爲Android應用的底層View。由於被多開的應用跑在VA內,所以VA有權限對應用類進行操做。
(2) 對(1)得到的View,調用View.dispatchTouchEvent()模擬觸摸操做,支持的操做有,ACTION_DOWN(按下)、ACTION_MOVE(按下和擡起之間的操做)、ACTION_UP(擡起)。
(3) 值得注意的是,只有當用戶不存在(未點亮屏幕,未鎖屏)時,服務器的任務纔會執行:
4. 部分版本可對應用界面進行截圖
實現方式與模擬觸摸操做相似,先得到DecorView,以後調用Android系統提供的方法進行截屏:
對廣播進行響應,並保存截圖:
相應的上傳截圖功能:
5. 在Activity建立時顯示廣告
VA對Activity的生命週期函數進行了Hook,所以能夠方便地在Activity調用onCreate函數時顯示廣告:
6. 上傳設備信息
包括設備的型號、Android Id、分辨率等信息。
7. 上傳己安裝應用列表
VA可在應用Application類建立時執行代碼,這些代碼先於應用執行。經過結合Hook框架(如YAHFA、AndFix)、VA能夠方便對應用進行Hook,其Hook能力與Xposed框架等同。與Xposed框架比較如表所示:
相較於Xposed框架,經過此方式Hook具備以下優勢:
1. 不須要Root權限
2. 不須要重啓系統就能夠從新加載Hook代碼,重啓應用便可
3. 可與Native Hook框架結合,Hook二進制庫。實際上VA自己己使用Native Hook框架對應用的IO操做進行了重定向
VA的免Root Hook能力對於被多開應用是一種安全威脅。VA可作到的包括但不限於:
1. Hook密碼相關函數,截取用戶輸入的密碼
2. Hook網絡通訊函數,監聽網絡通訊
3. Hook Android API。僞造Android設備信息、GPS定位記錄等。
下面分析某微信搶紅包應用,以展現VA免Root Hook的能力。
該樣本是一個微信搶紅包應用。目前流行的搶紅包功能實現上有兩種方案,一種是經過Android AccessiblityServices監測用戶窗口,當紅包關鍵字出現時,點擊對應的View對象;一種是使用Xposed框架對紅包相關的函數進行Hook,這種方案須要Root權限,可是沒必要打開微信界面便可搶紅包。此應用搶紅包也使用Hook紅包相關函數的方式,可是不須要Root。
1. 注入代碼
VA實現了插件化的注入模塊,其中一個注入模塊爲FixBug_AppInstrumentation,該模塊替換了ActivityThread的mInstrumentation對象:
mInstrumentation對象會在應用Application類及Activity類建立時被執行相應的回調,該應用了修改了其中一個回調callApplicationOnCreate,在Application執行了紅包代碼:
其中LuckyMoneyDispatcher爲紅包功能模塊。
函數LuckyMoneyDispatcher.andFixForLuckMoney()實現了方法替換:
使用開源熱修補框架AndFix替換com.tencent.mm.booter.notification.b.a()爲LuckMoneyMethProxy.a(),並將被替換函數保存爲LuckMoneyMethProxy.aOriginal()。
2. 模擬點擊紅包消息
LuckMoneyMethProxy.a()爲替換後的函數,當微信接收到消息時被調用。
函數先判斷消息類型,當肯定是紅包(436207665)後,解析消息,構造Intent併發送。這一步模擬了點擊紅包消息時的彈窗。
3. 模擬拆開紅包
上一步的彈窗是一個Activity,當彈出時(對應Activity的onResume),mInstrumentation將被回調:
onLuckyMoneyResume根據版本號肯定要反射調用的「拆開紅包按鈕」(包括BUTTON_OPEN、OBJECT_OPEN、METHOD_OPEN)
最終由MonitorHandler反射調用拆開紅包函數:
VirtualApp做爲開源的多開應用框架,能夠被任何人使用。它在Android系統和被多開應用間增長了中間層。這帶來了兩方面問題,一方面,VA可掩蓋應用的靜態特徵(包名、證書、資源文件、代碼等),使得單純的靜態檢測方法失效,應用具備了必定免殺的能力。同一個惡意應用能夠有衆多VA母包,且母包不包含惡意特徵,這給檢測引擎識別惡意應用帶來了難度。安全雲經過動態檢測在VA母包運行時動態提取VA應用中的子包,並結合子包的惡意狀況對母包的惡意狀況進行綜合斷定,可有效對惡意應用的VA母包進行標記查殺。
另外一方面,因爲多開應用運行在VA中,VA對被多開應用具備不弱於Root的權限,可方便有效介入應用運行流程。例如:當應用運行時展現廣告,對多開應用進行截屏、模擬點擊。更進一步的,VA可經過Hook修改應用的執行流程,得到應用的隱私數據,包括但不限於密碼、與服務器的數據通訊、照片等。應用應當對運行在VA或其餘多開應用內的帶來的安全風險有所瞭解並加以防範,特別是金融、通信類應用。
安全雲己對相關VA應用進行監測,並及時對新型安全威脅做出響應。