Qunar風控安全產品的探索之路
李建威。2017年7月以春招實習生的身份加入去哪兒網,畢業後一直在從事抓取與反抓取相關工作,先後負責搭建過智慧打碼、設備指紋以及環境檢測等服務。目前主要負責反爬風控的基礎安全產品建設。對各類作弊原理感興趣。
0x01-前言
本文主要介紹反爬風控相關基礎安全產品演變過程中的思考。
文章以總-分的形式講述,主要分為三部分:(1)產品演變;(2)環境檢測;(3)檢測分析。
希望其中一些思考能夠給大家帶來啟發。
懂的不多,做的太少。歡迎批評、指正。
0x02-基礎安全產品
產品演變
一、問題
在19年之前Qunar的反爬蟲、反作弊等場景是業務線各自為戰。作為機票反爬最早期的參與者之一,在負責機票App反爬期間就有一個問題一直在困擾我,我的工作一直在不斷、重複地編寫識別策略,工作量的多少完全取決於爬蟲量的多少,防禦完全陷入被動局面。是否有辦法從根本上解決這類重複性勞動問題。
二、例子
舉個例子。下圖中藍色(CRITICAL)代表已識別為疑似用戶。黃色(ATTACK)代表已識別為異常用戶。
每一次藍黃交替,就代表一次攻防對抗,就意味著需要進行一次策略的調整。策略例子:
(1)發現某個參數拼寫錯誤;
(2)發現某個設備資訊缺失;
(3)發現某個帳號對應的IP數量過多。
類似的一次策略調整就需要投入0.5-1pd的人力進行程式碼編寫、發布和驗證。
三、思考
重複性勞動註定會使團隊陷入被動忙碌且無積累的狀態,如何破解這一局面?
比較幸運的是,我在剛畢業的第一年在負責智慧打碼平台時有研究過幾大安全廠商的三代驗證碼,在此過程中使我具備了一定的逆向技能,讓我在解決這一問題上有些新的想法和思路。
1、現象看本質
以上例子舉例:
我們的問題是發現某個參數拼寫錯誤,現象是拼寫錯誤,但其實我們本質最應該關注的問題是為什麼參數會被篡改和通過什麼方式進行篡改的。
解決方法:
(1)方法一:解決現象問題。寫判斷策略識別拼寫錯誤的異常請求。這種解決方案只能夠解決單次問題,下次同類型問題出現還是得通過編寫類似策略來解決。
(2)方法二:解決本質問題。弄清楚為什麼會被篡改,用什麼方式進行篡改的。進行針對性的檢測就可以一次性解決類似問題。
2、提升作弊門檻
如同社會金字塔結構,作弊人群金字塔也一樣,原理、工具的創造者是少數。如果能夠從作弊工具和作弊原理層面去識別作弊者,就可以提升作弊門檻,從根本上解決重複且被動防禦的問題。
四、解決
從上述思考的兩點出發,「本質」其實就是將問題特徵梳理出來,「作弊門檻」的提升方式就是找到問題背後的原理。
以反爬場景為例
我大概將爬蟲特徵分為四類。
1、問題特徵分類一
(1)具有一定規模的數據才有價值;
(2)抓取設備出於成本考慮,需要控制設備數量。
結合以上特徵點,我們需要解決的問題是:如何標記真實的設備。
2、問題特徵分類二
(1)防護程式碼會被分析;
(2)安全數據會被篡改。
結合以上特徵點,我們需要解決的問題是:如何保證數據的真實性。
3、問題特徵分類三
(1)機器自動化抓取;
(2)攔截數據與模擬請求。
結合以上特徵點,我們需要解決的問題是:如何更高效準確地識別異常設備環境。
4、問題特徵分類四
(1)容器外模擬請求。
結合以上特徵點,我們需要解決的問題是:如何識別脫離容器請求。
最後我們將需要解決的問題去孵化安全產品,通過安全產品的方式識別某一類型作弊者,這樣即使出現了新的「現象」,我們也能通過最「本質」的原理將他們識別出來。
環境檢測
因為這中間涉及到的點非常多,篇幅有限,我覺得可以拿比較有意思的安全產品中的環境檢測來詳細聊聊。
一、是什麼
基於應用當前運行環境,檢測設備是否存在作弊風險。
二、為什麼
原因有以下兩點:
(1)作弊機器一定會篡改應用運行環境;
(2)通過對作弊原理的檢測,能從根本上解決作弊問題,將被動防禦轉換為主動防禦。
三、怎麼做
我總結為以下三點:
(1)作弊原理分析;
(2)作弊特徵提取;
(3)特徵檢測服務化。
四、作弊原理分析
我把作弊分析分為兩部分。分別是作弊設備分析和作弊方式分析
1、作弊設備分析
通過作弊設備分析應用外部運行環境風險。
我把作弊設備大致分為三種:真機、模擬器以及雲手機。
真機-應用多開
通過修改應用名稱或運行於多開容器中,使得可以在同一台設備內同時運行多個相同的應用。(常見多開應用有VirtualApp、小米分身等)。
模擬器
通過軟體模擬移動設備硬體操作,使得App可以直接運⾏在PC上。(常見模擬器有騰訊模擬器、夜神模擬器等)
雲手機
通過ARM伺服器以及虛擬化技術,在雲端虛擬的原生手機實例。(常見有百度雲手機、紅手指雲手機等)
2、作弊方式分析
作弊方式分析應用內部被篡改的風險。我把作弊方式大致分為兩種:篡改和非篡改。
重打包
重打包是指將應用反編譯後,修改或添加程式碼後從新打包,將其安裝至設備上,應用運行時就會被載入。
HOOK
當程式在執行某段程式碼時,控制其執行惡意程式碼。這種篡改就被稱為HOOK。
自動化工具
基於Google/蘋果發布的自動化測試框架,進行一些列如點擊、滑動、鍵盤輸入等操作。
檢測分析
由於篇幅關係,不能對其中細節過多展開講。我選擇比較有意思的作弊方式中的動態篡改進行詳細分析。
一、介紹
無論是Android還是iOS端,不同分層的程式碼都有不同的HOOK框架及其對應的原理。
二、分析
框架和原理有很多,框架以Xposed為例,HOOK原理以Inline HOOK為例來進行分析。
1、框架檢測-Xposed
(1)要了解Xposed框架,需要先來學習下什麼是Zygote。
Init是內核啟動的第一個用戶進程,zygote是由init創建的進程。zygote所對應的具體可執行程式是app-process,所對應的源文件是app-main.cpp。所有的app進程都是由zygote進程fork出來的。
(2)接下來了解一下Xposed的初始化過程
(3)Xposed程式碼分析
疑問1:Xposed到底修改了什麼?
答案1:
a. Xposed為了在系統啟動時優先載入xposed模組和hook系統資源。會將原本的ZygoteInit類替換為XposedBridge類。
b. 函數執行順序的變化,就會在堆棧中體現出來。
疑問2:Xposed到底載入了什麼?
答案2:
a. 載入核心程式碼libxposed_art.so。
b. 其核心程式碼對應的特徵就必定會出現在運行記憶體中。
2、原理檢測-INLINE HOOK
(1)Android Inline Hook框架源碼
(2)Inline Hook原理分析
核心程式碼含義
1)LDR PC, [PC, 4] :將地址為PC + 4的連續4個位元組的數據讀入PC暫存器;
2)[PC, 4] :以PC暫存器為錨點,加上一個偏移量來標識絕對地址。(PC相對定址);
3)LDR PC, hook函數地址:將hook函數地址讀入PC暫存器中,實現函數跳轉;
4)指令偏移量變化原因:三級流水線取值與執行之間相差2條指令,所以偏移量需要調整。
彙編指令
ARM架構下CPU三級流水線:CPU運行被拆分為三個步驟分別為取址、轉義、執行,步驟可以近似理解為三個並行執行緒。取址與執行之間相差2條指令。例如:執行到0x00006004時,pc暫存器取值0x00006012。
(3)Inline Hook流程
了解原理之後,只需要在必經之路埋下檢測點就可以達到對作弊方式進行原理性檢測的目的。
3、服務化
通過場景分析問題,根據問題提出解決方案,根據方案孵化出目標安全產品。將孵化出的基礎安全產品提供給上游業務風控使用。由基礎安全產品提供專業能力,能夠降低業務安全參與人員的門檻,上游系統能夠更加聚焦於業務防護本身。
0x03-思考
(1)以攻促防。從業務安全場景出發,從作弊者角度思考問題,從數據、原理髮現解決問題。不斷進行攻防對抗,才能使研發人員和系統不斷成長。
(2)真人化。真人化的演變過程是從協議破解到模擬器,再到真機,目前正在朝真人眾包方向發展。如何定義與識別真實用戶和作弊者是新的難題。
0x04-結尾
軟體工程沒有銀彈,逆向工程永遠勝利。
懂的不多,做的太少。歡迎批評、指正。