APP端上通用安全体系建设
背景:APP端上安全在談什么
APP的每個業務場景都有其既定的運行模式,若被人為破壞就可認為是不安全的。舉個栗子,比如秒殺場景:大量用戶在特定時間點,通過點擊搶購來秒殺優惠商品,從而營造一種緊迫而有噱頭的營銷場景,但如果能通過非法手段自動搶購、甚至提前開始刷接口搶購,那就徹底破壞了業務的玩法,這就是一種不安全的運行模式。再比如常用的用戶拉新場景:新客獲取成本高達200左右,所有產品的拉新投入都蠻高,如何獲得真正的新用戶而不是羊毛黨也是拉新必須處理的事,一般而言,新設備+新賬戶是新用戶的基本條件,但新賬戶的成本其實不高,大部分是要靠新設備來識別的,但如果能通過非法手段不斷模擬新設備,那拉新投入獲取的可能大部分都是無效的羊毛黨,這也可看做是一種不安全的運行場景,甚至還有二次篡改,構建馬甲APP等各種場景。而APP端上安全要做的就是甄別并防范這種異常場景的發生,簡而言之它就是:一種確保官方APP在既定業務模型中運行的能力。
APP端上安全體系應該具備哪些能力
一個安全體系要具備哪些能力呢,簡單說可分兩塊:甄別與防御。即一:甄別運行環境是否安全的能力,二:針對不同的場景作出不同的防御的能力,場景千變萬化,所以防御手段也沒有一劍破萬法的能力,基本都要根據具體的風險場景,產出不同的應對方案,但是整體涉及的流程基本一致,如下:
要做的事情就是圍繞四個階段構建不同的能力。先看第一階段:風險場景的假設,預判有哪些風險場景,從AppStore或者官方應用市場下載,安裝、正常使用,這是理想中的運行模式,但不安分的用戶千千萬,異常場景也多變,不存在一劍破萬法的說法,這里人為做了一些場景歸類:
從實踐來看,安全模型必須覆蓋的場景包含上述四類,即
一: 運行的APP非官方應用
這種情況一般是非法用戶為了謀求特定的權益,對原裝APP進行魔改二次打包后發布,這對于一些廣告類、離線付費類APP是一種毀滅性的打擊,最常見的就是一些APP會在閃屏頁面投放廣告,從而獲取收益,但一旦這個業務邏輯被篡改繞過,那么廣告收益直接歸零;還有些情況APP被碰瓷,魔改一些功能,跳轉到非官方設定的網站,比如在比較火的APP添加劫持邏輯,跳轉到一些黃賭網站,這給官方APP帶來的負面影響是難易估量的,如果不能自證清白,甚至還會面臨法律上的追責。
二:業務的運轉模型被篡改
簡單的講就是沒有按照產品的既定玩法進行,就像文章開頭的秒殺場景【電商平臺的茅臺搶購】,如果能通過API直接組單,那APP里點擊的那批用戶無論如何也搶不過插件;再比如有些簽到的場景是為了促活,如果通過自動簽到工具自動打卡,那促活的目的也無法達到,這也是要重點防控的一個場景。
三:運行的設備非目標設備
這種場景主要影響一些拉新、優惠權益等,甚至直接影響整體運營策略,簡單舉個例子,拉新場景中會投放大量的新人免單、直減券,基本等于免費領取權益,比如我們都經歷過的打車軟件、外賣軟件、新電商產品上線等。全國有無數的專業羊毛黨專注于這一場景,他們掌握大量手機號,可以注冊大量新賬號,同時能通過虛擬機、應用多開、復刻設備等手段無限冒充新設備,如果不加反制,優惠策略一上線,各種券基本全被這批人掠奪,被這種手段折磨致死的產品數不勝數,也幾乎是每個電商平臺的噩夢。
四:一些核心邏輯的泄漏
這不是端上特有的風險,比如代碼泄漏這種,各方都有這種風險,只不過端上風險更高,因為APP是要上架發出去的,雖然經歷過各種混淆與保護,但是用戶最終還是能拿到可執行的APP包的,里面各種的核心的邏輯、秘鑰都有潛在泄漏的風險,一旦泄漏,也是一種毀滅性的打擊,比如某些音視頻軟件特有濾鏡、轉場、特效,這些算法是一個產品的核心,一旦破解,產品優勢不再,如果防止邏輯代碼的泄漏與破解也是安全必須關注的點。
覆蓋上述場景的意思是要提供甄別的能力,針對不同的場景,抽象特征值并搜集上報,建立特定的模型,推導C端操作環境是否安全,之后上線不同的應對策略:比如直接退出應用、標記為風險用戶等。
建設方案
甄別與防御是體系的核心,建設方案主要是圍繞這兩個主題展開,雖說名稱是“端上安全體系”,但只依靠端自己是無法解決所有問題的,也無法將價值發揮到最大,仍需多端系統配合來完成整個體系的搭建,分工的基本原則是:端上側重特征信息的搜集,云端負責整體策略的執行,根據上述場景,搭建示意如下:
按層次跟功能大致分四塊,端、網關、業務后臺、數據風控中心:
- 端是信息的來源,負責信息采集上報,是安全體系建設的基石,所以端上采集信息的真實性、為完整性至關重要,同時端上也可以執行部分風險低,但收益高的攔截略,比如對于一些已經偵測到的馬甲包,在上報用戶信息之后,可以選擇Crash,對于一些機器點擊類的簽到、秒殺場景,可以主動攔截請求,降低帶寬壓力。
- 網關是第二層,一般處理一些具體規則類的攔截與信息采集,比如有些簡單的規則檢驗,Header里是否攜帶必備的校驗字段,如多開標識、模擬器標志等,如果攜帶則可以在這一層直接攔截,并沉淀到數據中心,既保證了信息的采集,又能減輕業務后臺的壓力,尤其對于一些秒殺類的場景非常有效。
- 業務后臺跟數據平臺可以一起看做第三層,負責更復雜的模型建設跟業務落地,比如在什么樣的節點,才有什么樣的策略,比如在組單的時候,業務后臺可根據風控側的判斷決定用戶的優惠力度等
針對各個具體的場景會有具體的建設方案,
如何應對非官方APP:APP包識別
非法人員總是出于自己的權益來破解官方APP,定制一些邏輯再二次打包發布,比如對一些付費類APP,含廣告類工具APP等,通過破解代碼,并二次打包后就可以官方造成沖擊,甚至是毀滅性的打擊,對于這種場景如何甄別,又如何處理呢?拿Android為例,檢測手段有簽名校驗、文件校驗、包完整性校驗等,一旦檢測到風險就可以做出響應處理,在處理方式上也需要根據不同產品不同場景隨機變動,比如工具類APP就Crash阻斷,而對于一些有用戶體系類的APP則可以先回傳用戶信息,用作用戶畫像,再做響應的處理,而處理的手段也可以根據風險等級的不同再做定制,甄別的技術手段可能是死的,但獲取的收益一定要靈活。
如何應對非理想設備:設備識別與設備指紋
非理想設備最經典的就是文章開頭的場景,拉新拉來一堆老羊毛黨,說到底其實就是對于用戶設備的定位追蹤能力不足,對于這種場景的如何應對?這里單獨說說設備指紋,設備指紋主要解決的如何定位一臺設備的問題,在理想情況下,一臺設備只有一個身份信息,它不因APP卸載、升級、HOOK偽裝所改變,這在現在的互聯產品生態中是非常困難的,困難主要來源于兩個方面:一技術上的、一是法規上的,從技術上來講,以Android端為例,它是一個開源的系統,每一行代碼都不可信,任何通過官方API拿到的信息都可以被HOOK篡改,而指紋很大程度依賴API獲得的設備特征信息,如果這些信息都不可信,那指紋的可信程度也會降低。另一方面,從法規上來講,現在注重保護個人隱私,不可以隨意獲取用戶信息,這一點有利于用戶【包括羊毛黨】,但是對于運營方卻是不利的,信息越少越難定位到,因此,在隱私合規的前提下,仍需要多維度的獲取更多的用戶信息,從更多的維度定位到該用戶。
具體如何執行?以Android為例,定位一臺設備的信息有MAC、IMEI、IMSI、序列號、AndroidID、IP+UA、OAID、各種設備型號等,雖然信息很多,但單獨任何一條的可信度都不高,比如之前的某盾、某盟都曾用MAC地址作為指紋,甚至有些產品直接用IMEI作為指紋,但網上利用XPOSED來篡改的插件比比皆是,通過官方API獲取的分分鐘被破解,但是可以對多種信息進行整合生成一個唯一可信的ID,這種方式獲取的ID的穩定性要比單一的穩定性要高,原理示意如下:
簡單來說:只有篡改了全部的設備特征信息,才會導致設備指紋更新,這會大幅提高設備逃逸的難度。設備指紋的另一個難題是如何識別虛擬設備,這里特指模擬器,每個新開的模擬器都可以看做是新設備,如果不能識別,同樣無法解決設備跟蹤的問題,尤其對于國內的Android生態來講,問題更加嚴重,各種游戲廠商都有對應的手游模擬器,不僅支持多開,還原生支持篡改各種設備特征信息,可以算得上助紂為虐,在模擬器甄別與防控的層面能做的有如下幾種:
- 通過特征信息甄別【容易繞過】
- 通過CPU架構甄別【ARM與SimpleX86】
- 限定APP的運行平臺
這里簡單介紹下通過CPU架構甄別方式,就目前的硬件市場,幾乎99.9%以上的手機設備都是基于ARM處理,而模擬器大部分是面向x86平臺設計的,采用的是simplex86架構,兩者采用的不一樣緩存機制,ARM采用的哈弗架構將指令存儲跟數據存儲分開,分為I-Cache(指令緩存)與D-Cahce(數據緩存),CPU無法直接修改I-Cache【同步延遲導致不一致】,但Simpled X86架構的模擬器只有一塊緩存,這一點導致兩者在運行Self-Modifying Code【自修改代碼】時會有不同的表現,可以借助這個特性進行甄別,示意如下
至此,設備的定位與跟蹤能力基本已經具備,在用戶在領券的節點,就可以從更多維度判斷他當前的設備是否有資格享受這個權益,保障業務按既定模型運轉。
當然還有更多的場景,比如應用多開、應用分身等,都要具體問題具體分析,但思路一致:特征搜集、甄別、防控,因為所有的不軌行為一定有跡可循,
如何應對非設定業務場景:場景識別與校驗
每種業務都有其既定的運行模式,只有照章辦事,運營才能獲取最大的收益,這里特指一些可以通過自己的參與獲得收益的場景,比如秒殺、簽到、預約搖號等。一般而言,在這類場景下,破壞者可鉆的空子有兩個方向,一個是便利:通過插件自動預約,免得用戶自己操作,適合搖號、簽到類【簽到領積分】;一個是速度,通過插件直接API請求,搶跑下單,獲得收益,適合限時秒殺類的場景【各大平臺強茅臺】。以秒殺為例,通過營造緊迫而又刺激的氛圍可以讓活動更有意思,但如果能直接刷接口/或者通過插件搶跑,那就會破壞其公平性,影響用戶的參與感,造成資產及口碑受損,這類場景如何應對?其實要做的事情分兩塊:一 識別請求是從APP發出來 , 二 識別是真實用戶操作的,這兩快一般會整體考慮,非APP端的請求往往伴隨著非用戶觸發,多歸結于腳本,所以識別“人”與識別“場景”殊途同歸,具體有哪些手段可以用呢?
- 擴展核心API接口的能力,承載更多邏輯
- 通過埋點、用戶操作軌跡分析識別用戶
- 啟用端上特有能力校驗,如短信驗證碼、行程碼分析
如何拓展API接口的能力?比如預約接口其基礎能力就是預約,如不特殊處理,PC上就完全可以復制APP端發出的請求,進而通過腳本預約,如要加以限制就必須拓展端上API能力,讓其攜帶更多端上獨有特征,同時服務端可以完成校驗,形成一個閉環,比較容易理解的就是讓APP端與服務端協商一套加解密通信協議,并假定協議無法破解,避免接口直刷,從而確保請求是從APP發出的,即使不是從APP發出的,也能被甄別出來,進而提高APP與服務端通信階段的安全性。當然,無法破解只是理論上,實際上只要舍得投入成本,暴力破解并不是問題,這種就需要通過更多元的手段,不斷更新迭代,持續做攻防,例如,為了保證加密算法的保密性,可以將其用c實現,并通混淆、加固、防探測等手段保證這個策略的正確執行;暴力堆積加密的類型、節點,提升秘鑰的更新頻率也是一種應對手段,而且,懲罰手段上也可以多元,同直接攔截相比,隱秘的搜捕,誘捕也是一種靈活收益的手段。
其次,基于埋點、用戶操作行為的大數據分析是另一種更高級的防御手段,對于識別用戶操作場景更加科學,正常的用戶軌跡與插件類的訪問軌跡會有很大的差異,直刷的目標明確,主攻幾個關鍵接口,但正常用戶訪問會有一系列的曝光、點擊等行為,并且每次的點擊也會有各種零零散散的活體特征可以采集,比如點擊的點位置、數量、力度、頻率等,這些維度為用戶識別提供了更廣的操作空間?;谝陨蠋c的模型示意如下:
最后一點,啟用端上特有的校驗能力,這個已經是最終的防御手段,在實在沒有辦法的情況才會采用的,因為這種手段很影響用戶體驗,由于采用的是端上特有的能力,比如短信驗證碼,必須真機才能收到,這就從根本上避免了插件類的直刷,所以可靠性確實所有手段中最高的,但體驗差,成本高,所以算是最后一道防線。
如何應對核心邏輯的泄漏
這一塊主要關注的是APP端的一些核心邏輯的破解或泄密,可以分兩個方向,對外與對內,對外主要是APP包的逆向與破解,不法人員從發布上架的APP包中獲取核心業務實現或其他敏感信息;而對內主要指工程安全,核心源碼或秘鑰的泄漏、誤改等。
相應的防范策略也是分兩塊,對外的線上防破解可以從以下幾點入手:
- 利用代碼混淆防APP逆向,一般而言官方會提供相應的能力,也可借助三方加固來提高混淆的力度
- 核心源碼、秘鑰下沉,采用更難破解的方式實現,同時增加防外部調用的防范策略,比如Android采用C+混淆來處理
- 為線上APP添加防調試與HOOK的能力,防止動態調試探測,
- 添加防止代理與中間人劫持的能力,例如SSLPING等技術,避免被抓包探測
- 從二次打包入手,添加簽名、完整性檢測的能力,防止被探測、篡改
而對內主要從工程安全角度推進,主要是做好代碼的權責管理
- 采用組件化開發模式,不同等級的基礎能力、業務、核心邏輯做好隔離
- 倉庫單獨部署,同時做好權責劃分,代碼、文檔做好權限隔離
- 加強秘鑰、KEY的管控,開發與生產環境嚴格隔離
上述手段基本涵蓋大部可預見的風險場景,即使未覆蓋,也大概有類似的手段作為參考,無非就是抽象、搜集、判斷、處理。
線上執行方案
最后一步是上線執行,上述的手段多種多樣,但相互之間并非孤立運行,彼此可以相互穿插,靈活配合,不存在特定的章法,全看使用方的意圖,如何探測,探測之后如何處理,是全殺還是放一部分,都看操刀者自己的運作,以應用多開場景為例,除了利用多開基礎的多開檢測手段,還可以配合設備指紋做更多的事情,有時雖然沒有檢測到多開,但是基于設備指紋的補刀,也能定位到問題設備,而在最后一步懲治處理中,不同處理手段也會獲得不一樣的收益:
| 被動攔截 | 端上部署檢測規則,檢測到風險,100%在端上攔截處理【如Crash】 | 效果明顯,但易被發現,徒增防御成本 |
| 被動捕獲 | 檢測到風險,在端上不處理,只上報,后端隱形標記或攔截 | 不易被發現,但長期運行收益比較局限 |
| 主動誘捕 | 人為制造有跡可循的漏洞,捕獲后在端上不攔截或部分攔截,并上報,后端隱形標記 | 不易被發現,虛虛實實,操作空間更大,收益更大 |
理論上講,APP技術層面不存在100%有效的安防策略,虛虛實實才是王道,敬畏,才是最有效的防御手段
總結與展望
目前國內APP的生態環境并不健康,甚至可以說野蠻,隨著隱私策略收緊,APP所能獲取的信息越來越少,安防也越來越難做,反之,刷子卻越活越滋潤,技術所面臨的的挑戰也更加棘手,安防注定是一個長期攻防的領域。最后,技術不能解決所有問題,最終還是要依賴法律的健全與全民意識提升。
總結
以上是生活随笔為你收集整理的APP端上通用安全体系建设的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解tcpip读书笔记
- 下一篇: 工作406- Error:Node Sa