App的安全過檢與眾所熟知的安全檢測是兩個完全不同的概念。首先App行業本身對App安全過檢有一定的要求與規範,其次2017年6月1日正式實施的《中國網路安全法》中就曾要求App在渠道上線時進行實名認證,同時還要完成相應的安全檢測。App這一上線過程就稱為安全過檢或者叫做安全候審。
App安全過檢過程中遇到哪些問題
App在具體過檢時所參考的一個細則就是《移動應用安全檢測基本要求》,這個要求總共分為四大類,其中包括應用層、網路層、資料層以及伺服器端。而安卓App本身的一些安全點,總共分為十個,分別是程式程式碼安全、程式程式碼防護、密碼與安全策略、許可權與介面安全、動態除錯檢測、SO注入檢測、記憶體資料保護、隱私與儲存安全、日誌洩漏檢測、通訊資料安全等。
一、程式程式碼安全
第一塊與使用者資訊收集要求相關。APP上架時對使用者資訊收集是有一定要求的,收集使用者資訊就明確相關的法律宣告以及相關隱私政策。假如App沒有獲取使用者隱私資料,但是使用了三方平臺去收集,這個也要宣告清楚App使用了哪個三方平臺去收集使用者資料,收集使用者資料的目的等。
上圖就是我們常見的一個APP展示頁面,雖然大部分使用者沒有仔細閱讀過以上資訊,但是法律宣告及隱私政策的展示是收集使用者資訊的硬性要求。
第二塊與呼叫系統許可權檢測相關。呼叫系統許可權需要遵循許可權最小原則,同時App申請的許可權要遵守使用者的同意。
第三塊是原始碼的安全性,上架APP要給使用者提供正常服務,而且不存在惡意特徵行為。
二、程式程式碼防護
App開發者要具備基本的安全開發意識,要時刻關注App有沒有打錯包、有沒有采用程式碼混淆技術,有沒有基本的防反編譯能力以及能不能在某一種程度上防篡改。
第一個混淆是指客戶端是否採用了程式碼混淆技術;
第二個防反編譯是指能夠阻止三方逆向工具進行逆向反編譯或者通過加固特徵進行反編譯;
第三個防篡改是指App在執行時完整性校驗防篡改機制,防二次打包,修改後重新打包執行閃退即可通過。
三、密碼與安全策略
密碼與安全策略需要使用者輸入賬號密碼登入的APP,尤其是金融類App,在輸入賬號密碼時需要防止三方程式捕獲或截獲或者是截圖,這就需要APP有一定的鍵盤保護。防鍵盤記錄SDK,就是當使用者輸入賬號密碼時,通過SDK來展示鍵盤供使用者輸入,這個SDK必須要求每次啟動時所顯示的字元序列是不一樣的,這樣才會被認為是通過的,是合格的。
四、許可權與介面安全
程式資料備份需要檢視AndroidManifest.xml中是否設定allowBackup標誌(預設為true)或將allowBackup設定為true。如果為true時應用程式資料可以備份和恢復。
介面劫持是在賬號密碼輸入的時候,除了鍵盤輸入的字元會被截獲之外,惡意程式也可能會提供一個假的介面,覆蓋賬號輸入的頁面上去,偽造一個登入頁面,普通使用者無法甄別登入頁面的真偽,所以很可能會被釣魚。這樣的程式有一個要求,當對它進行測試的時候也會提供一個假的介面,這時App要彈出相關風險提示。
還有一個是截圖錄屏,有些惡意程式不去攔截字元輸入,因為密碼輸入的一瞬間字元是出現的,當輸入下一個密碼字元時上一個字元才會變成星號,有些惡意程式也會用到這種截圖錄屏的技術。
值得一提的是,目前還沒有什麼專門針對Activity劫持的防護方法,因為這種攻擊是使用者層面上的,目前還無法從程式碼層面上根除。
但是我們可以適當的在App中給使用者一些警示資訊,提示登入或關鍵介面已被覆蓋,具體解決方案如下:
在App的Activity介面(也就是MainActivity)中重寫onKeyDown方法和onPause方法,當其被覆蓋時,就能夠彈出警示資訊。判斷程式進入後臺是不是由使用者自己觸發的(觸控返回鍵或HOME鍵),如果是使用者自己觸發的則無需彈出警示,否則彈出警示資訊。
五、動態除錯檢測
防動態除錯基本上是通過ptrace方式進行判斷,當應用被檢測機構打回時,機構會給相關修復建議,修復建議裡面會提到一些解決方案。
如果程式被附加處於除錯狀態,則/etc/$(procID)/status中進行procid的判斷,如果程式id不為零則直接殺死本程式退出。如果程式被附加處於除錯狀態,則/etc/self/status中對TracerPid後面的程式ID進行判斷,如果程式id不為零則直接殺死本程式退出,建立子程式,子程式對其進行ptrace,但不對子程式ptrace,互相檢查ptrace狀態;同時還要互相檢查程式是否被掛起。
APK一旦被除錯,APP異常退出,阻斷除錯
當然也可以用三方的加固成品來進行實現,有些加固可能做的動態是比較完善的話也能夠實現這一點。
通過對App進行加固,採用加固方案加固App,防止App被動態除錯。
六、SO注入檢測
SO注入,在App例案裡面破解手法是比較多的,無論是從linker服務還是dlopen服務,SO注入是比較實用的技能。SO搭配上so庫技術,可以很方便分析應用程式的一些邏輯以及App所要達到的一些效果。
SO注入的防範方法主要包括以下三點:
1、對dlopen函式進行的判斷,修改linker中的dlopen函式,防止第三方so載入。
2、定時檢測應用載入的第三方so庫,如果發現是被注入的so,解除安裝載入的so。
3、對被測系統進行加固,防止被測系統被動態注入第三方so。
七、記憶體資料保護
防dump
dump實際就是記憶體資料的讀,防dump就是防記憶體被第三方程式讀,可以利用類似如下命令dump程式記憶體:dd if=/proc/3039/mem of=/data/local/tmp/dump_mem.zip skip=1979047936 ibs=1 count=1490944。監控/proc/pid/mem、/proc/tid/mem等檔案的讀寫操作,當這些檔案被第三方程式訪問時,觸發設定的回撥函式,並做進一步處理。
防記憶體修改
記憶體資料的修改就是記憶體資料的寫,原理同防dump。配合防注入、防除錯等方法,最終實現防記憶體修改。
八、隱私與儲存安全
本地資料儲存是否洩露資訊檢測:xml、db檔案是否明文儲存;日誌資訊是否安全檢測;
1.不要將密碼等敏感資訊儲存在Shared Preferences等內部儲存中,應將敏感資訊進行加密後儲存。
2.避使用MODE_WORLD_WRITEABLE和MODE_WORLD_READABLE模式建立程式間通訊的檔案,此處即為Shared Preferences。
九、通訊資料安全
敏感資料是否加密傳輸檢測:網路抓包 敏感資料是否加密;
對加密通道的安全性檢測(包含中間人攻擊檢測等)HTTPS通訊協議;
建議:被測系統客戶端在與伺服器端通訊應使用SSL等協議加密傳輸敏感資訊。
自定義實現的X509TrustManager子類中,未對伺服器端證照做驗證,預設接受任意服務端證照,會存在安全風險。 被測系統忽略伺服器端證照校驗錯誤或信任任意證照,容易導致中間人攻擊,可能造成使用者敏感資訊洩露。
在客戶端對伺服器端證照校驗的checkServerTrusted方法中對證照進行校驗。
十、其他漏洞檢測
WebView漏洞:客戶端App 是否使用webview 元件的介面函式addJavascriptInterface,是否存在遠端程式碼執行漏洞。
元件引起漏洞檢測
鑑權機制缺陷檢測
SQL 注入漏洞檢測
跨站指令碼攻擊(xss)漏洞檢測
阿里雲oss 憑證洩露漏洞檢測
Struts2 漏洞檢測