App應用加固方案

weixin_33968104發表於2016-10-27

可能面臨的風險

網路方面

1.竊聽風險(eavesdropping):第三方可以獲知通訊內容。
2.篡改風險(tampering):第三方可以修改通訊內容。
3.冒充風險(pretending):第三方可以冒充他人身份參與通訊。

本地方面

1.資料竊取,主要是對我們資源包括3d模型,聲音,UI,影像的保護。其次是對我們一些重要資訊保護,比如驗證的登入密碼。
2.原始碼被盜,分為兩步分,一部分對我們lua邏輯原始碼保護,另一部分對我們框架原始碼保護。
3.二次打包,主要在安卓部分,防止篡改邏輯,加入廣告,收集資料之類的攻擊,ios主要在越獄機器上會有這個風險。
4.記憶體修改,目前重要資料修改都是要通過伺服器驗證,所以這個問題不嚴重。
5.動態注入攻擊,主要保護動態庫的安全,防止注入篡改邏輯,跳過驗證之類。

加固方案

網路方面

1.針對這類問題應該直接使用https加入ssl驗證,或者自定客戶端和伺服器雙向驗證加密我們的資料。在資料傳輸階段達到一個比較安全的程度。
2.針對IM也同時應該加密,不過伺服器那邊如果加入SSH驗證會很大影響伺服器效率,所以目前待解。

本地方面

本地資源和重要資料

資源和業務原始碼都是同一類本地資源,目前是用祕鑰使用對稱加密的方式加密,在執行時進行解密。所以重要的是對祕鑰的保護。同理自動登入儲存的祕鑰一樣。

IOS

在ios下,目前登入密碼使用md5加密儲存在ios系統下的keychain。在正常系統下,比較安全。但在越獄機器上,黑客可以很容易的獲取到裡面的資料,所以建議:儲存在keychain裡的祕鑰,應該不是最終使用的登入密碼,應該增加加密機制,在執行時生成。

對資源加解密的祕鑰直接硬編碼在程式碼裡,這也是非常不安全的,目前有兩個建議
1.統一從伺服器獲取,然後加密後儲存在keychain,同樣在執行時生成,將安全等級提升到登入驗證等級。
2.將硬編碼的祕鑰不要明文儲存,分散隱藏在程式碼中,利用一系列演算法,在執行時生成。

更高階一點的加密方式,不在記憶體中使用明文祕鑰,使用白盒加密祕鑰

白盒加密技術的核心思想是把祕鑰隱藏起來, 加密執行過程中, 記憶體中不會出現祕鑰的值. 現在通用的技術是查詢表技術, 即把祕鑰隱藏在查詢表中,可以看看Chow的關於白盒AES的奠基性文章white-box cryptography and an aes implementation, 國內也有人做, 看看肖雅瑩的畢業論文"白盒密碼及AES與SMS4演算法的實現"可以對白盒加密有一個感性的認識. 所以, 通過查詢表技術隱藏祕鑰, 使得攻擊者逆向也好, dump記憶體也罷, 就不會直接看到祕鑰的值, 這跟把祕鑰放到so中增加逆向分析難度有質的區別. 白盒加密的攻擊需要從數學理論上去分析, 這無疑會極大增加破解難度. 白盒加密的研究現狀是公佈出來的論文並不多, 給你一個參考網址, http://www.whiteboxcrypto.com/. 我相信國內外都有安全公司和實驗室在研究白盒加密, 只不過都沒公佈出來. 從移動網際網路到IoT領域, 終端安全問題會越來越突出, 預測白盒加密這種軟體解決方案會越來越重要, 因為成本更低. 白盒加密的安全度目前來看是可以值得信任的, 當然這個世界上沒有絕對的安全, 白盒加密也會被破, 就是攻擊成本的問題啦.

Android

使用Android自身的金鑰庫(KeyStore)。在某些擁有硬體加密的機器上,可以得到更好的安全性,特性有:
1,金鑰材料可以繫結安全硬體
2,金鑰材料無法匯出裝置
3,金鑰材料永遠不進入應用程式,加解密和簽名時僅僅利用系統程式完成。最極端情況下即使應用程式被破解,攻擊者也最多能用金鑰來加解密,但不能匯出金鑰材料
不同的是,android沒有一個系統位置儲存祕鑰,只有一個系統級加密庫,能保證加解密過程不被破解。所謂硬體加密,指加密到Trusted Execution Environment (TEE) or Secure Element
(SE)。TEE是主處理器上的一個隔離區域,SE是一個晶片,TEE比SE功能更強。

二次打包的防護

篡改檢測 檢測只是一個過程,有大量的同類的攻擊包括二次打包,動態注入,後面有對這類攻擊的解決辦法。

IOS

Android

主要可以做的有
1.檢查APK的簽名
2.校驗APK的完整性
3.校驗classes.dex檔案的完整性
這類情況都是被篡改。

對靜態分析的防護

對抗反編譯

我們被反編譯風險主要在最上層的高階語言,oc和java,對於這部分沒有辦法保證真的安全,只能這增加分析難度,隱藏我們程式的入口。對OC和java程式碼都應該做混淆。
需要注意的是,重要的邏輯不要再oc和java直接實現,目前我們沒有這個風險。
lua程式碼如果可能也應該做混淆,當原始碼真的洩露,也能增加分析複雜度。

其次記憶體安全需要特別注意,在
1.在任何認證和資料加密之前。永遠不要再記憶體中儲存任何資料。
2.不要用oc或者java例項變數儲存祕鑰和重要資料,應該手動申請記憶體來儲存,同時也要手動釋放。
3.同樣不要用例項儲存祕鑰和資料的指標
4.任何時候,當重要資料不要被需要的時候,立即對其清理。比如,當應用從後臺掛起的時候。
重要的資料也不要用oc和java的變數儲存,記憶體應該手動申請

高階一點方法,獲取已知反編譯工具的漏洞,利用這些漏洞,讓反編譯我們程式時自動丟擲異常。

對抗靜態分析

除了必要的混淆程式碼,C/C++程式碼分析非常困難,目前可以用的防護
1.去除符號,增加複雜度。

對抗動態分析

阻止偵錯程式

IOS有自己特性可以直接在程式開始就阻止偵錯程式,對初級攻擊者有明顯的防護作用。

檢測偵錯程式

通過使用行內函數,在程式各個地方隱藏檢查點,檢查出篡改可能。

執行庫完整檢查

可以通過檢查記憶體地址空間,檢查執行庫的完整,查出篡改可能。

篡改響應

當檢測到程式被篡改或者攻擊時,直接拒絕執行。同時也可使用一些隱藏防護手段,迷惑攻擊者。
1.擦除使用者資料
2.禁止網路訪問,阻止在程式裡除錯到伺服器
3.報告機制,收集攻擊資訊到伺服器

相關文章