本文內(nèi)容來自祁麟在 QCon 分享的主題《代碼保護(hù)之道——混淆的藝術(shù)》,主要涉及黑產(chǎn)現(xiàn)狀、通用防御架構(gòu)、攻擊流程和混淆理論。黑產(chǎn)現(xiàn)狀、盈利手段
黑產(chǎn)的現(xiàn)狀及常用的盈利手段是什么?這里給出三個(gè)數(shù)字:第一個(gè)數(shù)字是 150 萬,這是 2017 年網(wǎng)絡(luò)安全生態(tài)峰會(huì)上評(píng)估出的黑產(chǎn)從業(yè)人員的人數(shù)。跟這個(gè)人數(shù)相比,目前業(yè)界頂尖公司中安全從業(yè)人員最多不過千余人,與黑產(chǎn)對(duì)比可謂鳳毛麟角。第二個(gè)數(shù)字是千億,這是網(wǎng)絡(luò)安全生態(tài)峰會(huì)上評(píng)估的黑產(chǎn)年產(chǎn)值。根據(jù) 2017 年的騰訊阿里兩家巨頭的財(cái)報(bào),兩家公司凈利潤總和接近千億元,黑產(chǎn)的年產(chǎn)值基本可以與這兩家巨頭公司并駕齊驅(qū)。第三個(gè)是 20%,這是根據(jù)我們之前經(jīng)驗(yàn)評(píng)估的營銷活動(dòng)的資損率。舉例來說比如要做一個(gè)新注冊(cè)的拉新活動(dòng),投了 100 萬去吸引用戶,最后會(huì)發(fā)現(xiàn)至少有 20 萬會(huì)進(jìn)入到黑產(chǎn)的口袋里。
簡單列舉兩個(gè)黑產(chǎn)的盈利場景。第一種是撞庫,就是把其他平臺(tái)泄露的一些用戶名和密碼,不停地拿到另外一些平臺(tái)上去試,如果登錄成功之后首先會(huì)竊取賬號(hào)內(nèi)的資產(chǎn)信息,之后會(huì)使用竊取的賬號(hào)去做一些薅羊毛等相關(guān)的事情。第二種是垃圾注冊(cè),黑產(chǎn)要盈利必須要有海量的帳號(hào),黑產(chǎn)會(huì)注冊(cè)成千上萬個(gè)小號(hào)來為后續(xù)的活動(dòng)進(jìn)行準(zhǔn)備,這是萬惡之源。但是實(shí)際上批量賬號(hào)注冊(cè)是成本非常高的事情,需要海量的手機(jī)號(hào)碼、手機(jī)設(shè)備等等。工欲善其事必先利其器,黑產(chǎn)也深知這個(gè)道理。為了以最小的成本獲取最大的收益,外掛應(yīng)運(yùn)而生。外掛具有批量化、虛擬化、自動(dòng)化的能力,可以最大程度來滿足黑產(chǎn)的需求。
為了抵御黑產(chǎn),各家公司都會(huì)有自己專門的風(fēng)控團(tuán)隊(duì),使用各種各樣的技術(shù)手段去進(jìn)行對(duì)抗。這里介紹一個(gè)比較通用的架構(gòu)(參見圖 1)。首先客戶端會(huì)把采集到的數(shù)據(jù)加密后 (包括安全簽名等) 通過業(yè)務(wù) API 接口請(qǐng)求傳安全網(wǎng)關(guān),網(wǎng)關(guān)這里會(huì)有一些實(shí)時(shí)的策略引擎來進(jìn)行風(fēng)控,包括但不限于 IP 策略、環(huán)境設(shè)備、帳號(hào)屬性、行為序列以及一些 AI 機(jī)器學(xué)習(xí)模型等等。風(fēng)控結(jié)果會(huì)發(fā)送到后端的二次驗(yàn)證系統(tǒng),如果發(fā)現(xiàn)前端的請(qǐng)求是非法的,就直接阻斷請(qǐng)求或者彈出驗(yàn)證碼等等。如果沒有問題,就會(huì)真正交給業(yè)務(wù)系統(tǒng),然后由業(yè)務(wù)系統(tǒng)來做一些相關(guān)的處理。同時(shí),各家也會(huì)有對(duì)應(yīng)的離線策略引擎,它會(huì)通過旁路數(shù)據(jù)進(jìn)行無監(jiān)督聚類甚或有監(jiān)督的機(jī)器學(xué)習(xí)等等,生成更多的模型,輔助后端的風(fēng)控。
圖 1
接下來重點(diǎn)介紹客戶端保護(hù)相關(guān)的工作。整個(gè)風(fēng)控系統(tǒng)是一個(gè)非常龐大的鏈路,僅就客戶端而言也是一個(gè)非常復(fù)雜的體系,這里包括具體采集什么樣的風(fēng)控?cái)?shù)據(jù)、如何保證采集數(shù)據(jù)的安全性和對(duì)抗的實(shí)時(shí)性等等。在移動(dòng)時(shí)代,PC 時(shí)代的 WEB 的業(yè)務(wù)幾乎全部都落地到了客戶端,如果客戶端的風(fēng)控沒有做好,無異于門戶大開,直接給黑產(chǎn)提供了攻擊的入口。這里介紹了基于客戶端進(jìn)行風(fēng)控的例子,我們可以看到攻擊曲線完全降低到了冰點(diǎn),實(shí)際上這里并沒有使用多么復(fù)雜的機(jī)器學(xué)習(xí)方法,而僅僅是基于客戶端本身的混淆邏輯來實(shí)現(xiàn)了業(yè)務(wù)保護(hù)達(dá)到的結(jié)果。
防御方法論
第一點(diǎn)是天下武功唯快不破。攻防的本質(zhì)實(shí)際上是成本和收益的對(duì)抗。良好的代碼混淆會(huì)大大提高破解所需的時(shí)間和門檻,只要保證核心代碼的更新速度快于攻擊者破解的速度,就可以實(shí)現(xiàn)很好的保護(hù)效果。
第二點(diǎn)是重劍無峰,大巧不工。攻防的核心是基于可信數(shù)據(jù)的對(duì)抗,誰對(duì)系統(tǒng)的底層理解得更加深入,誰就在整個(gè)攻防里面掌握了主動(dòng)權(quán)。同樣,良好的代碼混淆可以保證你的數(shù)據(jù)采集邏輯不被攻擊者所知悉,這可以大大提高后端風(fēng)控?cái)?shù)據(jù)的準(zhǔn)確性和安全性。
第三點(diǎn)是藏葉于林。安全是業(yè)務(wù)的天然屬性,業(yè)務(wù)是安全的最佳載體。只有結(jié)合了業(yè)務(wù)的安全才是真正的安全,孤立的安全是很容易被攻擊者攻破的。將業(yè)務(wù)代碼和安全代碼放在一起進(jìn)行混淆,攻擊者要破解的話,不但要摸清安全邏輯,還要了解清楚整個(gè)業(yè)務(wù)邏輯。同時(shí),業(yè)務(wù)上的風(fēng)吹草動(dòng)也會(huì)為安全起到非常好的預(yù)警作用。
黑客攻擊流程
在介紹完防御方法論之后,具體介紹代碼混淆之前,介紹下黑客的攻擊流程(參見圖 2)。
圖 2
攻擊的第一步是尋找入口,一般有兩種方式:靜態(tài)分析和動(dòng)態(tài)分析。靜態(tài)分析就是首先查看.so、.elf 等文件,查看其導(dǎo)出表。如果找不到,就看字符串表,在字符串里找信息,找到之后也可以定位到對(duì)應(yīng)的位置。如果字符串表再?zèng)]有,就看導(dǎo)入表,因?yàn)閷?dǎo)入表里面可能會(huì)引入 MD5 等一些簽名算法的值,如果導(dǎo)入表也沒有,就得看代碼邏輯了。舉例來說,AES 算法有一個(gè) S 盒,可以直接在源碼中找 S 盒的特征,然后就知道這是 AES 算法,這是一個(gè)很好的線索,可以順著該線索進(jìn)而去摸清整體的邏輯。如果這些方法都行不通,還有符號(hào)執(zhí)行等技術(shù)可以用來輔助分析。
動(dòng)態(tài)分析首先可以利用常用的 trace 工具,如 ltrace、strace 等來分析函數(shù)的調(diào)用流,對(duì)整體流程大致有了一個(gè)了解之后需要定位到關(guān)鍵函數(shù)的入口,定位到關(guān)鍵入口之后需要結(jié)合動(dòng)態(tài)調(diào)試技術(shù),通過 GDB、LLDB 等工具利用單步調(diào)試等一些調(diào)試方法去獲取信息。除此之外還有一個(gè)利器是 Hook,結(jié)合 Hook 技術(shù)將關(guān)鍵參數(shù)信息打印出來。同時(shí),一些應(yīng)用會(huì)采用有些客戶端保護(hù)技術(shù),如反調(diào)試、反 Hook 等。這里需要再反過來結(jié)合靜態(tài)分析手段去定位安全保護(hù)的入口和代碼。如果關(guān)鍵函數(shù)入口很難定位的話,可以定位程序入口進(jìn)行分析,從程序入口機(jī)型調(diào)試來定位關(guān)鍵信息。總之,攻擊流程就是結(jié)合上面所說的思路,利用一些安全工具或腳本來進(jìn)行綜合分析,最終完成對(duì)整個(gè)應(yīng)用程序的逆向破解。
常用混淆理論解析
接下來介紹一些常用的混淆理論,包括有哪些常用的混淆方法,混淆的方式和其對(duì)應(yīng)的效果。現(xiàn)代代碼混淆很多是以 Collberg 理論為基礎(chǔ)的,將代碼混淆分成布局混淆、數(shù)據(jù)混淆、控制流混淆和預(yù)防混淆四大類,如圖 3 所示。
圖 3
下文將繼續(xù)介紹每種混淆的作用原理。
布局混淆有兩個(gè)核心點(diǎn):標(biāo)識(shí)符重命名和刪除信息。所謂標(biāo)識(shí)符重命名,舉例來說,就是把有意義的函數(shù)名改成無意義的函數(shù)名,隱藏函數(shù)名所傳達(dá)的信息。雖然它沒有本質(zhì)上起到什么效果,因?yàn)檫壿嫑]有變,但是,這減少了信息量,可以提高攻擊者分析的門檻。第二個(gè)是刪除信息,它包括一些調(diào)試信息、日志信息以及格式化信息等等。
標(biāo)識(shí)符重命名有幾種方式,第一種是標(biāo)識(shí)符交換,把從 B 庫里面提取的符號(hào)信息,用在 A 庫里面的函數(shù)名,比如,把一個(gè)加密函數(shù)叫做解密函數(shù)。第二種是哈希命名,直接把函數(shù)變成哈希后的結(jié)果。第三個(gè)是混淆字典,這是指自己生成的一堆混淆信息,比如將 0、O 放在一起,還有 1、L 放在一起,結(jié)合起來進(jìn)行函數(shù)命名,會(huì)讓攻擊者比較難以閱讀。
第二類是數(shù)據(jù)混淆,是針對(duì)應(yīng)用程序里面的常量進(jìn)行混淆,比如字符串、整型或符點(diǎn)數(shù)等。混淆方法包括編碼變換、變量升級(jí)、拆分、數(shù)據(jù)變成函數(shù)、合并標(biāo)量變量等。圖 4 是數(shù)據(jù)混淆的一些例子。
圖 4
控制流混淆是一種最核心的混淆方式,包括不透明謂詞、執(zhí)行混淆、聚合變換等。其中,不透明謂詞是控制流混淆的核心。舉例來說,有一個(gè)函數(shù),它可能執(zhí)行到 if 分支,也有可能執(zhí)行到 else 分支。但是,我們可以通過某種變換讓它一定走到 if 分支,而不走 else 分支。執(zhí)行混淆包括虛假代碼塊、控制流扁平化、指令替換、控制流切割、VMProtect、代碼并行化等。
第四類是預(yù)防混淆,顧名思義就是知道要逆向這個(gè)程序必須使用某個(gè)軟件,我們可以針對(duì)這個(gè)軟件做一些事情,比如針對(duì)反編譯器插入花指令去破壞掉反編譯器等等。
最后,介紹下基于 LLVM 編譯器所實(shí)現(xiàn)的整體保護(hù)方案,因?yàn)?LLVM 的 logo 是一條龍,因此對(duì)于 LLVM 的攻堅(jiān)稱之為與龍共舞,我們?cè)?LLVM 的基礎(chǔ)上實(shí)現(xiàn)了深度開發(fā)。LLVM 框架的整體架構(gòu)如圖 5 所示,分為前端、IR 和后端,整體與標(biāo)準(zhǔn)編譯原理流程完全相同。前端主要有預(yù)編譯、詞法分析、語法分析等流程最后生成中間向量 IR,IR 層可以進(jìn)行各種各樣的優(yōu)化。這里所說的代碼混淆主要是在 IR 層機(jī)型實(shí)現(xiàn)的。IR 除了可以進(jìn)行代碼混淆之外,本身也是可以解釋執(zhí)行和基于 JIT 執(zhí)行的。同時(shí),也可以通過 inline 匯編等方式在 IR 中插入一系列的花指令。后端包括指令選擇、有向無環(huán)圖、指令調(diào)度、MachineIR 等,最終通過鏈接生成后端各種各樣的架構(gòu)文件。LLVM 對(duì)安全是非常有幫助的,首先可以在前端 AST 解析這里做一些安全檢查,IR 可以做跨平臺(tái)的代碼混淆器,甚至可以在后端實(shí)現(xiàn)一套自己的指令集,結(jié)合自實(shí)現(xiàn)的編譯器和解釋器完成一個(gè)比較健壯的虛擬機(jī)保護(hù)方案。
圖 5
本文所講的混淆主要是針對(duì) IR 層實(shí)現(xiàn)的。它有一個(gè)好處,基本支持前端所有的語言,同時(shí),混淆代碼也基本支持后端所有的平臺(tái),實(shí)現(xiàn)一次代碼就可以對(duì)幾乎所有平臺(tái)后端進(jìn)行保護(hù)。同時(shí),它是一個(gè)基于編譯時(shí)的方案,所以具有很高的穩(wěn)定性。LLVM IR 是基于寄存器的 SSA 格式的強(qiáng)類型指令集,它本身是為代碼優(yōu)化而設(shè)計(jì)的。LLVM 的應(yīng)用非常廣泛,包括安全漏洞分析、安全保護(hù)、任意函數(shù)插樁、任意代碼替換、自動(dòng)化測試、自動(dòng)化分析等,很多自動(dòng)化測試工具、安全工具等基本上都可以利用該框架來進(jìn)行實(shí)現(xiàn)。LLVM Pass 主要對(duì) IR 來進(jìn)行操作,其結(jié)構(gòu)如圖 6 所示。
圖 6
實(shí)現(xiàn)的代碼保護(hù)方案中,控制流扁平化、虛假控制流和指令替換,都借鑒了 Obfuscator-LLVM 項(xiàng)目。O-LLLVM 是基于編譯器的代碼保護(hù)方案的鼻祖,它提供了很好的思路供后續(xù)的開發(fā)者參考,但是它所開放的功能是及其有限的,并且部分實(shí)現(xiàn)方案存在一些弱點(diǎn)和 bug。因此,我們?cè)谄浠A(chǔ)上進(jìn)行了深度的定制和開發(fā),結(jié)合混淆理論實(shí)現(xiàn)了更強(qiáng)的代碼保護(hù)技術(shù)。
分享中詳細(xì)闡述了字符串混淆、導(dǎo)入表隱藏、反調(diào)試、反篡改等基于 IR 實(shí)現(xiàn)的代碼保護(hù)的原理和思路。
圖 7
上圖是實(shí)現(xiàn)的一些代碼保護(hù)效果的例子。通過函數(shù)控制流圖可以看到整體的控制流已經(jīng)非常復(fù)雜了,很多攻擊者到這里已經(jīng)望而卻步了。除此之外,結(jié)合控制流分割、花指令等技術(shù)會(huì)直接破壞了反編譯器的反編譯效果等等。
綜上所述,結(jié)合 LLVM 框架可以實(shí)現(xiàn)高強(qiáng)度的代碼混淆與保護(hù),進(jìn)而助力風(fēng)控系統(tǒng),有效提升整體業(yè)務(wù)安全的強(qiáng)度。
-
代碼
+關(guān)注
關(guān)注
30文章
4799瀏覽量
68728 -
編譯器
+關(guān)注
關(guān)注
1文章
1635瀏覽量
49171 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8424瀏覽量
132761
原文標(biāo)題:別動(dòng)我的代碼!聊聊那些代碼保護(hù)的藝術(shù)
文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論