云棲大會(huì)移動(dòng)安全專場(chǎng)——APP加固新方向(演講速記)

摘要:主持人導(dǎo)語(yǔ): 近些年來(lái),移動(dòng)APP數(shù)量呈現(xiàn)爆炸式的增長(zhǎng),黑產(chǎn)也從原來(lái)的PC端轉(zhuǎn)移到了移動(dòng)端,伴隨而來(lái)的逆向攻擊手段也越來(lái)越高明。在解決加固產(chǎn)品容易被脫殼的方案中,代碼混淆技術(shù)是對(duì)抗逆向攻擊最有效的方式之一。

主持人導(dǎo)語(yǔ):

近些年來(lái),移動(dòng)APP數(shù)量呈現(xiàn)爆炸式的增長(zhǎng),黑產(chǎn)也從原來(lái)的PC端轉(zhuǎn)移到了移動(dòng)端,伴隨而來(lái)的逆向攻擊手段也越來(lái)越高明。在解決加固產(chǎn)品容易被脫殼的方案中,代碼混淆技術(shù)是對(duì)抗逆向攻擊最有效的方式之一。但目前的移動(dòng)端加固技術(shù)真能抵御黑客的攻擊嗎?

本報(bào)告將分享阿里巴巴集團(tuán)安全部應(yīng)用加固能力養(yǎng)成記,重點(diǎn)介紹Android加固對(duì)于端上的業(yè)務(wù)風(fēng)險(xiǎn)控制是如何做到自動(dòng)化部署和分析,更快捷的感知安全風(fēng)險(xiǎn),以便快速做出響應(yīng),減少不必要的業(yè)務(wù)損失。

有請(qǐng)阿里巴巴安全專家亂武。

嘉賓演講正文:

非常感謝各位來(lái)賓來(lái)到這里,歡迎來(lái)到云棲大會(huì)移動(dòng)安全論壇。

今天講的大的標(biāo)題叫【APP加固新方向】,副標(biāo)題主要講阿里巴巴對(duì)Android加固的基礎(chǔ)介紹,以及在開(kāi)發(fā)這個(gè)產(chǎn)品過(guò)程中遇到的一些問(wèn)題和一些復(fù)雜場(chǎng)景的適配過(guò)程。由于大會(huì)給我的時(shí)間是25分鐘到30分鐘,整個(gè)安卓加固方面涉及的技術(shù)點(diǎn)還蠻多的,為了讓這次的分享有一個(gè)比較聚焦的點(diǎn),所以這次的分享主要是講Android java代碼方面的保護(hù),也就是說(shuō)編譯成Android安裝文件之后,Dex文件方面的一些基礎(chǔ)保護(hù)點(diǎn)。

我這次分享的主要有三個(gè)部分,第一部分主要是要介紹一下Android java代碼保護(hù)的技術(shù)。第二部分介紹一下應(yīng)用加固在復(fù)雜業(yè)務(wù)場(chǎng)景下的挑戰(zhàn)以及遇到的一些問(wèn)題。第三部分說(shuō)一下未來(lái)對(duì)于Android java代碼保護(hù)的一些思路,跟大家分享一下,也許大家將來(lái)會(huì)碰到,或者有相應(yīng)的一些啟發(fā)。

第一部分主要講Android?java代碼的技術(shù)保護(hù),剛才主持人做了一個(gè)小的問(wèn)卷調(diào)查,這里不少同學(xué)不是開(kāi)發(fā),我大概介紹一下這個(gè)上下文。

本身安卓手機(jī)大家不陌生,蘋(píng)果和安卓,目前是業(yè)內(nèi)主流的兩大智能操作系統(tǒng)。安卓本身的開(kāi)發(fā)環(huán)境是用java語(yǔ)言開(kāi)發(fā)的,它有一個(gè)特點(diǎn)。由于java語(yǔ)言生成的文件是在虛擬機(jī)里面執(zhí)行的,必然要保留大量的語(yǔ)義,虛擬機(jī)能夠認(rèn)識(shí)可執(zhí)行文件的時(shí)候保留了很多的語(yǔ)義。這就帶來(lái)一個(gè)問(wèn)題,既然編譯生成這種Dex格式,保留了大量的語(yǔ)義,而這種格式谷歌對(duì)外完全公開(kāi)的,惡意者通過(guò)反編譯達(dá)到看到原來(lái)Java代碼的這種目的。不管是阿里巴巴還是其他安全加固的友商,對(duì)安卓java代碼的一個(gè)保護(hù),也就是安卓上面Dex文件的保護(hù),從加固服務(wù)產(chǎn)生到現(xiàn)在一直是重點(diǎn)。

我簡(jiǎn)單介紹一下Android?java代碼以及Dex代碼保護(hù)迭代介紹,業(yè)內(nèi)主要總結(jié)了四代的保護(hù)方案。

第一代加固本身這種方案剛出來(lái)的時(shí)候,大概是2013到2014年之間,本身這個(gè)加固方案對(duì)于安卓本身的可執(zhí)行文件,也就是Dex文件的保護(hù),相當(dāng)于是在打包的時(shí)候,就是生成整個(gè)安卓安裝應(yīng)用包的時(shí)候會(huì)對(duì)Dex進(jìn)行加密。加密算法各種各樣,可以用AES,也可以用其它的。在運(yùn)行的時(shí)候通過(guò)一個(gè)自定義的類加載器進(jìn)行解密,真正在運(yùn)行的時(shí)候是完整的原來(lái)應(yīng)用開(kāi)發(fā)者編譯出來(lái)的Dex文件。這種加固的特點(diǎn)一目了然,你拿到文件的時(shí)候,既不知道密鑰,也不知道加密算法,看不出來(lái)文件的整個(gè)邏輯,這個(gè)時(shí)候一定程度上能夠防住,通過(guò)一些開(kāi)源的工具逆向分析這個(gè)Dex文件。

缺點(diǎn)也很明顯,因?yàn)樗?jiǎn)單,因?yàn)檫\(yùn)行時(shí)用一個(gè)自定義的類加載器在加載的時(shí)候解密,把這點(diǎn)攔掉,就把這個(gè)殼脫了。

那通過(guò)一段時(shí)間的發(fā)展以后,又出現(xiàn)了第二代的保護(hù)方案,就是類級(jí)別的Dex保護(hù)。我前面介紹了其實(shí)Dex文件來(lái)說(shuō),它的格式是公開(kāi)的,公開(kāi)就意味著這里面的某些類、某些函數(shù)保護(hù)的code在哪一個(gè)位置,其實(shí)所有人都能夠知道。所以第二代的保護(hù)方案,相當(dāng)于把Dex里面要保護(hù)的核心函數(shù)抽離出來(lái)生成另外一個(gè)文件,利用一個(gè)虛擬機(jī)類加載機(jī)制。本身虛擬機(jī)有一個(gè)特點(diǎn),它必然會(huì)掉到這個(gè)類里面的一個(gè)方法,我們已經(jīng)在打包的時(shí)候,將這些核心函數(shù)保留在已知的位置,通過(guò)這個(gè)函數(shù)調(diào)用我們的修復(fù)函數(shù),然后將所有的業(yè)務(wù)邏輯進(jìn)行修復(fù)。這樣的一個(gè)方案,其實(shí)主要的原理還是利用虛擬機(jī)類加載機(jī)制的特點(diǎn)來(lái)達(dá)到一定保護(hù)的效果。當(dāng)然這種保護(hù)有一個(gè)特點(diǎn),我們?nèi)绻?jiǎn)單來(lái)說(shuō),即便是我把它抽離了,最后運(yùn)行的指令是谷歌支持的Dex標(biāo)準(zhǔn)指令,這點(diǎn)大家要注意。

第三代跟前面兩代完全不同,因?yàn)楣雀璧腄ex指令是開(kāi)源的,不管第一代第二代,內(nèi)存中運(yùn)行的都是谷歌的標(biāo)準(zhǔn)指令,所以從原理上一定有辦法將這個(gè)指令完全逆向出來(lái),然后把它反編譯出來(lái)。但是第三代就有一個(gè)質(zhì)的區(qū)別了。其實(shí)第一步和第二代是一樣的,也是在編譯打包的時(shí)候?qū)ex的核心函數(shù)抽離的,抽離后,翻譯成一種自己定義的指令,用自己的一種編譯指令進(jìn)行翻譯,把這個(gè)指令變一個(gè)種,變成其他的指令,這個(gè)時(shí)候運(yùn)行的時(shí)候通過(guò)自己的解釋器來(lái)解釋執(zhí)行,是自己定義的相關(guān)指令,這是跟第二代有質(zhì)的區(qū)別的。我在內(nèi)存中運(yùn)行的指令,在某些保護(hù)的函數(shù)里面就一定不是谷歌的標(biāo)準(zhǔn)指令了,這點(diǎn)能夠很有效的防止內(nèi)存直接拷貝等破解方案。

第四代,也是行業(yè)目前公認(rèn)的方案,就是java 2C的保護(hù)方案,這種更簡(jiǎn)單直接,它的原理很清晰,我們?nèi)绻鳛橐粋€(gè)開(kāi)發(fā)者,在開(kāi)發(fā)java代碼的時(shí)候,不管是原來(lái)傳統(tǒng)的PC上的java虛擬機(jī)還是谷歌的虛擬機(jī),java代碼一定是可以翻譯成用C代碼來(lái)表示的。比如說(shuō)寫(xiě)一個(gè)java代碼的函數(shù),從原理來(lái)說(shuō)其實(shí)只要不嫌麻煩,我一定能夠利用虛擬機(jī)漏出的接口寫(xiě)成C代碼,這種保護(hù)方案直接從根源上解決這個(gè)問(wèn)題。你認(rèn)為核心要保護(hù)的函數(shù),我們直接在編譯打包的時(shí)候?qū)⑦@些函數(shù)翻譯成C語(yǔ)言的代碼,然后再用編譯器編譯成一個(gè)so的文件,也就是這個(gè)CPU支持的一個(gè)二進(jìn)制code,這樣達(dá)到了比較好的保護(hù)。

這基本上就是我介紹目前安卓移動(dòng)端對(duì)于java代碼保護(hù)的四代技術(shù)。

因?yàn)榈谝淮偷诙夹g(shù)相對(duì)比較簡(jiǎn)單,我介紹一下第三代和第四代技術(shù)整個(gè)的框架流程圖。

自定義解釋器的Dex保護(hù)方法第一部分應(yīng)用打包和普通的是沒(méi)有什么區(qū)別的,最終生成的也是安卓系統(tǒng)能夠認(rèn)識(shí)的一個(gè)可執(zhí)行的文件。但是到了第二步和第三步的時(shí)候就有點(diǎn)區(qū)別了,第二步要經(jīng)過(guò)一個(gè)加固的工具鏈,因?yàn)橐彩且粋€(gè)安卓的可知性的文件,首先要找到一個(gè)Dex文件,抽取核心函數(shù)指令,然后埋點(diǎn)一些hook接口,接下來(lái)打包還回apk文件,簽名后應(yīng)用發(fā)布。藍(lán)色的部分表示是在運(yùn)行時(shí),黃色的部分是沒(méi)有安裝到用戶手上,藍(lán)色的部分應(yīng)用已經(jīng)發(fā)布了,然后在用戶的手機(jī)上執(zhí)行的一個(gè)邏輯。因?yàn)榈诙铰顸c(diǎn)了hook接口,就進(jìn)入一個(gè)自定義的一個(gè)解釋器,根據(jù)傳譯的二進(jìn)制的code翻譯成原來(lái)Dex文件想保護(hù)的java那個(gè)code的邏輯,完成了第三代的保護(hù)效果。真正在解釋的時(shí)候解釋執(zhí)行的就是這種變種的指令,然后達(dá)到正常執(zhí)行業(yè)務(wù)邏輯的效果,這是第三代的一個(gè)自定義解釋器Dex保護(hù)方案的介紹。

說(shuō)一下第四代java2C保護(hù)方法的介紹,前兩步也跟第三代是一樣的,就是開(kāi)發(fā)者自己編譯好的一個(gè)安卓可安裝程序。不同的是,直接簡(jiǎn)單粗暴將需要保護(hù)的Dex核心函數(shù)直接翻譯成C代碼。比如一個(gè)編譯好的Dex文件,直接把這個(gè)函數(shù)編譯成C代碼,可以自定義一個(gè)編譯器翻譯成一個(gè)C代碼。C代碼還是很成熟的,可以用各種各樣的編譯器,包括谷歌以及第三方編譯器,這樣完全去除了里面的核心指令,就變成看這個(gè)手機(jī)或者這個(gè)架構(gòu)支持的Dex文件。這里面運(yùn)行的時(shí)候又有不同,因?yàn)檫@個(gè)時(shí)候是需要把SO給打進(jìn)APP里面,因?yàn)檫@些代碼其實(shí)已經(jīng)編成SO,要加到apk里面,所以核心函數(shù)一般加一個(gè)native標(biāo)簽,調(diào)到本身的SO里面,后面的執(zhí)行順理成章了,就是本地指令的執(zhí)行保護(hù)函數(shù),能夠達(dá)到完全的正常執(zhí)行的業(yè)務(wù)邏輯。

第一部分大概介紹完了,包括目前比較流行的新的技術(shù),就是第三代和第四代,但是其實(shí)我這邊要說(shuō)一下第三代和第四代的一些缺點(diǎn)。

從剛才的介紹看起來(lái)比較美好,但是到了第三代的自定義解釋器的時(shí)候,這個(gè)時(shí)候由于要hook系統(tǒng)的一些接口,普通的應(yīng)用開(kāi)發(fā)者要遇到很多碎片化的問(wèn)題,對(duì)于加固要調(diào)用大量的系統(tǒng)私有api的安全服務(wù)來(lái)說(shuō),可能遇到的問(wèn)題更顯突兀,所以基本上在第三代的自定義解釋器的保護(hù)方案,不是說(shuō)不強(qiáng),但可能遇到碎片化的東西比較多,到第四代其實(shí)反倒碎片化比較小,為什么大家比較推崇java2C的保護(hù)方案,是因?yàn)榘裫ava代碼翻譯成C代碼再編譯成SO,是完全符合很多虛擬機(jī)的開(kāi)發(fā)規(guī)范的,這樣的兼容性問(wèn)題最小。當(dāng)然這兩個(gè)場(chǎng)景也有一個(gè)問(wèn)題,它編譯出來(lái)的函數(shù)可能會(huì)體積變大,可能執(zhí)行效率變低,但是這些都是一些具體的細(xì)節(jié),今天的時(shí)間有限,就不再詳細(xì)贅述了。

第二部分介紹一下加固在復(fù)雜業(yè)務(wù)場(chǎng)景下的挑戰(zhàn)。

安卓從幾年前大家也不是特別看好的一個(gè)智能操作系統(tǒng)到現(xiàn)在成為全球第一大的智能操作系統(tǒng)來(lái)說(shuō),自身的操作系統(tǒng)是有一個(gè)不斷的迭代,包括今年最新發(fā)布的android O,我們能看到它的進(jìn)步。在安卓上面開(kāi)發(fā)各種業(yè)務(wù)其實(shí)現(xiàn)在已經(jīng)變得很復(fù)雜了,就以我們阿里巴巴公司比較旗艦類型的應(yīng)用,比如手機(jī)淘寶和支付寶的應(yīng)用,應(yīng)用開(kāi)發(fā)的流程和開(kāi)發(fā)使用的黑科技的各種技術(shù),已經(jīng)是不亞于傳統(tǒng)上面的一些PC上面一些比較復(fù)雜的客戶端開(kāi)發(fā)的程度了,所以加固在服務(wù)于這些應(yīng)用的時(shí)候,也面臨著一些復(fù)雜業(yè)務(wù)場(chǎng)景的挑戰(zhàn),我做一些簡(jiǎn)單的介紹,舉兩個(gè)例子。

Hotpatch應(yīng)用場(chǎng)景,安卓應(yīng)用如果是說(shuō)在你的應(yīng)用發(fā)布以后,到了用戶的手機(jī)端上以后如果發(fā)現(xiàn)一些bug,按照傳統(tǒng)的方案有一種解決方式,用戶升級(jí)再更新一個(gè)版本、重新安裝一遍把這個(gè)問(wèn)題解決了。但是在對(duì)于很多復(fù)雜的應(yīng)用來(lái)說(shuō),比如說(shuō)像手機(jī)淘寶或者天貓或者支付寶,它本身的一個(gè)安裝包就已經(jīng)70多兆了,比如里面有一個(gè)很小的bug,比如哪一個(gè)頁(yè)面顯示不對(duì),讓用戶完全的升級(jí)一遍,重新下載包升級(jí)一下,用戶體驗(yàn)不是很好,他們業(yè)務(wù)方開(kāi)始研究一種技術(shù),當(dāng)我發(fā)現(xiàn)某一個(gè)地方某一段代碼有問(wèn)題了,這個(gè)時(shí)候我就只修改這一部分代碼,而不需要用戶安裝整個(gè)發(fā)布包。我們這個(gè)原始應(yīng)用有三個(gè)類,分為A/B/C,當(dāng)我有問(wèn)題的時(shí)候,比如我發(fā)現(xiàn)的問(wèn)題是某一個(gè)代碼有bug了,假設(shè)B類有bug,我只需要把他弄成一個(gè)Dex文件,把這個(gè)下發(fā)下來(lái),熱部署以后把原始APP里面的Dex文件修改一下,讓它變成只有A和C這兩個(gè)類,然后再通過(guò)一些類加載器里面尋找Dex的順序,達(dá)到首先執(zhí)行我的熱部署后的這個(gè)文件,當(dāng)需要調(diào)用B的時(shí)候再執(zhí)行B這個(gè)類,達(dá)到修復(fù)這個(gè)原有程序業(yè)務(wù)邏輯bug的目的,或者我想更新達(dá)到更新的效果,當(dāng)然這種方案目前在安卓上面運(yùn)行的還是比較多的,包括阿里也有發(fā)布熱補(bǔ)丁的。原來(lái)這種在蘋(píng)果上面也會(huì)應(yīng)用,但整個(gè)來(lái)說(shuō)蘋(píng)果不讓用了,谷歌想在明年P(guān)的版本可能會(huì)全面限制這種技術(shù)方案,但是目前來(lái)說(shuō)發(fā)布O的版本目前還沒(méi)有這個(gè)限制。但是這種方案其實(shí)在加固來(lái)說(shuō),從加固的原理來(lái)說(shuō)有一點(diǎn)沖突,熱部署后的dex文件會(huì)出現(xiàn)一點(diǎn)問(wèn)題,這是加固服務(wù)發(fā)展過(guò)程中發(fā)現(xiàn)的一個(gè)比較復(fù)雜場(chǎng)景的舉例。

第二種場(chǎng)景大家更不陌生,由于業(yè)務(wù)發(fā)展越來(lái)越復(fù)雜,開(kāi)發(fā)規(guī)模稍微大一點(diǎn)的應(yīng)用,需要插件化的部署,比如手機(jī)淘寶集成了各種各樣的服務(wù),這時(shí)候要多個(gè)團(tuán)隊(duì)協(xié)作開(kāi)發(fā),這就無(wú)可避免要利用我們所謂的插件化的思想,然后分步開(kāi)發(fā)。這時(shí)候傳統(tǒng)的加固面臨一個(gè)問(wèn)題,最初我們主要是保護(hù)主Dex文件一些根目錄下的Dex文件,插件會(huì)埋到lib下面很深的地方,導(dǎo)致加固刺出現(xiàn)盲點(diǎn),作為一個(gè)通用化的一個(gè)加固方案很難做到將所有的Dex文件也保護(hù),但是有些是比較核心的。剛才我提的這兩個(gè)例子,不管是阿里巴巴還是很多友商,這個(gè)問(wèn)題都得到很好的解決,具體的細(xì)節(jié)我就不贅述了。

最后一部分介紹一下業(yè)內(nèi)認(rèn)為未來(lái)對(duì)于安卓java代碼一種保護(hù)手段的思路

第四代java2C保護(hù)方案是用編譯器編譯成一個(gè)標(biāo)準(zhǔn)的SO文件,其實(shí)標(biāo)準(zhǔn)的SO文件開(kāi)發(fā)者都很清楚,這種elf格式也是透明的,相當(dāng)于本身這種格式也是完全有規(guī)范的,是透明的,也是可以逆向的。既然可以把DEX文件翻譯成c代碼,那么也可以用支持vmp虛殼的編譯器在編譯成內(nèi)置于vmp虛殼的保護(hù)的so。

風(fēng)險(xiǎn)設(shè)備的控制,我們做安全來(lái)說(shuō)從原理來(lái)說(shuō),如果不是特別計(jì)較成本的話,其實(shí)只要在端上運(yùn)行的東西,特別谷歌開(kāi)源運(yùn)行的,其實(shí)原理上是能夠破解的,只不過(guò)你花費(fèi)的時(shí)間長(zhǎng)短和破解成本的高低,所以在手機(jī)淘寶和電商的超級(jí)應(yīng)用,保護(hù)思路越來(lái)越從端上防護(hù)傾向于端和云聯(lián)合的防護(hù)。在端上在打包的時(shí)候會(huì)埋入很多點(diǎn),不管是安全adk還是本身加固工具鏈的方式,獲取一個(gè)端上唯一的標(biāo)識(shí),我們稱為一個(gè)設(shè)備指紋。像下單這種行為會(huì)加入這種設(shè)備指紋的請(qǐng)求,然后服務(wù)器通過(guò)這個(gè)指紋識(shí)別進(jìn)行風(fēng)險(xiǎn)控制,比如我們認(rèn)為是惡意者操控的設(shè)備,可以加入黑名單,不會(huì)讓這個(gè)應(yīng)用崩潰。比如你搶紅包搶不到,你買(mǎi)東西買(mǎi)不成功,給用戶一個(gè)反饋,這種其實(shí)保護(hù)效果是相當(dāng)好的。

我的分享結(jié)束了,最后感謝大家的聆聽(tīng),謝謝。

——————————————

阿里聚安全-應(yīng)用加固

通過(guò)對(duì)Android應(yīng)用進(jìn)行重新編譯、加殼保護(hù)、修改指令調(diào)用順序等手段來(lái)增強(qiáng)應(yīng)用反破解能力。我們的加固功能注重加固強(qiáng)度與兼容性并重,避免一般加固功能盲目追求加固強(qiáng)度導(dǎo)致加固后完全不可用。

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容