演講實錄——Android應用安全提升攻略 [復制鏈接]

2019-5-10 10:09
九霄逆鱗 閱讀:280 評論:0 贊:1
Tag:  

本文來自2019安卓巴士開發者大會現場實錄,由于錄入匆忙,內容可能存在偏差,歡迎大家掃描文末二維碼查看現場實錄視頻和下載大會完整PPT。演講人:侯海飛



侯海飛:大家好,我演講的主題是《Android應用安全提升攻略》,上一期我一個同事做了VMP加固原理和攻擊策略的分享。VMP保護方案的開發,對開發者的安全技術要求太高,且開發周期會很長,個人感覺對大家的幫助可能不會太大。所以這次分享,我想給大家帶點更實際的東西,在應用開發過程中,有哪些安全方面的技術點需要注意,以及如何解決,如果不能解決,有哪些渠道可以獲取幫助。



我會從三個方面來講。第一是安全風險案例以及常見的安全隱患,讓大家對應用感覺有個感性的認識;第二是應用安全活動周期,包括安全開發、應用審計、安全增強、渠道監控;第三是應用保護的常見策略,從待保護的目標是否為源碼,區分為應用加固和源碼混淆兩塊內容。



分享幾個安全風險案例,這三個漏洞已經修復,一個是餓了么,網絡協議數據加密被人破了。這是2015年暴出的漏洞,當時餓了么的開發已經有了些安全意識,將加密過程放在native層實現,但是對加密邏輯并沒有保護,隨著當前native逆向工具(如IDA)和相關方法的普及,native層逆向的門檻也在逐步降低。我們部門有不少客戶來找我們做應用安全保護,大多是類似的關鍵邏輯被人破解,導致被薅羊毛。對此,涉及核心業務的開發者,需要對此給與足夠的重視,一旦出了問題,可能給公司的利益造成極大損失。


下面一個是支付寶漏洞,這涉及了一個跨域訪問的漏洞,老版本的Android系統(4.2以下版本),這個訪問權限默認是開的,如果開發者沒有主動關閉的話,這個漏洞相當于一直存在。當時暴這個漏洞的時候,支付寶的支付碼被攻擊者獲取,并可直接支付,直接造成了用戶的財產損失。

最后說一個照片恢復的應用。類似照片誤刪恢復的應用,市面上都是要付費的,當時我看了一下主流恢復類APP大多找第三方安全廠商加固,這些加固的應用脫殼起來還是比較費力復雜,為了給大家做簡單的演示,我找到了一個沒有做防護的,這里給大家展示一下直接的攻擊過程。



介紹一下基本的業務場景,點擊搜索照片,找到照片后,進入付費流程,付費成功之后會恢復目標照片。這里顯示的是用戶取消付費。攻擊的時候這個提示是一個突破口,據此提示,找到了它的付費的控制流。逆向app源碼,發現開發者的代碼寫的還是非常好,完全達到了自注釋的要求,根據函數名稱可以猜出付費控制流,所以當時的開發者還是非常優秀,但是他沒有安全開發的意識,連基本的代碼混淆,字符串混淆都沒有做,直接導致攻擊者可以輕松的找到核心邏輯控制流并修改,默認走到了付費成功的環節。



這里我大概介紹一下相應防護策略,其實我自己做完了攻擊之后,通知了作者做安全防護。當時找這個素材的時候,特地去核實了下,他已經做了防護。從剛才的應用基本流程,可以看出那個APP是沒有服務端,核心邏輯全部放在客戶端是極為不安全的做法,這里可以將掃描到的照片信息以傳到服務端,待用戶付費后,可以把這些信息再下發給客戶端,能夠達到一定的安全防護效果,不至于攻擊者更改一下付費控制流就被破解了。


這里還有一個是字符串加密,代碼的明文字符串,需要加密,防止破解者直接搜索到線索;重打包這個也是一個點,啟動簽名校驗,非原簽名則直接掛機,或者無法正常運行核心邏輯;核心邏輯抽取到native層實現,增加逆向門檻。逆向入門者學習一天,就可以開始逆向java層代碼,但native層應該還不夠。代碼混淆,也是很重要,核心邏輯抽取到native層,也僅僅是增加了一點逆向門檻,需要配合native的保護,才能達到好的防護效果。后面會給大家推薦native層混淆的方案。



安全隱患這里我們匯總一下,直接看圖, App可被逆向,輕易獲取代碼邏輯,進一步導致控制流被hook,防線被破;可二次打包,APP可被修改, 被套殼加入攻擊者代碼,重新打包發布;密碼學誤用,客戶端APP代碼中使用了不安全的密碼學實現,例如固定硬編碼的對稱加密,ECB模式的對稱加密,CBC模式中IV固定等;敏感信息泄露,客戶端APP代碼中泄漏敏感數據,如認證使用的共享密鑰、不應被暴露的后臺服務器ip地址等;通信數據明文傳輸,客戶端APP與服務器端交互的數據通過明文的通信信道傳輸,或者加密傳輸,但數據依然可以被解密;還有日志信息泄露,可調式之類。這個可調試,多說一點個人經歷。以前在某大公司開發了一個業務,公司的安全部門會對代碼做檢查,查看有沒有基本的安全漏洞,如果你把加密過程放在代碼里,會被檢查出來有風險,安全督查人員會指導開發者把加密的過程拆分,放在不同的文件,加上一些其它步驟讓逆向者多費時間。這樣的操作,對初級的逆向者可能會有一點點用戶,但是逆向的人如果能調試app,那他根本就不需要知道加密的過程,直接把加密的接口調起來之后就可以了,不用管過程。所以這個反調試也是一個安全技術點。

    


下面我們說一下安全開發活動周期以及開發過程當中有哪些點是需要注意的。開發之前比如你這個業務規劃好了,要開發哪些功能,開發這個功能的過程當中,或者說是規劃之前就應該有意識做安全方面的工作,哪些地方可能會被逆向者利用,比如網絡數據傳輸怎么保護,都是安全防護點。

應用開發好了之后我們想知道應用到底有沒有漏洞,我們可以使用一些漏洞掃描工具,其實這些掃描工具一般都是靜態的,速度比較快。安全廠商都會提供這個漏洞掃描的功能,一般也都是免費的。



這里是一些常見的安全點,大家可以看一下,這里有密碼輸入、加密算法與秘鑰存儲、數據通信、運行環境安全、應用簽名校驗、核心邏輯保護、調試日志清理、應用敏感數據保護等技術點,大家可以自己看一下具體的攻擊點和開發建議。



這里說一下安全掃描和滲透測試的事情。前面我們說的跨域訪問漏洞,可以通過安全掃描判斷是否有此漏洞,我們可以參考一下公安三所的掃描結果,這個是我接觸到的最全面的安全掃描。掃描的方法基本上是靜態掃描為主,這里有很多公司內部有安全部門會對你的APP進行掃描,掃描之后會讓你進行修改。動態掃描大部分廠商還是沒有提供的,比如可調試、進程注入這些功能基本上都是要動態檢測的。滲透,基本上都是人工滲透,這里一般都是找第三方廠商,它是針對目標場景,比如你是一個支付應用,你的支付密碼和協議保護這些都是一個關鍵的覆蓋場景。滲透周期的測試也是比較長的。



這個是2018年金融類應用高危漏洞,大家可以大概看看這些常見的漏洞項目,有個感性認識。其實并非所有的漏洞都需要修復,漏洞檢測大多是靜態檢測,開發者可以根據實際的情況選擇。

漏洞的修復,這些檢測項,通過普通的加殼都是可以從表面上解決,因為加殼后,應用的代碼已經被隱藏,靜態檢測是檢測不到的。但是,加殼一般只治標不治本,且簡單的加殼容易被破解,開發者自己研究加殼也比較費時費力,且適配安卓的版本會相當的麻煩。在下面會推薦一套方案,大家是可以研究的。第三方廠商會提供這些相關的業務,幫助開發者解決這些漏洞,這里不多說了。



這里你發布之后需要監控應用到底有沒有破解和有沒有損害公司的利益,這里是我們公司某部分對應用盜版的數量和盜版的渠道分布,開發者需要根據監控數據做分析,需要做相應的安全策略升級和對抗。



最后我們說一下Android加固常見的策略,包括應用加固和源碼混淆。首先我們看應用加固策略,一個是直接對應用二進制文件進行加固, DEX文件和SDK文件是一致的,安卓sdk是將dex和資源打包起來,這里主要談談dex文件的加固。SO文件主要涉及一些函數隱藏。



下面看一下這個是加固方案迭代的周期,第一代是最基礎的混淆,第二代整體的加固,把原包的DEX做一個加密存儲,啟動時解密load原dex,相當于app外面套一個殼。

普通加殼現在破解的工具已經非常多了,研究也了沒有用,這里還有一些兼容性和應對Android碎片的東西,如果自己研究會很麻煩。還有一個是拆分DEX加固,這個就是前面的基礎上做了一個函數上的抽取,加密保存,并且在你運行的時候會申請內存,對原函數做patch。這有一個好處,就是被保護的函數,內存不是在一個連續的空間,這一個方案也有相應的破解工具,安全強度也可以忽略。

虛擬機加固(VMP)是去年我同事分享的內容,主要是替換函數指令,通過定制虛擬機解釋器去執行替換指令后的函數,這套方案的保護效果是挺好的,方案發布以來還沒有碰到被破解的情況,這個方案一般來說都是局部加固,涉及到一些執行效率的問題。



最新一代的加固是java2c,強度還是很高的,因為他把java指令轉成了native指令,并且轉換之后還有一些控制流偽造的功能,你原來的功能它這里會偽造幾十個控制流,讓逆向的人非常痛苦。



SO加固這里導出函數有369個函數,加固后它只有42個函數,其他的用戶自定義的都是可以做加密的隱藏的。原先老的方式是基于段的加解密,去年有一個人寫了本書是關于Android逆向的,里面講了一些Android加殼的基礎方案,建議大家不要看,因為完全沒有用,強度太低,開發后還要適配安卓各個版本。



這個是Java的代碼混淆,針對一些逆向的IDE環境是有一定效果的,建議大家可以考慮做一些中文混淆,這個很容易實現,并且的確有效果。



這個是我剛剛說的C++代碼的混淆,這個是原來的函數邏輯,你保護之后這個邏輯變成了這個樣子,控制流大幅度偽造,會讓攻擊者痛不欲生,遇見這樣的保護,我們基本也不會去逆向。控制流偽造,大家可能也有疑問,會不會影響運行效率。這里的確會影響運營效率,所以一般也只是對核心的一些功能做保護。



這個是混淆的過程當中加的一些字串的保護。



下面是重點內容。c/c++代碼混淆工具,逆向對抗利器—LLVM。LLVM的處理過程是一般的編譯器都有的三個過程,包括前端、優化器(中間件)、后端。通過這個優化器我們可以實現各種效果,例如代碼控制流扁平化,虛假控制流,字符串加密,符號混淆,指令替換等,剛剛的控制流其實是做了一個虛假的控制流優化。



H5腳本混淆大家可能也都會做,很多人覺得還是沒有什么用。如果沒有混淆,剛入門的攻擊者都能看懂你的實現邏輯,但是如果根據語法樹做了邏輯混淆和字符串加密,至少能讓攻擊者難受,逆向沒那么輕松。H5腳本的混淆很多的IDE環境都可以配置,大家可以找一下,這里我不做介紹。

最后我總結一下,安卓開發過程中,核心邏輯一定要放在native,20人以上的團隊個人建議,分配人手搞安全,搞LLVM,做優化器。


以上就是我所有內容的分享,謝謝大家。




現場PPT分享:

      關注【安卓巴士Android開發者門戶】公眾號,后臺回復“420”獲取講師完整PPT。


大會現場視頻小程序:




歡迎前往安卓巴士博客區投稿,技術成長于分享

期待巴友留言,共同探討學習


分享到:
我來說兩句
facelist
您需要登錄后才可以評論 登錄 | 立即注冊
所有評論(0)

領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

两码中特期期