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