別動我的代碼!聊聊那些代碼保護的藝術

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

別動我的代碼!聊聊那些代碼保護的藝術 生活 第1張

作者 | 祁麟

編輯 | 小智

本文內容來自祁麟在 QCon 分享的主題《代碼保護之道——混淆的藝術》,主要涉及黑產現狀、通用防禦架構、攻擊流程和混淆理論。

黑產現狀、盈利手段

黑產的現狀及常用的盈利手段是什麼?這裡給出三個數字:第一個數字是 150 萬,這是 2017 年網路安全生態峰會上評估出的黑產從業人員的人數。跟這個人數相比,目前業界頂尖公司中安全從業人員最多不過千餘人,與黑產對比可謂鳳毛麟角。第二個數字是千億,這是網路安全生態峰會上評估的黑產年產值。根據 2017 年的騰訊阿里兩家巨頭的財報,兩家公司淨利潤總和接近千億元,黑產的年產值基本可以與這兩家巨頭公司並駕齊驅。第三個是 20%,這是根據我們之前經驗評估的行銷活動的資損率。舉例來說比如要做一個新註冊的拉新活動,投了 100 萬去吸引用戶,最後會發現至少有 20 萬會進入到黑產的口袋裡。

簡單列舉兩個黑產的盈利場景。第一種是撞庫,就是把其他平台泄露的一些用戶名和密碼,不停地拿到另外一些平台上去試,如果登錄成功之後首先會竊取帳號內的資產信息,之後會使用竊取的帳號去做一些薅羊毛等相關的事情。第二種是垃圾註冊,黑產要盈利必須要有海量的帳號,黑產會註冊成千上萬個小號來為後續的活動進行準備,這是萬惡之源。但是實際上批量帳號註冊是成本非常高的事情,需要海量的手機號碼、手機設備等等。工欲善其事必先利其器,黑產也深知這個道理。為了以最小的成本獲取最大的收益,外掛應運而生。外掛具有批量化、虛擬化、自動化的能力,可以最大程度來滿足黑產的需求。

為了抵禦黑產,各家公司都會有自己專門的風控團隊,使用各種各樣的技術手段去進行對抗。這裡介紹一個比較通用的架構(參見圖 1)。首先客戶端會把采集到的數據加密後 (包括安全簽名等) 通過業務 API 接口請求傳安全網關,網關這裡會有一些實時的策略引擎來進行風控,包括但不限於 IP 策略、環境設備、帳號屬性、行為序列以及一些 AI 機器學習模型等等。風控結果會發送到後端的二次驗證系統,如果發現前端的請求是非法的,就直接阻斷請求或者彈出驗證碼等等。如果沒有問題,就會真正交給業務系統,然後由業務系統來做一些相關的處理。同時,各家也會有對應的離線策略引擎,它會通過旁路數據進行無監督聚類甚可能有監督的機器學習等等,生成更多的模型,輔助後端的風控。

別動我的代碼!聊聊那些代碼保護的藝術 生活 第2張

圖 1

接下來重點介紹客戶端保護相關的工作。整個風控系統是一個非常龐大的鏈路,僅就客戶端而言也是一個非常複雜的體系,這裡包括具體采集什麼樣的風控數據、如何保證采集數據的安全性和對抗的實時性等等。在移動時代,PC 時代的 WEB 的業務幾乎全部都落地到了客戶端,如果客戶端的風控沒有做好,無異於門戶大開,直接給黑產提供了攻擊的入口。這裡介紹了基於客戶端進行風控的例子,我們可以看到攻擊曲線完全降低到了冰點,實際上這裡並沒有使用多麼複雜的機器學習方法,而僅僅是基於客戶端本身的混淆邏輯來做到了業務保護達到的結果。

防禦方法論

第一點是天下武功唯快不破。攻防的本質實際上是成本和收益的對抗。良好的代碼混淆會大大提高破解所需的時間和門檻,只要保證核心代碼的更新速度快於攻擊者破解的速度,就可以做到很好的保護效果。

第二點是重劍無峰,大巧不工。攻防的核心是基於可信數據的對抗,誰對系統的底層理解得更加深入,誰就在整個攻防裡面掌握了主動權。同樣,良好的代碼混淆可以保證你的數據采集邏輯不被攻擊者所知悉,這可以大大提高後端風控數據的準確性和安全性。

第三點是藏葉於林。安全是業務的天然屬性,業務是安全的最佳載體。只有結合了業務的安全才是真正的安全,孤立的安全是很容易被攻擊者攻破的。將業務代碼和安全代碼放在一起進行混淆,攻擊者要破解的話,不但要摸清安全邏輯,還要了解清楚整個業務邏輯。同時,業務上的風吹草動也會為安全起到非常好的預警作用。

黑客攻擊流程

在介紹完防禦方法論之後,具體介紹代碼混淆之前,介紹下黑客的攻擊流程(參見圖 2)。

別動我的代碼!聊聊那些代碼保護的藝術 生活 第3張

圖 2

攻擊的第一步是尋找入口,一般有兩種方式:靜態分析和動態分析。靜態分析就是首先查看.so、.elf 等文件,查看其導出表。如果找不到,就看字符串表,在字符串裡找信息,找到之後也可以定位到對應的位置。如果字符串表再沒有,就看導入表,因為導入表裡面可能會引入 MD5 等一些簽名算法的值,如果導入表也沒有,就得看代碼邏輯了。舉例來說,AES 算法有一個 S 盒,可以直接在源碼中找 S 盒的特徵,然後就知道這是 AES 算法,這是一個很好的線索,可以順著該線索進而去摸清整體的邏輯。如果這些方法都行不通,還有符號執行等技術可以用來輔助分析。

動態分析首先可以利用常用的 trace 工具,如 ltrace、strace 等來分析函數的調用流,對整體流程大致有了一個了解之後需要定位到關鍵函數的入口,定位到關鍵入口之後需要結合動態調試技術,通過 GDB、LLDB 等工具利用單步調試等一些調試方法去獲取信息。除此之外還有一個利器是 Hook,結合 Hook 技術將關鍵參數信息列印出來。同時,一些應用會採用有些客戶端保護技術,如反調試、反 Hook 等。這裡需要再反過來結合靜態分析手段去定位安全保護的入口和代碼。如果關鍵函數入口很難定位的話,可以定位程序入口進行分析,從程序入口機型調試來定位關鍵信息。總之,攻擊流程就是結合上面所說的思路,利用一些安全工具或腳本來進行綜合分析,最終完成對整個應用程序的逆向破解。

常用混淆理論解析

接下來介紹一些常用的混淆理論,包括有哪些常用的混淆方法,混淆的方式和其對應的效果。現代代碼混淆很多是以 Collberg 理論為基礎的,將代碼混淆分成布局混淆、數據混淆、控制流混淆和預防混淆四大類,如圖 3 所示。

別動我的代碼!聊聊那些代碼保護的藝術 生活 第4張

圖 3

下文將繼續介紹每種混淆的作用原理。

布局混淆有兩個核心點:標識符重命名和刪除信息。所謂標識符重命名,舉例來說,就是把有意義的函數名改成無意義的函數名,隱藏函數名所傳達的信息。雖然它沒有本質上起到什麼效果,因為邏輯沒有變,但是,這減少了信息量,可以提高攻擊者分析的門檻。第二個是刪除信息,它包括一些調試信息、日志信息以及格式化信息等等。

標識符重命名有幾種方式,第一種是標識符交換,把從 B 庫裡面提取的符號信息,用在 A 庫裡面的函數名,比如,把一個加密函數叫做解密函數。第二種是哈希命名,直接把函數變成哈希後的結果。第三個是混淆字典,這是指自己生成的一堆混淆信息,比如將 0、O 放在一起,還有 1、L 放在一起,結合起來進行函數命名,會讓攻擊者比較難以閱讀。

第二類是數據混淆,是針對應用程序裡面的常量進行混淆,比如字符串、整型或符點數等。混淆方法包括編碼變換、變量升級、拆分、數據變成函數、合併標量變量等。圖 4 是數據混淆的一些例子。

別動我的代碼!聊聊那些代碼保護的藝術 生活 第5張

圖 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 可以做跨平台的代碼混淆器,甚至可以在後端做到一套自己的指令集,結合自做到的編譯器和解釋器完成一個比較健壯的虛擬機保護方案。

別動我的代碼!聊聊那些代碼保護的藝術 生活 第6張

圖 5

本文所講的混淆主要是針對 IR 層做到的。它有一個好處,基本支持前端所有的語言,同時,混淆代碼也基本支持後端所有的平台,做到一次代碼就可以對幾乎所有平台後端進行保護。同時,它是一個基於編譯時的方案,所以具有很高的穩定性。LLVM IR 是基於寄存器的 SSA 格式的強類型指令集,它本身是為代碼優化而設計的。LLVM 的應用非常廣泛,包括安全漏洞分析、安全保護、任意函數插樁、任意代碼替換、自動化測試、自動化分析等,很多自動化測試工具、安全工具等基本上都可以利用該框架來進行做到。LLVM Pass 主要對 IR 來進行操作,其結構如圖 6 所示。

別動我的代碼!聊聊那些代碼保護的藝術 生活 第7張

圖 6

做到的代碼保護方案中,控制流扁平化、虛假控制流和指令替換,都借鑒了 Obfuscator-LLVM 項目。O-LLLVM 是基於編譯器的代碼保護方案的鼻祖,它提供了很好的思路供後續的開發者參考,但是它所開放的功能是及其有限的,並且部分做到方案存在一些弱點和 bug。因此,我們在其基礎上進行了深度的定制和開發,結合混淆理論做到了更強的代碼保護技術。

分享中詳細闡述了字符串混淆、導入表隱藏、反調試、反篡改等基於 IR 做到的代碼保護的原理和思路。

別動我的代碼!聊聊那些代碼保護的藝術 生活 第8張

圖 7

上圖是做到的一些代碼保護效果的例子。通過函數控制流圖可以看到整體的控制流已經非常複雜了,很多攻擊者到這裡已經望而卻步了。除此之外,結合控制流分割、花指令等技術會直接破壞了反編譯器的反編譯效果等等。

綜上所述,結合 LLVM 框架可以做到高強度的代碼混淆與保護,進而助力風控系統,有效提升整體業務安全的強度。

作者介紹

祁麟,現就職於騰訊,任客戶端高級開發工程師。2012 年加入阿里巴巴,主導並建設了阿里移動安全 SDL 標準化、自動化、流程化的安全體系,參與了阿里無線安全從 0 到 1 的全過程,並作為「阿里聚安全」的項目經理參與了阿里核心無線安全產品建設和出海全過程。2016 年加入美團負責美團移動安全防控體系的建設與團隊建設。

以上就是祁麟老師在 QCon 上海 2018 的精彩分享,更多安全風控相關實踐探索請持續關注新一屆的 QCon 大會。

QCon 北京 2019 現已全新起航,除了一些常規的專題設置外,新增了用戶增長、智慧零售等當下熱點話題,在技術深度和廣度上不斷延展。目前大會 7 折報名中,立減 2640 元。了解 QCon 十周年的精心策劃。

議題講師持續邀約中,如果你有好的話題並樂於與他人分享,歡迎點擊「 閱讀原文 」提交議題。

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!