一、 前言
VirtualApp(以下稱VA)是一個App虛擬化引擎(簡稱VA)。VirtualApp創建了一個虛擬空間,你可以在虛擬空間內任意的安裝、啟動和卸載APK,這一切都與外部隔離,如同一個沙盒。運行在VA中的APK無需在Android系統中安裝即可運行,也就是我們熟知的多開應用。
VA免安裝運行APK的特性使得VA內應用與VA相比具有不同的應用特征,這使得VA可用於免殺。此外,VA對被多開應用有較大權限,可能構成安全風險。
本報告首先簡要介紹VA的多開實現原理,之后分析目前在灰色產業的應用,針對在免殺的應用,安全雲對此的應對,並給出色情應用作為例子。另一方面,通過對樣本分析,展示了VA對於安裝在其內應用的高度控制能力,及其帶來的安全風險。最后對本報告進行總結。
二、 VirtualApp原理
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啟動過程可分為以下兩步驟:
步驟一 修改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的應用帶來可能性。
三、 在灰色產業的應用
3.1 免殺
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母包和子包均己被標記為灰色。
3.2 重打包
相較於以往反編譯后插入代碼進行打包編譯的方式,使用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. 上傳己安裝應用列表
3.3 免Root Hook
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應用進行監測,並及時對新型安全威脅作出響應。