App安全·下篇
一、概述
如今,隨著人們使用手機,平板等移動端設備上網(wǎng)的時間與頻率增加,移動app的發(fā)展也是愈來愈迅速。各大交易所在與用戶交互的這方面,除了網(wǎng)頁瀏覽以外,也就是移動端的app了。
盡管app時下相當流行,但其安全性卻一直沒有得到足夠的關注。在app安全的領域上,大部分廠商都做得比較初級,很多用戶也不具備相對應的安全意識。由此,app也就變成了惡意攻擊者的一個有效突破口。
零時科技安全團隊在經(jīng)過大量對app進行的安全測試之后,總結出了一份相對完整有效的測試列表,建議各大交易所以此自查,防患于未然。
二、測試列表
App安全
- 秘鑰硬編碼安全檢測
- 數(shù)據(jù)存儲安全檢測
- 數(shù)據(jù)傳輸安全檢測
- 日志信息泄露檢測
- App組件導出檢測
- App組件權限檢測
- webview 多項漏洞安全測試
- App Webview DOM 安全測試
- 本地SQL注入安全測試
- SQLite 存儲安全審計
三、案例分析
秘鑰硬編碼安全
被測試的app,若通信存在加密處理,即可檢查源碼或者靜態(tài)資源文件中是否存在硬編碼的加密秘鑰,從而破解通信加密的數(shù)據(jù)。
零時科技安全團隊在對某交易所app進行安全測試時,檢查是否存在秘鑰硬編碼漏洞,此app請求數(shù)據(jù)默認是通過請求數(shù)據(jù)排列,然后加上appkey加上另外一個秘鑰進行md5,再通過算法后去字符串再次md5得到最后的簽名。
這里加密使用的appkey硬編碼到apk中。如下圖:

另一個加密key在so文件中,通過逆向可以獲?。?/p>

這樣一來即可通過修改數(shù)據(jù)后重新簽名構造任意數(shù)據(jù)了,加簽也就失去了意義。
以下為第二個例子。
零時科技安全團隊在對另一個app進行測試時,使用burp工具截取該app傳輸?shù)臄?shù)據(jù)包,發(fā)現(xiàn)響應包內容已經(jīng)過加密并有base64的特征。

對apk進行逆向獲取到加密方式為aes cbc補碼方式為pkcs7。

在反編譯源碼中未查詢到aes秘鑰相關信息 對apk進行解壓 在靜態(tài)資源文件中發(fā)現(xiàn)aes_key與aes_iv。

使用收集到的aes_key與aes_iv 以pkcs7為補碼方式構造aes cbc解密獲取到明文數(shù)據(jù)。
數(shù)據(jù)存儲安全
如果安卓手機用戶的app文件存放在external storage,例如SD卡,那這些文件就是全局可讀寫的,external storage可以被任何用戶操作,且可以被所有的應用修改使用。
零時科技安全團隊在對某交易所app進行安全測試時,使用動態(tài)方法監(jiān)測/data/data/<packagename>/目錄下所有生成的目錄是否帶有明文信息泄露。
進入到/data/data/com.xxx.wallet/shared_prefs目錄,查看config.xml文件,此文件存儲了用戶的支付信息等非常敏感的信息,而這些信息可被其他用戶接觸導致信息被盜取等。

零時科技安全團隊建議,app的敏感數(shù)據(jù)不要存放在external storage,如若不得不這樣做,請對數(shù)據(jù)進行加密處理。
日志信息泄露
在APP的開發(fā)過程中,為了方便調試,通常會使用log函數(shù)輸出一些關鍵流程的信息,這些信息又通常會包含敏感內容,如執(zhí)行流程、明文的用戶名密碼等。這會讓攻擊者更加容易的了解APP內部結構方便破解和攻擊,甚至直接獲取到有價值的敏感信息。
零時科技安全團隊在對某交易所app進行安全測試時,檢測存在漏洞,程序中使用Log.v、Log.d、Log.e、Log.i、Log.w、Log.f、Log.s函數(shù)對日志信息輸出,在反編譯apk后,在源碼中查找到日志信息輸入接口函數(shù),如下圖:

零時科技安全團隊建議各大交易所app開發(fā)人員移除Log打印。
App組件導出檢測
檢測app中Activity、activity-alias、service、receiver組件對外暴露情況,如果檢測到組件的exported屬性為true或者未設置,而且組件的permission屬性為normal或者dangerous或者未設置組件的permission屬性時,app將存在組件導出漏洞,導致數(shù)據(jù)泄露和惡意的dos攻擊以及釣魚攻擊。
零時科技安全團隊在對某交易所app進行安全測試時,檢測到該app存在Activity組件導出漏洞。
檢測app中Activity、activity-alias、service、receiver組件對外暴露情況,先檢測組件的exported屬性,再檢測組件的permission對應的protectionlevel屬性。

具體檢測存在漏洞的方法如下:

零時科技安全團隊建議:
最小化組件暴露。對不會參與跨應用調用的組件添加android:exported=”false”屬性。
設置組件訪問權限。對跨應用間調用的組件或者公開的receiver、service、activity和activity-alias設置權限,同時將權限的protectionLevel設置為”signature”或”signatureOrSystem”。
組件傳輸數(shù)據(jù)驗證。對組件之間,特別是跨應用的組件之間的數(shù)據(jù)傳入與返回做驗證和增加異常處理,防止惡意調試數(shù)據(jù)傳入,更要防止敏感數(shù)據(jù)返回。
SQLite 存儲安全
此類安全問題的檢測,使用adb工具將sqlite數(shù)據(jù)庫拖到本地,使用sqlite數(shù)據(jù)庫連接軟件查看是否存在敏感數(shù)據(jù)即可。如下為零時科技安全團隊測試某交易所app發(fā)現(xiàn)的漏洞范例。

隨著移動互聯(lián)網(wǎng)的發(fā)展,如今移動設備已與我們的生活息息相關,但其安全性卻一直沒有得到足夠的關注。
時不我待, 于無聲處聽驚雷,守護移動安全從現(xiàn)在開始。
零時科技安全團隊《交易所安全測試》系列的文章到這里就結束了,但我們還有很多沒有說,請期待下一系列的文章,一定更加精彩!