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 漏洞檢測