關鍵詞:Android木馬、逃逸技術、沙箱逃逸、反追蹤html
傳統逃逸技術涉及網絡攻防和病毒分析兩大領域。網絡攻防領域涉及的逃逸技術主要爲網絡入侵逃逸技術,如IPS[1]入侵逃逸技術和AET[2];病毒分析領域涉及到的逃逸技術主要包括針對靜態分析、動態分析(如動態調試和沙箱養殖)的木馬逃逸技術。java
所謂入侵逃逸技術就是對原有的攻擊載荷進行變換或處理的技術,以便可以逃脫入侵檢測防護系統的檢測,達到入侵後端服務器的目的。現有的入侵逃逸技術主要從網絡層和應用層兩個層次進行研究[3]。node
網絡層逃逸技術主要利用 IP 分組的分片重組機制、TCP 流的組裝機制等實施逃逸,主要包括碎片化、分片重疊、分片覆蓋和分片超時。linux
應用層逃逸技術藉助應用及協議所支持的各類變換能力來達到對畸形特徵的隱藏,主要包括編解碼、載荷變換、應用或協議特性。android
入侵預防系統(Intrusion Prevention System,縮寫爲IPS),又稱爲入侵偵測與預防系統(intrusion detection and prevention systems,縮寫爲IDPS),是計算機網絡安全設施,是對防病毒軟件(Antivirus Softwares)[4]和防火牆的補充[1]。web
入侵行爲的實質就是利用了目標系統設計或編碼中存在的問題而造成的漏洞。攻擊者經過特定的攻擊報文(攻擊報文或在內容結構上、或在出現的時序上、或在流量的大小上進行精心構造),而後經過目標系統的漏洞,使目標系統或應用處於沒法正確處理的狀態,從而達到攻擊目的。基於這種攻擊原理,IPS系統能夠提取出這種利用漏洞的各類攻擊報文在內容結構上、出現時序上等等的特徵,並對網絡數據流進行檢測匹配,從而阻斷攻擊報文[5]。算法
IPS入侵逃逸技術是針對IPS的逃逸技術。數據庫
高級逃逸技術AET( Advanced Evasion Technique),也稱高級隱遁技術、攻擊躲避技術。AET技術的目標是躲避開安全設備的監測,創建一條通往目標系統的「綠色」通道。常見的AET類型包括以下三類[6]:編程
傳統木馬逃逸技術包含靜態(Static)逃逸和動態(Dynamic)逃逸兩個層面。靜態層面的逃逸技術主要針對簽名規則和靜態反編譯工具,常見的逃逸技術包括Polymorphism、Metamorphism和Packing等;動態層面的逃逸技術主要針對沙箱養殖、動態調試和API調用監控,常見的逃逸技術如Red Pills、ScoopyNG、Anti Debugging Traps和Run under conditions等。
圖1.1 木馬逃逸技術[7]
本文介紹的Android木馬逃逸技術與傳統的網絡入侵逃逸技術和木馬逃逸技術略有不一樣,其範圍遠遠超出了上述各類類型的逃逸技術。本文對Android木馬逃逸技術的描述不聽從嚴格的學術定義,旨在研究Android木馬的逃逸週期,彙總週期內各個環節現已出現的各類逃逸技術,以供業內人士和安全廠商參考,助其升級查殺策略。
本文介紹的Android木馬逃逸技術研究了針對用戶感知、殺軟查殺、沙箱動態養殖和人工分析的各類逃逸技術,從利用用戶感官的逃逸到躲避殺軟規則的逃逸,不論技術深淺,一概進行了收錄,由於在Android平臺上,逃逸技術的深淺層度與其逃逸成功與否沒有必然的關係。
在長期反病毒工做中,咱們總結了Android木馬的以下兩個特色:
Android木馬的如上兩個特色無疑是對安全軟件廠商檢出能力的持續性挑戰,更重要的是這種持續性挑戰構成了對Android手機用戶的持續性威脅,若是安全軟件廠商沒法應對這種挑戰,將致使用戶利益嚴重受損。因此,咱們以爲有必要對Android木馬的逃逸技術進行系統深刻的分析,以幫助其餘安全廠商應對這種威脅。
咱們總結了以下圖所示的Android木馬逃逸模型來描述Android木馬逃逸的通常性原理。採用常規手法(即不採用任何逃逸技術)容易被用戶感知或被安全軟件廠商攔截,使其沒法在用戶終端穩定留存;若是使用逃逸技術,則有可能躲避用戶和安全軟件廠商的查殺,以達到長期留存用戶終端的目的。
圖2.1 Android木馬逃逸模型
針對Android木馬的感知元素貫穿了Android木馬的整個生命週期,因此Android木馬生命週期內的每一個環節都催生了相應的逃逸技術,咱們將Android木馬生命週期內的每一個環節串聯起來,造成了Android木馬逃逸鏈,而對應的感知元素串聯起來即Android木馬的(被)感知鏈。
圖2.2 Android木馬逃逸鏈與感知鏈模型
即黑客傳播木馬的過程和手段,常見的手段包括上傳應用市場、經過社交平臺傳播以及ROM預置等。在此過程當中,木馬須要獲取用戶信任並躲避殺毒引擎的掃描。安全意識較高的用戶可能對論壇或應用市場上的應用保持警戒,因此木馬須要經過假裝自身以獲取用戶的信任。部分應用市場經過接入安全廠商的查殺接口進行安檢,查殺接口的實際功能由殺毒引擎提供,因此木馬在投遞環節也須要躲避引擎掃描。若是黑客經過生成的木馬下載連接傳播木馬,當下載連接被用戶點擊時,還會面臨網盾、網絡病毒監控系統對URL進行查殺。
即木馬在用戶終端上着陸的過程,通常而言殺軟會在木馬下載完成時開啓掃描功能,即這個過程當中用戶和殺軟同時接觸到木馬,可是咱們爲了敘述方便將其看做模型中的兩個環節,此外還存在以下先到達用戶的場景:若是是用戶主動下載,木馬先到達用戶,而且在這種狀況下用戶可能忽略殺軟的風險提示;在用戶沒有安裝殺軟的狀況下,木馬先到達用戶,若是用戶感知到木馬的存在,繼而可能會使用殺軟;對於ROM預置類木馬,若是用戶手機沒有預裝安全軟件,木馬先到達用戶。
到達殺軟有兩種場景:安裝掃描與用戶主動掃描。安裝掃描須要獲取Root權限,殺軟在系統安裝APK以前對該APK樣本進行安全性掃描,若是發現危險則會提示用戶;用戶主動掃描是用戶經過殺軟發起的快速或全盤掃描,快速掃描通常掃描已安裝的應用,全盤掃描則包含SD卡存儲的應用安裝包。在此環節中,木馬須要對抗殺毒引擎的靜態規則和雲引擎規則。
殺軟未識別的樣本會被投入到沙箱進行動態養殖,動態養殖的原理是將樣本投入虛擬化運行環境中運行,經過模擬點擊和虛擬廣播事件觸發樣本的行爲,進而經過動態規則匹配樣本行爲進行檢出。木馬在此環節運用沙箱逃逸技術躲避沙箱規則的檢出,通常作法是根據沙箱特有的屬性或文件檢測當前運行環境是否可能爲沙箱環境,若是是則不觸發任何惡意行爲。
當引擎和沙箱均沒法識別木馬時,該木馬就會進入分析師的視野,分析師使用靜態反編譯工具和動態調試工具對木馬進行分析。爲對抗分析師的分析,木馬大量使用對抗反編譯工具和調試工具的技術,這些技術大多創建在深刻研究反編譯工具和調試工具工做原理的基礎之上,經過工具的缺陷或漏洞構造特殊的APK樣本,使靜態工具解析失敗或中斷動態調試器的調試鏈接。另外,對代碼的混淆和加密也能夠在必定層度上增長分析師的逆向難度以及提取引擎規則的難度,並間接影響引擎規則的質量。
當木馬成功地躲過了前五個環節以後,其將開始在用戶手機上長期留存並做惡。在長期留存的過程當中,木馬依然面臨着病毒庫升級、主動防護和用戶感知帶來的壓力,因此在躲過了前面全部環節以後,其依然須要經過對逃逸技術的持續改進和自我更新來確保其能應對查殺,這一過程同時促進了逃逸和查殺技術的進一步發展。
Android木馬的逃逸技術具備明顯的針對性,按照其針對的目標能夠分爲殺軟逃逸技術、沙箱逃逸技術、對抗分析工具的逃逸技術、針對用戶感官的逃逸技術和反追蹤逃逸技術五個大類,五類逃逸技術涵蓋了Android木馬逃逸鏈上的各個環節,也構成了Android逃逸技術的整個技術體系。
圖2.3 Android木馬逃逸技術
本章介紹的殺軟逃逸技術,主要涵蓋了針對殺毒引擎規則和安全軟件(殺軟手機客戶端)的一系列逃逸技術。從長期的分析工做中,咱們發現木馬更加偏向使用多種逃逸技術組合,以加強其自身的逃逸能力。
字符串加密技術是一種成本較低的逃逸技術,其主要目的是對抗傳統靜態引擎的檢測,也可以在必定程層度上對抗分析師的靜態分析。字符串規則是傳統靜態引擎使用的一種有效檢出規則,所以針對該規則的逃逸技術在Android木馬中至關常見。
圖3.1 Obad字符串加密
Java反射機制爲Java應用程序提供檢查或修改運行時行爲的方法,Java反射在使用上有以下特色:將類名標識符和方法名標識符轉換成字符串變量的形式,因爲字符串變量能夠進行加解密變換,因此可使用加密字符串的形式替換本來的類名標識符或方法標識符;將調用序列碎片化,打亂了原始的調用序列。正由於Java反射機制的如上特色,使其可以有效地躲避傳統靜態引擎的字符串規則以及基於方法調用序列的規則。
圖3.2 Obad反射
Android應用程序包(APK)格式爲標準的ZIP壓縮文件格式。木馬利用安全軟件解析APK過程當中的缺陷構造特殊格式的ZIP文件,從而躲避安全軟件的掃描。
一種典型的技術爲構造多級空目。安全軟件出於優化用戶體驗的目的,可能會設置掃描目錄上限,即不對ZIP包中深層次目錄進行掃描。Android木馬利用安全軟件這種設計上的缺陷,構造多級目錄,而後將核心代碼置於該多級目錄的最深一層目錄下,以躲避安全軟件的掃描。
圖3.3 多級目錄畸形包
DexClassLoader[9]爲開發者提供了動態加載類的接口,開發者能夠經過動態加載子包的方式加載部分受保護的核心代碼。利用動態加載機制,木馬既能夠聯網下載攻擊載荷(通常爲加密的Jar包),也能夠經過各類形式本地釋放載荷。動態加載機制爲木馬隱藏載荷創造了條件,最常出現的一種情形是,木馬將核心Jar包加密保存到assets目錄下,運行時解密釋放原始Jar包,並使用動態加載機制加載載荷中的類以實施攻擊。
圖3.4 「長老木馬」三代載荷釋放過程
圖3.5 「長老木馬」三代載荷文件
包名佔坑逃逸的一種原理是利用了Android系統的特性,即Android系統根據包名惟一區分已安裝應用,不能夠重複安裝同包名的應用。木馬利用系統這一特性,將自身包名命名爲與目標殺軟同包名,感染用戶手機以後使得用戶沒法正常安裝目標殺軟。
包名佔坑逃逸的另外一種原理是利用殺軟的漏洞,一種可能的狀況是殺軟掃描應用的過程當中若是發現某些特定的白包名(好比同屬該安全軟件廠商的軟件包名)便跳過對該應用的掃描,而不驗證其證書。木馬只需假裝成特定的白包名便可躲過掃描。
圖3.6 包名佔坑原理
另外一種可能的狀況是,安全軟件啓用指定包名的專殺工具時並未校驗專殺工具合法性,這一漏洞被木馬利用以躲避專殺工具的查殺。頑固木馬將自身包名命名爲與專殺工具包名徹底相同的名稱,當殺軟試圖啓用專殺工具時,該木馬被啓動,而非專殺工具,因此該木馬可以成功躲避專殺工具的查殺。
圖3.7 包名佔坑流程圖
傳統殺毒引擎的部分規則基於樣本中的標識符名稱進行檢出,混淆標識符名稱便可以輕鬆地躲避檢測。
圖3.8 FakeTaobao代碼混淆
簽名能夠標識樣本的來源。可信來源簽名下的樣本默認被視爲正規軟件,除非發現有惡意軟件;不可信來源簽名下如存在大量惡意軟件,則被視爲惡意簽名。所以,殺軟可直接根據簽名制定黑規則。惡意軟件經過將簽名隨機化(即簽名混淆)來躲避黑簽名規則。
表3.1 簽名混淆
軟件名稱是色情視頻類惡意軟件早期最鮮明的特色之一,殺毒引擎在必要時(如色情視頻類惡意軟件大規模爆發時)會根據軟件名稱進行檢出,惡意軟件經過混淆軟件名稱來躲避這種檢出規則。
表3.2 軟件名稱混淆
Android支持使用原生語言C或C++直接開發應用的部分功能。從開發的角度來看,使用Java語言開發比使用原生語言開發要簡單高效,所以絕大多數應用的大部分模塊都採用Java語言進行開發,殺毒引擎的查殺規則也大多基於Java語言(即針對DEX文件進行查殺);從逆向分析的角度來看,逆向原生語言實現的模塊(ELF格式文件)要比逆向Java實現的模塊(DEX格式文件)更加困難。基於以上兩點緣由,木馬做者經過使用原生語言實現核心惡意模塊能夠很好地躲避查殺和分析。
圖3.9 「長老木馬」三代釋放惡意APK文件
傳統殺毒引擎的掃描通常針對完整的DEX文件進行,經過將DEX文件變換成字節數組或分割爲獨立的字符串,破壞靜態DEX文件的完整性,運行時動態拼接爲DEX文件,能夠達到躲避檢測的目的。
圖3.10 DEX文件字符串化
圖3.11 DEX文件字節數組化
木馬啓動時檢測安全軟件是否存在,若是殺軟存在則不運行其惡意行爲,如此能夠規避殺軟的查殺。
圖3.12 規避殺軟
部分殺軟實現其掃描流程時,考慮到性能和用戶體驗(由於普通權限的殺軟只能掃描但沒法卸載系統目錄下的應用,可能會給用戶帶來困擾)等因素,不會對系統目錄進行深度掃描。木馬經過利用漏洞獲取Root權限,並將核心惡意模塊釋放到系統目錄之中,即可以躲避此類殺軟的查殺。即使殺軟具有深度掃描和查殺的能力,木馬獲取Root權限以後能夠經過部署保護模塊或其餘方法(好比後文提到的篡改網絡配置)來對抗殺軟的查殺。
表3.3 「舞毒蛾」使用的提權漏洞
木馬在啓動時判斷殺軟是否存在,若是存在則直接結束殺軟,能夠避免在其自身生命週期內被殺軟查殺。
圖3.13 FakeTaobao結束殺軟
具有Root權限的木馬能夠經過直接卸載安全軟件來躲避查殺。
圖3.14 「百腦蟲」殺軟包名列表
圖3.15 「百腦蟲」卸載指定殺軟
安全軟件經過配置雲查過濾規則來提升雲查效率,即已知爲白應用的樣本直接跳過雲查,並將這些規則寫入本地數據庫。然而,部分使用這種規則的殺軟將規則信息明文寫入數據庫之中,使得具有Root權限的安全軟件能夠直接修改該配置規則,以繞過雲查。
圖3.16 篡改殺軟數據庫
Android系統繼承了不少Linux特性,其中包括管理網絡和數據包流動與傳送的Linux內核模塊netfilter,以及netfilter的控制應用軟件iptables[14]。木馬經過執行iptables命令配置網絡規則,禁止安全軟件聯網雲查,從而躲避查殺。
圖3.17 DwallAv配置網絡規則
Android提供使用JavaScript語言訪問Java方法的接口。開發者使用addJavascriptInterface[16]方法便可將指定的Java對象注入到WebView中,經過引用Java對象的名稱便可實現對該對象的訪問。與直接使用Java實現程序功能相比,使用JavaScript語言訪問Java對象包含以下特徵:程序的執行環境由Dalvik虛擬機轉移到WebKit;相關核心代碼由DEX文件轉移到HTML文件(或其餘可執行網頁文件)。若是木馬使用JavaScript接口調用替代使用Java實現的功能,即可以躲避本來針對DEX文件的殺毒引擎規則。
圖3.18 JavaScript接口調用
易安卓[18],如下簡稱E4A,是一個基於谷歌Simple語言的編程工具,實現經過相似易語言的Basic語法輕鬆編寫Android應用程序。因爲E4A使用中文替代了Java語言,使其能夠躲避現存的傳統殺毒引擎規則。
圖3.19 E4A中文編程
Mono是一個由Xamarin公司(先前是Novell,最先爲Ximian)所主持的自由開放源代碼項目。該項目的目標是建立一系列匹配ECMA標準(Ecma-334和Ecma-335)的.NET工具,包括C#編譯器和通用語言架構。[19]Mono for Android[20]容許開發者在Android應用程序中使用Mono框架。使用Mono框架的Android應用程序具有以下特色:程序運行環境由Dalvik轉移到Mono for Android運行時,在運行過程當中經過Mono for Android運行時與Dalvik運行時的通訊實現對Android API的調用。使用Mono框架實現的Android應用程序不一樣於直接使用Java的實現,於是能夠躲避現存的傳統殺毒引擎規則。
圖3.20 使用Mono運行時
「簽名混淆」一節曾提到過,對於可信來源簽名(白簽名)的樣本,安全軟件廠商通常默認其爲安全軟件。所以,木馬可使用特殊手段(好比感染開發者機器)使自身具有白簽名屬性,從而躲避殺軟的查殺。
圖3.21 被利用的某廠商簽名
圖3.22 被感染的網頁文件
圖3.23 網頁文件中攜帶的惡意代碼
Android應用程序包格式爲標準的ZIP文件格式。ZIP文件格式容許存在兩個或以上徹底相同的路徑,然而安卓系統沒有考慮此類狀況。在這種狀況下,Android包管理器校驗簽名取的是最後一個文件的Hash,而運行APK加載的DEX文件倒是ZIP文件的第一個dex文件(或者AndroidManifest.xml文件)。該漏洞被稱爲Masterkey[22]漏洞,木馬利用該漏洞能夠將惡意的DEX文件打包進正常文件,以躲避查殺。
圖3.24 雙DEX文件形式
圖3.25 雙AM文件形式
隱寫術是一門關於信息隱藏的技巧與科學,所謂信息隱藏指的是不讓除預期的接收者以外的任何人知曉信息的傳遞事件或者信息的內容。隱寫術的英文叫作Steganography,來源於特里特米烏斯的一本講述密碼學與隱寫術的著做Steganographia,該書書名源於希臘語,意爲「隱祕書寫」[23]。
隱寫術也是Android木馬進行逃逸的手段之一。木馬經過特殊的算法將載荷文件隱寫到圖片文件之中,運行時經過還原算法將載荷從圖片文件中分離,而後動態加載載荷至運行環境中實施攻擊。
圖3.26 Android.Xiny.19.origin載體圖片
沙箱逃逸技術涵蓋了針對沙箱環境和沙箱規則的逃逸技術。針對沙箱環境的檢測包括系統屬性、硬件屬性和網絡環境等方面,針對沙箱規則的逃逸涉及網絡請求、觸發條件、詞法分析等方面。
Android沙箱通常經過虛擬化技術實現,其包含不少與真實Android機器不同的屬性和文件。木馬經過檢測沙箱的特有屬性和文件能夠粗略斷定當前運行環境是否爲沙箱環境,若是爲沙箱則中止觸發惡意行爲。
圖4.1 模擬器屬性檢測
圖4.2 模擬器文件檢測
Android隱私竊取類木馬可能盜取用戶聯繫人、短信等信息,並經過短信、郵箱或網絡請求的方式回傳。沙箱針對這類行爲制定基於詞法分析的檢測規則,而木馬則經過字符串操做(加密、分割、替換等)來對抗此類檢測規則。
圖4.3 對抗詞法分析
Android木馬的大部分攻擊載荷都會以衍生物的形式釋放到本地文件系統。沙箱基於木馬的如上行爲特色制定根據載荷名稱進行檢測的規則,而木馬則經過混淆載荷名稱來對抗此類檢測規則。
表4.1 載荷名稱混淆
Android木馬的聯網動做主要反映在URL上,所以沙箱通常包含對木馬URL的監控,將惡意下載或惡意廣告相關的URL加入到黑名單。木馬經過混淆URL(包含頻繁變動域名或混淆服務器路徑)來躲避沙箱的這種監控。
表4.2 「道有道」URL混
條件觸發通常針對沙箱的動態行爲檢測,最多見的條件觸發爲木馬設定其惡意行爲觸發日期爲某個日期以後,因爲這個日期在木馬投入沙箱養殖(沙箱養殖時間通常較短)的時間以後,因此木馬不會在養殖期間表現其惡意行爲。
圖4.4 定時觸發
Android木馬的絕大多數行爲都是基於網絡的,幾乎每個Android木馬都會申請聯網權限。沙箱爲了更全面地觸發木馬的惡意行爲,必需接入網絡。黑客經過編寫探測程序能夠獲取Google Bouncer[26]或安全廠商沙箱的IP段,而後在惡意程序中植入判斷邏輯,若是IP屬於安全廠商或Google Bouncer,便不觸發任何惡意行爲,以此躲避沙箱的檢測。
研究人員在2015年9月發現了一款名爲「BrainTest」的Android木馬。該木馬經過檢測運行環境的IP來判斷其是否在Google Bouncer中運行,從而達到躲避Bouncer檢測的目的。
圖4.5 經過IP檢測GoogleBouncer
樣本啓動時,經過IP信息檢測其是否在Google的服務器上運行,若是檢測到運行環境的IP符合以下條件之一,則不會運行惡意代碼:
IP在209.85.128.0-209.85.255.255, 216.58.192.0-216.58.223.255,173.194.0.0-173.194.255.255,74.125.0.0-74.125.255.255範圍內;
IP掛載的域名包含「google」、「android」或「1e100」。
針對分析工具的逃逸技術主要包括針對靜態分析工具、動態分析工具和抓包工具的逃逸技術,以及高級對抗方式——加固。
Android系統解析APK文件的流程,與解壓縮軟件及反編譯工具解析ZIP文件的流程存在差別。Android系統解析APK文件時不考慮ZIP文件的加密問題,而解壓縮軟件和反編譯工具須要首先檢查ZIP包的加密標誌位,檢驗其是否加密。木馬經過僅改變加密標誌位,便可騙過解壓縮軟件和反編譯工具,如此便可躲過靜態分析工具。
圖5.1 僞加密前
圖5.2 僞加密後
2015年8月,研究人員發現一種經過構造特殊格式的資源文件對抗反編譯工具Apktool的技術,該技術原理以下圖所示。
圖5.3 資源文件對抗反編譯原理
Apktool解析APK包中的資源文件時,會驗證同類型資源裏是否包含重名資源,若是包含重名資源則會拋出異常,中斷反編譯過程。黑客經過在木馬中插入重名資源,而且保證在程序運行過程當中始終不會調用該資源,則便可保證程序的正常安裝與運行,又可對抗Apktool的反編譯。
AndroidManifest.xml文件爲axml文件格式[29]。黑客經過在AndroidManifest.xml文件中插入偏移異常(超出文件大小的偏移)的資源以對抗反編譯工具的解析,而該資源不會被程序使用,從而也能保證程序的正常安裝與運行。
圖5.4 axml文件對抗反編譯原理
因爲Baksmali不支持解析DEX文件的link section,因此黑客經過在DEX文件中構建link section便可使Baksmali工具奔潰。
DEX文件的類定義結構中包含一個source_file_idx項,表示源代碼文件的信息。黑客首先向DEX文件中添加一個程序運行時不會使用的類,而後修改對應的source_file_idx,由於程序未使用該類,因此能夠成功安裝和運行,但反編譯工具靜態解析DEX文件時,因爲找不到source_file_idx對應的值,便會拋出異常,中斷反編譯過程。
剝離二進制文件,就是將二進制文件的符號表刪除,增長病毒分析師調試樣本的難度。開發者能夠經過添加以下gcc編譯選項[33]隱藏符號表。
Gcc編譯選項:LOCAL_CFLAGS := -fvisibility=hidden
圖5.5 二進制剝離先後對比
2015年9月,研究人員發現了一種經過在DEX文件中插入無效指令對抗反編譯工具Dex2jar的技術,該技術原理以下圖所示。
圖5.6 構造無效指令對抗Dex2jar
Dex2jar解析DEX文件的過程當中會校驗每一個方法的形參和實參類型,若是形參類型和實參類型不一致則會拋出異常,中斷反編譯過程。經過插入形參與實參不一致的無效指令便可觸發該異常,致使解析失敗。
Android使用android:debuggable[36]標籤標識應用程序是否可調試,經過將android:debuggable設置爲false即可限制調試器鏈接。
按照前一小節中的方法限制調試鏈接以後,分析人員便沒法直接對木馬進行調試。只有修改調試標籤,通過回編譯並從新簽名纔可使木馬可調試。木馬則經過對簽名文件的自校驗來防止其被重打包,以此間接對抗調試分析。
圖5.7 FakeTaobao自校驗
搶佔ptrace的概念繼承至Linux系統的ptrace系統調用。ptrace系統調用爲開發者提供一種使用一個進程監視、控制另外一個進程的執行或檢查、改變另外一個進程內存和寄存器的方法[38]。ptrace常常被用來實現反調試功能,由於一個進程只能被ptrace一次,若是木馬使用ptrace進行自我監控和跟蹤,就能夠阻止分析人員的調試。
圖5.8 搶佔ptrace
Linux進程狀態文件利用TracerPid[40]記錄調試(跟蹤)進程的進程號,若是進程未被調試(跟蹤)則該值爲0。Android繼承了Linux系統的這種特性,因此經過讀取進程的/proc/self/status文件,檢測TracerPid的值便可判斷是否存在調試進程。
圖5.9 檢測TracerPid值
Linux使用/pro/pid/wchan[42]文件保存進程正在等待的事件或睡眠狀態,若是進程正在運行則該文件爲空。根據wchan文件中的關鍵字(如ptrace_stop、ep_poll等)便可判斷進程是否處在被調試狀態。
圖5.10 檢測wchan文件內容
Linux的進程/proc/self/fd[43]目錄包含全部打開文件的fd,當程序被調試器打開時,其對應的進程實際上繼承至該調試器進程,即調試器進程是當前運行進程的父進程,而且父進程打開文件的fd也會顯示在當前進程(被調試進程)的fd目錄下。調試器運行時通常會打開多個進程,因此程序能夠經過檢測fd目錄下文件的個數是否多於正常水平來判斷進程是否正被調試。
圖5.11 檢測fd目錄文件個數
如前一小節所述,調試器進程是被調試進程的父進程,因此程序經過檢測父進程的名稱是否包含調試器標識(如gdb)便可簡單判斷當前進程是否正被某種調試器調試。
圖5.12 檢測父進程
同檢測父進程原理類似,調試過程必須藉助一些輔助進程,如android_server[44],因此程序也能夠經過判斷調試輔助進程是否存在來簡單判斷其是否處在被調試狀態。
圖5.13 檢測調試輔助進程
因爲程序在調試時的斷點、檢查修改內存等操做,運行時間每每要遠大於正常運行時間。因此,一旦程序運行時間過長,即可能是因爲正在被調試。
單步調試陷阱是指經過人爲設置斷點指令並註冊信號處理函數,迷惑調試器和分析人員,對抗動態調試。
ARM架構下的調試器對程序設置斷點時,會首先保存下斷點處的原始指令,並將斷點處指令替換爲breakpoint機器碼。
圖5.14 下斷點
程序運行至斷點處會命中斷點,此時程序向系統發送SIGTRAP信號,調試器接收到SIGTRAP信號以後,先將斷點處指令替換爲原始指令,而後將PC指針退回至斷點處。
圖5.15 命中斷點時的指令執行
如上過程即通常的調試器斷點運行原理,須要注意的是,經過Linux信號處理函數signal[45]能夠註冊單步調試信號——SIGTRAP的回調處理函數,咱們能夠認爲在程序中插入breakpoint機器碼,而後經過註冊SIGTRAP回調處理函數,在調試器命中breakpoint時將breakpoint機器碼替換爲nop,這就是單步調試陷阱的運行原理。
圖5.16 設置單步調試陷阱
圖5.17 單步調試陷阱處的指令執行
軟件斷點經過改寫斷點地址處原始指令的頭幾字節爲breakpoint機器碼實現,因此經過遍歷ELF文件中可執行段,查找是否存在breakpoint機器碼,便可判斷軟件斷點是否存在。
Dalvik虛擬機自帶檢測調試鏈接的方法——dvmDbgIsDebuggerConnected,dvmDbgIsDebuggerConnected經過判斷DvmGlobals結構體中debuggerActive字段的值來檢測調試鏈接。程序也能夠直接獲取DvmGlobals結構體中debuggerActive字段的值,以檢測調試鏈接。
IDA採用遞歸降低算法來反彙編指令,該算法最大的缺點在於它沒法處理間接代碼路徑,如利用指針表來查找目標地址的跳轉或調用。ARM架構下存在ARM和THUMB兩種指令集,兩種指令集模式的切換經過帶連接的跳轉指令完成,IDA在某些狀況下沒法正確地識別ARM和THUMB指令。若是在指令識別錯誤的地點寫入斷點,則有可能使調試器崩潰。
Inotify函數繼承至Linux操做系統。Inotify函數可以監控文件系統事件(打開、讀寫、刪除等),程序能夠經過監控/proc/pid/maps、/proc/pid/mem等文件的讀寫事件,防止分析師動態調試程序時使用內存dump技術dump內存(內存dump是調試分析中經常使用的脫殼技術)。
超文本傳輸安全協議(英語:Hypertext Transfer Protocol Secure,縮寫:HTTPS,也被稱爲HTTP over TLS,HTTP over SSL或HTTP Secure)是一種網絡安全傳輸協議。在計算機網絡上,HTTPS經由超文本傳輸協議進行通訊,但利用SSL/TLS來對數據包進行加密。HTTPS開發的主要目的,是提供對網絡服務器的身份認證,保護交換數據的隱私與完整性。這個協議由網景公司(Netscape)在1994年首次提出,隨後擴展到互聯網上[47]。Android木馬利用HTTPS進行加密網絡通訊,對抗分析人員使用抓包工具對其進行分析。
APK加固是一種對APK文件的數據進行壓縮和加密保護,將APK文件壓縮成自我解壓檔案,並能隱藏解壓進程。主流的APK加固廠商提供多方面的加固服務,其意圖在於保護開發者的軟件不被破解,可是因爲審覈不嚴或加固廠商安檢能力不強等緣由,大量惡意軟件經過合法的加固渠道進行加固以躲避查殺。
針對用戶感官的逃逸技術主要針對用戶視覺和聽覺進行假裝和欺騙,或騙取用戶點擊運行木馬,或掩蓋木馬運行後的痕跡。
Android提供禁用應用組件的接口,經過調用setComponentEnabledSetting方法,並將第二個參數設置爲COMPONENT_ENABLED_STATE_DISABLED便可禁用指定的組件。若是指定的組件爲應用的啓動界面則可隱藏應用圖標,使其消失在用戶的視野內。
圖6.1 Dendoroid隱藏圖標
木馬使用透明圖片做爲其應用圖標,安裝以後給用戶形成「該桌面區域內不存在應用」的假象。
圖6.2 僞「京東客戶端」透明圖標
木馬經過將應用名稱設置爲特殊提示語句(如「爲正常系統軟件,請點擊取消,刪除了會形成手機崩潰,請不要刪除」),當殺軟彈出報毒提示時,使用該語句混淆報毒提示,以欺騙用戶。
圖6.3 僞造殺軟提示
假裝正常應用的主要方式是將其自身圖標設置成正常應用的圖標,以此欺騙用戶下載、安裝和運行。
圖6.4 FakeTaobao假裝正常應用
木馬經過監控卸載動做,檢測到其正被用戶卸載時,彈出假裝的卸載程序供用戶選擇。一旦用戶選擇了該卸載程序,則會誤覺得木馬已卸載成功,而實際上該卸載程序並未真正執行卸載。
圖6.5 FakeTaobao監控程序卸載
圖6.6 FakeTaobao彈出僞造的卸載程序
Android提供設置下載管理器執行下載任務時是否彈出系統通知的接口,使用setNotificationVisibility[52]方法並將其參數設置爲VISIBILITY_HIDDEN便可實現後臺下載,讓用戶感知不到下載事件。
向被控手機撥打電話和發送短信指令是Android木馬較爲經常使用的手段,爲了避免讓用戶感知到這些惡意行爲,木馬將用戶手機的響鈴模式設置爲靜音。
圖6.7 Cokri設置響鈴爲靜音模式
短信是木馬執行隱私竊取和遠程控制時的一種經常使用手段,木馬經過向用戶手機發送短信指令控制用戶手機。木馬收發短信以後刪除相關內容,以免用戶經過短信應用感知到這種私自收發短信的行爲。
圖6.8 FakeTaobao刪除短信
在無線行業中,預裝每每指,將產品裝在未銷售的手機終端ROM中[54]。將木馬植入ROM,能夠繞過安裝環節,即用戶對木馬的安裝過程徹底無感知。
反追蹤技術針對分析師或網絡執法人員的分析追蹤。木馬投放者經過隱蔽的傳播手法投放木馬,試圖隱藏木馬的來源。
樣本下載源是分析人員和網絡執法人員追蹤木馬來源和木馬做者的途徑之一,爲躲避分析人員和執法人員的追蹤,木馬做者匿名註冊第三方社交帳號或應用市場,藉助第三方社交平臺或者應用市場生成下載連接,而後進行傳播。
圖7.1 Android勒索軟件藉助第三方平臺生成下載連接
域名隱私保護服務是一種域名增值服務,即經過必定的技術手段適當保護用戶的註冊聯繫人、管理聯繫人、技術聯繫人、繳費聯繫人信息(使用戶提交的有關注冊信息不在域名whois數據庫中公開顯示)。 經過此項服務,能夠保護您的我的隱私不被公開,減小垃圾郵件和針對我的信息的竊取等[56]。木馬做者註冊域名時若是使用了域名隱私保護服務,亦可對抗分析人員和網絡執法人員的追蹤。
圖7.2 惡意廣告URL使用域名隱私保護
實名制是一種近年來開始興起的制度,即在辦理和進行某項業務時須要提供有效的能證實我的身份的證件或資料,最初是由於網癮低齡化而開始試水,而現在隨着網絡化的不斷髮展,各類各樣虛擬身份的交易日益重要而已經成爲一項趨勢,其很大程度上帶來了安全保障,但另外一方面其對我的隱私可能的侵犯也須要人們去探索研究[57]。
非實名註冊即繞過實名制註冊,從黑市購買僞造的身份信息,進而註冊網絡虛擬身份、電話號碼、銀行卡等。非實名註冊在網絡電信詐騙中應用較爲普遍,詐騙者經過黑市購買身份證或銀行卡,從而進行轉帳或洗錢。
熟人關係傳播利用了Android手機用戶對於通信錄聯繫人的信任,使用這種傳播方式能夠從傳播的環節躲避追蹤。蝗蟲手機木馬是Android平臺上第一個成功利用熟人關係傳播的案例,該木馬遍歷用戶通信錄,並給通信錄聯繫人發送包含木馬下載連接的短信。
圖7.3 蝗蟲手機木馬經過通信錄聯繫人傳播
僞基站利用移動信令監測系統監測移動通信過程當中的各類信令過程,得到手機用戶當前的位置信息。僞基站啓動後就會干擾和屏蔽必定範圍內的運營商信號,以後則會搜索出附近的手機號,並將短信發送到這些號碼上。屏蔽運營商的信號能夠持續10秒到20秒,短信推送完成後,對方手機才能從新搜索到信號。大部分手機不能自動恢復信號,須要重啓。僞基站能把發送號碼顯示爲任意號碼,甚至是郵箱號和特服號碼。載有僞基站的車行駛速度不高於60千米/小時,能夠向周邊用戶羣發短信,所以,僞基站具備必定的流動性[60]。
Android木馬投放者經過僞基站向用戶發送帶有木馬下載連接的短信。因爲僞基站的流動性,基本上不可能經過用戶接收到的短信反向追蹤其來源。
虛擬運營商(Virtual Network Operator,VNO)是指沒有本身的通信基礎設施,藉助傳統的電信供應商來實現通信服務的運營商[62]。
因爲分析師沒法經過虛擬運營商號碼追蹤木馬來源,木馬投放者經過虛擬運營商服務向受害者發送帶木馬下載連接的短信便可躲避分析師的追蹤。
洋蔥網絡是一種在計算機網絡上進行匿名通訊的技術。通訊數據先進行多層加密而後在由若干個被稱爲洋蔥路由器組成的通訊線路上被傳送。每一個洋蔥路由器去掉一個加密層,以此獲得下一條路由信息,而後將數據繼續發往下一個洋蔥路由器,不斷重複,直到數據到達目的地。這就防止了那些知道數據發送端以及接收端的中間人竊得數據內容[64]。
2014年5月,研究人員發現了第一個以Android爲目標的Tor木馬[65]。該木馬經過修改Tor客戶端Orbot實現,並利用 Tor網絡的.onion代理服務器隱藏指令控制服務器的位置。木馬接收來自匿名服務器的指令並執行一系列任務,包括攔截短信,回傳手機型號、系統版本、國家、應用安裝列表和IMEI等信息,可用於遠程執行代碼。
圖7.4 Torec家族包含洋蔥網絡的包結構
動態域名能夠將任意變換的IP地址綁定給一個固定的二級域名。無論這個線路的IP地址怎樣變化,因特網用戶仍是可使用這個固定的域名,來訪問或登陸用這個動態域名創建的服務器。[66]。分析人員和網絡執法人員主要根據IP地址對木馬服務器進行定位,若是木馬使用動態域名的方式,即意味着木馬服務器的IP地址時刻在改變,由此增長了追蹤的難度。
圖7.5 潛魔間諜程序使用動態IP
圖7.6 潛魔間諜程序使用的動態IP提供商
「跳板」網絡的利用主要出如今隱私竊取木馬中,木馬做者利用第三方網絡平臺的信譽度以及這種特殊形式的隱蔽性來躲避分析人員和網絡執法人員的追蹤。木馬將用戶隱私信息上傳至第三方網絡平臺,好比以日記或日誌的形式上傳至XX日記、XX空間等,是黑客經常使用的「跳板」網絡形式。
圖7.7 FakeTaobao使用吾志做爲跳板網絡
咱們經過這篇報告總結了安卓平臺目前出現的主流逃逸技術,其中涵蓋了超過六十種逃逸技術的原理和參考案例。在蒐集案例的過程當中,因爲精力、時間以及關注範圍等緣由,可能遺漏了部分特殊的逃逸技術,但願你們發現後可以及時反饋給咱們。因爲各類逃逸技術在技術上的深淺層度不一樣,報告中對某些逃逸技術的原理描述可能比較簡單,若是你們對報告中的任何細節有疑問均可以聯繫咱們。
現今,Android木馬技術更新換代愈來愈頻繁,逃逸技術和攻擊技術天天都在升級,Android安全形式極爲嚴峻。嚴峻的安全形式對安全軟件廠商的安全技術提出了更高的要求。咱們但願這篇報告可以給安全友商們帶來一些啓發,以幫助他們加強引擎方法和檢出能力。咱們相信安全技術共享是安全技術進步強有力的推進力,咱們經過報告的形式共享安全技術以指望可以推進國內移動安全技術的進步,咱們也但願各友商都可以參與到安全技術共享的活動中來,聯手將Android生態環境治理的更好。
咱們但願這篇報告也可以給移動安全從業者帶來一些啓發。目前網絡上缺乏關於Android木馬逃逸技術的系統性介紹文章,甚至找不到關於Android逃逸技術的相關定義,這無疑爲相關安全從業人員瞭解Android逃逸技術設置了一道無形的屏障。本報告系統性地描述了Android木馬逃逸技術,並給出了超過六十種逃逸技術原理和案例,能夠幫助他們更加系統、全面地認識和研究Android木馬逃逸技術,以這篇報告做爲移動安全從業者的參考手冊。
最後,感謝全部國內外發現並及時公佈Android木馬逃逸技術的廠商或安全研究人員,但願經過你們的共同努力營造良好的安全技術研究氛圍。
[1]. 「入侵防護系統」維基百科定義:
https://zh.wikipedia.org/wiki/入侵預防系統
[2]. 《advanced evasion technique (AET)》:
http://searchsecurity.techtarget.com/definition/advanced-evasion-technique-AET
[3]. 王磊, 雙鍇.入侵逃逸技術綜述. 北京:北京郵電大學,2012
[4]. 「安全軟件」維基百科定義:
https://zh.wikipedia.org/wiki/安全軟件
[5]. 《IPS入侵逃逸技術分析與防護》-楊永清
[6]. 《高級逃避技術(AET)是實現APT的重要手段之一》:
http://www.cngate.com.cn/index.php?m=content&c=index&a=show&catid=77&id=202
[7]. 《Malware Evasion Chart》:
http://marcoramilli.blogspot.com/2013/07/malware-evasion-chart.html
[8]. 《The most sophisticated Android Trojan》:
https://securelist.com/blog/research/35929/the-most-sophisticated-android-trojan/
[9]. DexClassLoader開發者文檔:
https://developer.android.com/reference/dalvik/system/DexClassLoader.html?hl=zh-cn
[10]. 《「長老木馬」三代揪出背後「大毒梟」》:
「長老木馬」三代揪出背後「大毒梟」
[11]. 《FakeTaobao家族變種演變》:
FakeTaobao家族變種演變
[12]. 《「舞毒蛾」木馬演變報告》:
「舞毒蛾」木馬演變報告
[13]. 《「百腦蟲」手機病毒分析報告》:
「百腦蟲」手機病毒分析報告
[14]. 「Iptables」維基百科解釋:
https://zh.wikipedia.org/wiki/Iptables
[15]. 《DwallAv木馬分析報告》:
DwallAv木馬分析報告
[16]. WebView 開發者文檔:
https://developer.android.com/reference/android/webkit/WebView.html
[17]. 《國內首個利用JavaScript腳本遠控木馬的技術分析報告》:
國內首個利用JavaScript腳本遠控木馬的技術分析報告
[18]. E4A官方站點:
http://www.e4asoft.com
[19]. 「Mono」維基百科介紹:
https://zh.wikipedia.org/wiki/Mono
[20]. Mono for Android開發者網站:
http://www.monodevelop.com/archived/download/mono-for-android/
[21]. 《疑百度編譯機或員工中毒致使百度彩票APP感染病毒代碼(發佈流程管理不當)》:
http://bobao.360.cn/snapshot/index?id=83648
[22].《Android uncovers master-key 漏洞分析》:
http://php.ph/wydrops/drops/Android%20uncovers%20master-key%20%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.pdf
[23]. 「隱寫術」維基百科定義:
https://zh.wikipedia.org/wiki/隱寫術
[24]. 《Trojan targeted dozens of games on Google Play》:
http://news.drweb.com/show/?i=9803&c=9&lng=en&p=0
[25]. 《「道有道」的對抗之路》:
「道有道」的對抗之路
[26]. 「Google Bouncer」 維基百科介紹:
https://en.wikipedia.org/wiki/Google_Play#Application_security
[27]. 《BrainTest – A New Level of Sophistication in Mobile Malware》:
[28]. 《Android應用資源文件格式解析與保護對抗研究》:
http://www.freebuf.com/articles/terminal/75944.html
[29]. 《AndroidManifest Ambiguity方案原理及代碼》:
http://www.cnblogs.com/wanyuanchun/p/4084292.html
[30]. 《淺談xaingce apk樣本分析》:
[31]. 《Android DEX安全攻防戰》:
http://bbs.pediy.com/showthread.php?t=177114
[32]. 《Android-對抗反編譯工具的一種方式》:
http://www.android100.org/html/201502/16/119734.html
[33]. Gcc wiki:
https://gcc.gnu.org/wiki/Visibility
[34]. 《Android應用安全開發之源碼安全》:
[35]. 《Android程序的反編譯對抗研究》:
http://www.freebuf.com/sectool/76884.html
[36]. App Manifest 開發者文檔:
https://developer.android.com/guide/topics/manifest/application-element.html
[37]. 《Smalidea無源碼調試android應用》:
[38]. ptrace介紹:
http://linux.die.net/man/2/ptrace
[39]. 《反調試方法二 – 搶佔ptrace》:
http://kiya.space/2015/12/18/ptrace-basis/
[40]. Linux Programmer’s Manual :
http://man7.org/linux/man-pages/man5/proc.5.html
[41]. 《android-native反調試》:
http://www.zhaoxiaodan.com/java/android/android-native反調試.html
[42]. POSIX Programmer’s Manual :
http://man7.org/linux/man-pages/man1/ps.1p.html
[43]. 「文件描述符」維基百科定義:
https://zh.wikipedia.org/wiki/文件描述符
[44]. 《安卓APP動態調試-IDA實用攻略》:
http://ju.outofmemory.cn/entry/141333
[45]. 《Anti-debugging Skills in APK》:
[46]. Linux Programmer’s Manual :
http://man7.org/linux/man-pages/man3/bsd_signal.3.html
[47]. 「超文本傳輸安全協議」維基百科定義:
https://zh.wikipedia.org/wiki/超文本傳輸安全協議
[48]. 梆梆加固官方站點:
http://www.bangcle.com/
[49]. 愛加密官方站點:
https://www.i jia mi.cn/
[50]. 《遠控木馬Dendoroid.B分析報告》:
遠控木馬Dendoroid.B分析報告
[51]. 《安全預警:勒索軟件正成爲制馬人的新方向》:
安全預警:勒索軟件正成爲制馬人的新方向
[52]. DownloadManager.Request開發者文檔:
https://developer.android.com/reference/android/app/DownloadManager.Request.html?hl=zh-cn
[53]. 《揭開勒索軟件的真面目》:
http://www.antiy.com/response/ransomware.html
[54]. 「預裝」360百科定義:
http://baike.so.com/doc/10027189-10375169.html
[55]. 《「萬藍」ROM級手機木馬分析報告》:
「萬藍」ROM級手機木馬分析報告
[56]. 阿里雲域名隱私保護服務:
https://wanwang.aliyun.com/domain/whoisprotect/
[57]. 「實名制」360百科定義:
http://baike.so.com/doc/6665498-6879327.html
[58]. 《深刻分析跨平臺網絡電信詐騙》:
深刻分析跨平臺網絡電信詐騙
[59]. 《蝗蟲手機木馬分析報告》:
蝗蟲手機木馬分析報告
[60]. 「僞基站」維基百科定義:
https://zh.wikipedia.org/wiki/僞基站
[61]. 《「僞中國移動客戶端」–僞基站詐騙病毒解析》:
http://www.2cto.com/Article/201406/308395.html
[62]. 「虛擬運營商」維基百科定義:
https://zh.wikipedia.org/wiki/虛擬運營商
[63]. 《收到莫名短信別點連接 詳解木馬病毒傳送流程》:
http://news.bandao.cn/news_html/201512/20151219/news_20151219_2595155.shtml
[64]. 「洋蔥網絡」360百科定義:
http://baike.so.com/doc/4317893-4522104.html
[65]. 《The first Tor Trojan for Android》:
https://securelist.com/blog/incidents/58528/the-first-tor-trojan-for-android/
[66]. 「動態域名」360百科定義:
http://baike.so.com/doc/5338387-5573827.html
[67]. 《潛魔間諜程序分析報告》:
[68]. 《FakeTaobao家族變種演變(二)》:
FakeTaobao家族變種演變(二)
轉載自:http://blogs.360.cn/360mobile/2016/10/24/android_escape/ 原文做者:360烽火實驗室