背景
隨著移動網際網路的迅猛發展,各種App層出不窮的同時,也催生了大量的提供專業技術服務的2B廠商,這些廠商提供專業的SDK封裝了複雜的邏輯實現原理與細節,服務基本涵蓋了IM、地圖、統計、廣告、推送等等各個行業和場景。對於開發者而言,引入這些SDK可大大縮短移動App開發週期,使得開發者可以更專注自己的業務實現。對於SDK廠商而言,則可以透過提供專業技術服務獲取收入,可謂是雙贏。
但是對市面上的SDK進行抽樣檢測發現,絕大部分SDK除了基本的混淆外無任何其他安全措施,這給接入的開發者埋下了諸多安全隱患。
筆者建議,SDK廠商在功能實現的同時,也不應該無視其安全性,這不僅僅是對接入SDK的開發者負責,同時也是保護自己程式碼與利益的有效手段。本文將講述為什麼SDK廠商應該做好加固,其安全隱患有哪些?以及應該如何做好SDK加固。
SDK不加固會存在哪些安全隱患?
1.易被競品或惡意者窺視內部實現細節或內部呼叫流程,甚至有可能洩露隱私資料
安卓平臺SDK絕大部分都是Java語言編寫,容易被反編譯。如果只是簡單的混淆,很容易被窺探到內部實現細節;如果SDK內部有一些涉及隱私的資料,很容易被洩漏。更重要的是,如果這些細節涉及到關鍵技術實現點的話,無異於洩漏核心技術。
2.被惡意者透過位元組碼注入等手段植入惡意廣告或惡意程式碼然後重打包釋出
由於SDK的特殊性,不像App那樣存在簽名校驗邏輯,因此一旦惡意者在你的SDK中植入了一些惡意程式碼或惡意廣告然後重新發布的話,將很難察覺,嚴重影響開發廠商的品牌形象與口碑。
3.被破解者繞過關鍵邏輯造成經濟損失
如果SDK存在支付功能,被惡意者分析找到付費邏輯,恰巧涉及付費相關邏輯也未很好的做服務端校驗的話,一旦惡意者透過AOP手段去除這些付費邏輯,意味著將可免費使用付費服務。
4.SDK本身可能存在漏洞,易被惡意者利用
SDK開發者在開發中往往把開發重點聚焦在了功能的實現上,在安全性上一般不會過多重視,因此很難保證自己開發的SDK不存在任何漏洞。因此一旦SDK出現一些安全漏洞,同時這些漏洞被惡意者知道進而利用,那就如同埋下了一顆隨時可能引爆的地雷。不僅危及使用者的資料及隱私安全,一旦出現事故將會嚴重影響SDK開發廠商的口碑,甚至造成經濟賠償。
如何解決
透過上面對安全隱患分析可知,問題的關鍵在於惡意者容易窺探到SDK的實現邏輯。因此建議開發者做如下防護措施:
1.關鍵資料的修改必須透過服務端校驗:例如前面提到的付費相關邏輯,涉及餘額或支付的金額等資料的修改必須先透過服務端校驗,然後將結果同步到客戶端;
2.關鍵邏輯放到Native層實現:將Java層的一些關鍵邏輯轉移到JNI層用C/C++實現,提高反編譯門檻;
3.字串進行加密:程式碼中的字串,尤其是敏感資訊的字串必須加密,執行時解密。
但是做到了上面幾點還不夠,只能防住一般的開發者。在專業的破解者面前,我們辛辛苦苦開發的SDK很可能淪為了他們手中的炮灰,進而造成經濟損失。
因此建議接入第三方的安全服務,比如易盾的SDK加固服務。
易盾SDK加固介紹
在介紹易盾SDK加固之前,先介紹下目前市面上絕大部分開發者使用的混淆的方式——Proguard。Proguard是安卓平臺使用最廣泛的混淆,透過抽象語法樹從語法層面進行處理,使得處理後的程式碼難以閱讀和理解。如下所示:
不過將類名和方法名修改為一些無意義的隨機字串,比如“a,b,c”,雖然能夠提高破解者閱讀與理解成本,但是很顯然作用是極其有限的。對於破解者而言,分析出程式碼的意圖只是時間的問題。
那麼易盾的SDK加固解決方案是什麼樣呢?接下來為大家介紹:
1.易盾SDK加固VMP方案
將待保護類的方法進行抽空,並對抽取的指令加密處理,在執行時透過自定義虛擬機器執行,從而使得破解者無法得到原始程式碼邏輯。
效果如下:
從靜態分析角度看,和Proguard混淆相比,很明顯加固後的原函式實現邏輯已完全不可見,同時將抽取的指令放到JNI層執行,並對指令操作碼做了重新對映,提高了動態分析破解的難度。如下所示:
2.易盾SDK加固Java2c方案
該方案是將待保護類的方法Native化,同時將原函式實現邏輯轉為Native層對應的C/C++程式碼,執行時直接執行對應的Native函式。效果如下:
加固前示例
加固後示例
從靜態分析角度看,和Proguard混淆相比,很明顯加固後的方法已Native化,實現邏輯在Java層已完全不可見。Java層原函式邏輯轉為了JNI層的C/C++程式碼實現,同時會對生成的Native層SO進行加密,全方位提高破解難度。
(注:上圖為了更清楚的看到加固後的方法已經轉為對應Native層實現,未對生成的Native層SO進行加密,實際情況易盾SDK加固Java2c方案會對加固後生成的Native層SO進行加密)
結語
對於SDK開發者而言,在聚焦核心功能實現的同時,不應該忽略其安全性,這不僅僅是對SDK的使用者負責,更是避免自己辛辛苦苦開發的SDK成為別人手中炮灰,造成實際經濟損失,或被惡意者植入非法程式碼,影響企業品牌形象與口碑的有效手段。