05.16 避免踩坑:易盾安全老司機起底Android九大漏洞,附解決建議

Android應用會遇到各種各樣的漏洞,如何從細節上了解各種安全隱患,積極採取適當的防禦措施便變得尤為重要。為了讓大家對Android漏洞有一個非常全面的認識,網易雲易盾資深安全工程師徐從祥為大家詳細解讀常見九大的Android漏洞,供各位學習參考。(如果下面乾貨內容沒有讓各位盡興,歡迎來官網申請相關產品試用,面對面交流,保證解決你的安全難題。)

避免踩坑:易盾安全老司機起底Android九大漏洞,附解決建議

第一大類:AndroidManifest配置相關的風險或漏洞

程序可被任意調試

風險詳情:安卓應用apk配置文件Android Manifest.xml中android:debuggable=true,調試開關被打開。

危害情況:app可以被調試。

修復建議:把AndroidManifest.xml配置文件中調試開關屬性關掉,即設置android:Debugable="false"。

程序數據任意備份

風險詳情:安卓應用apk配置文件AndroidManifest.xml中android:allowBackup=true,數據備份開關被打開。

危害情況:app應用數據可被備份導出。

修復建議:把AndroidManifest.xml配置文件備份開關關掉,即設置android:allowBackup="false"。

組件暴露:建議使用android:protectionLevel="signature"驗證調用來源。

Activity組件暴露

風險詳情:Activity組件的屬性exported被設置為true或是未設置exported值但IntentFilter不為空時,activity被認為是導出的,可通過設置相應的Intent喚起activity。

危害情況:黑客可能構造惡意數據針對導出activity組件實施越權攻擊。

修復建議:如果組件不需要與其他app共享數據或交互,請將AndroidManifest.xml 配置文件中設置該組件為exported = “False”。如果組件需要與其他app共享數據或交互,請對組件進行權限控制和參數校驗。

Service組件暴露

風險詳情:Service組件的屬性exported被設置為true或是未設置exported值但IntentFilter不為空時,Service被認為是導出的,可通過設置相應的Intent喚起Service。

危害情況:黑客可能構造惡意數據針對導出Service組件實施越權攻擊。

修復建議:如果組件不需要與其他app共享數據或交互,請將AndroidManifest.xml 配置文件中設置該組件為exported = “False”。如果組件需要與其他app共享數據或交互,請對組件進行權限控制和參數校驗。

ContentProvider組件暴露

風險詳情:ContentProvider組件的屬性exported被設置為true或是Android API<=16時,Content Provider被認為是導出的。

危害情況:黑客可能訪問到應用本身不想共享的數據或文件。

修復建議:如果組件不需要與其他app共享數據或交互,請將AndroidManifest.xml 配置文件中設置該組件為exported = “False”。如果組件需要與其他app共享數據或交互,請對組件進行權限控制和參數校驗。

BroadcastReceiver組件暴露

風險詳情:BroadcastReceiver組件的屬性exported被設置為true或是未設置exported值但IntentFilter不為空時,BroadcastReceiver被認為是導出的。

危害情況:導出的廣播可以導致數據洩漏或者是越權。

修復建議:如果組件不需要與其他app共享數據或交互,請將AndroidManifest.xml 配置文件中設置該組件為exported = “False”。如果組件需要與其他app共享數據或交互,請對組件進行權限控制和參數校驗。

Intent SchemeURLs攻擊

風險詳情:在AndroidManifast.xml設置Scheme協議之後,可以通過瀏覽器打開對應的Activity。

危害情況:攻擊者通過訪問瀏覽器構造Intent語法喚起app相應組件,輕則引起拒絕服務,重則可能演變對app進行越權調用甚至升級為提權漏洞。

修復建議:app對外部調用過程和傳輸數據進行安全檢查或檢驗,配置category filter, 添加android.intent.category.BROWSABLE方式規避風險

第二大類:WebView組件及與服務器通信相關的風險或漏洞

Webview存在本地Java接口

風險詳情:android的webView組件有一個非常特殊的接口函數addJavascriptInterface,能實現本地java與js之間交互。

危害情況:在targetSdkVersion小於17時,攻擊者利用 addJavascriptInterface這個接口添加的函數,可以遠程執行任意代碼。

修復建議:建議開發者不要使用addJavascriptInterface,使用注入javascript和第三方協議的替代方案。

Webview組件遠程代碼執行(調用getClassLoader)

風險詳情:使用低於17的targetSDKVersion,並且在Context子類中使用addJavascriptInterface綁定this對象。

危害情況:通過調用getClassLoader可以繞過google底層對getClass方法的限制。

修復建議:targetSDKVersion使用大於17的版本。

WebView忽略SSL證書錯誤

風險詳情:WebView調用onReceivedSslError方法時,直接執行handler.proceed()來忽略該證書錯誤。

危害情況:忽略SSL證書錯誤可能引起中間人攻擊。

修復建議:不要重寫onReceivedSslError方法,或者對於SSL證書錯誤問題按照業務場景判斷,避免造成數據明文傳輸情況。

webview啟用訪問文件數據

風險詳情:Webview中使用setAllowFileAccess(true),App可通過webview訪問私有目錄下的文件數據。

危害情況:在Android中,mWebView.setAllowFileAccess(true)為默認設置。當setAllowFileAccess(true)時,在File域下,可執行任意的JavaScript代碼,如果繞過同源策略能夠對私有目錄文件進行訪問,導致用戶隱私洩漏。

修復建議:使用WebView.getSettings().setAllowFileAccess(false)來禁止訪問私有文件數據。

SSL通信服務端檢測信任任意證書

風險詳情:自定義SSLx509 TrustManager,重寫checkServerTrusted方法,方法內不做任何服務端的證書校驗。

危害情況:黑客可以使用中間人攻擊獲取加密內容。

修復建議:嚴格判斷服務端和客戶端證書校驗,對於異常事件禁止return 空或者null。

HTTPS關閉主機名驗證

風險詳情:構造HttpClient時,設置HostnameVerifier時參數使用ALLOW_ALL_HOSTNAME_VERIFIER或空的HostnameVerifier。

危害情況:關閉主機名校驗可以導致黑客使用中間人攻擊獲取加密內容。

修復建議:APP在使用SSL時沒有對證書的主機名進行校驗,信任任意主機名下的合法的證書,導致加密通信可被還原成明文通信,加密傳輸遭到破壞。

SSL通信客戶端檢測信任任意證書

風險詳情:自定義SSLx509 TrustManager,重寫checkClientTrusted方法,方法內不做任何服務端的證書校驗。

危害情況:黑客可以使用中間人攻擊獲取加密內容。

修復建議:嚴格判斷服務端和客戶端證書校驗,對於異常事件禁止return 空或者null。

開放socket端口

風險詳情:app綁定端口進行監聽,建立連接後可接收外部發送的數據。

危害情況:攻擊者可構造惡意數據對端口進行測試,對於綁定了IP 0.0.0.0的app可發起遠程攻擊。

修復建議:如無必要,只綁定本地ip127.0.0.1,並且對接收的數據進行過濾、驗證。

第三大類:數據安全風險

數據儲存:

SD卡數據被第三方程序訪問

漏洞描述:發現調用getExternalStorageDirectory,存儲內容到SD卡可以被任意程序訪問,存在安全隱患。

安全建議:建議存儲敏感信息到程序私有目錄,並對敏感數據加密。

全局File可讀寫漏洞-openFileOutput

風險詳情:openFileOutput(Stringname,int mode)方法創建內部文件時,將文件設置了全局的可讀權限MODE_WORLD_READABLE。

危害情況:攻擊者惡意讀取文件內容,獲取敏感信息。

修復建議:請開發者確認該文件是否存儲敏感數據,如存在相關數據,請去掉文件全局可讀屬性。

全局文件可寫

風險詳情:openFileOutput(Stringname,int mode)方法創建內部文件時,將文件設置了全局的可寫權限MODE_WORLD_WRITEABLE。

危害情況:攻擊者惡意寫文件內容破壞APP的完整性。

修復建議:請開發者確認該文件是否存儲敏感數據,如存在相關數據,請去掉文件全局可寫屬性。

全局文件可讀可寫

風險詳情:openFileOutput(Stringname,int mode)方法創建內部文件時,將文件設置了全局的可讀寫權限。

危害情況:攻擊者惡意寫文件內容或者,破壞APP的完整性,或者是攻擊者惡意讀取文件內容,獲取敏感信息。

修復建議:請開發者確認該文件是否存儲敏感數據,如存在相關數據,請去掉文件全局可寫、寫屬性。

私有文件洩露風險-getSharedPreferences:

配置文件可讀

風險詳情:使用getSharedPreferences打開文件時第二個參數設置為MODE_WORLD_READABLE。

危害情況:文件可以被其他應用讀取導致信息洩漏。

修復建議:如果必須設置為全局可讀模式供其他程序使用,請保證存儲的數據非隱私數據或是加密後存儲。

配置文件可寫

風險詳情:使用getSharedPreferences打開文件時第二個參數設置為MODE_WORLD_WRITEABLE。

危害情況:文件可以被其他應用寫入導致文件內容被篡改,可能導致影響應用程序的正常運行或更嚴重的問題。

修復建議:使用getSharedPreferences時第二個參數設置為MODE_PRIVATE即可。

配置文件可讀可寫

風險詳情:使用getSharedPreferences打開文件時,如將第二個參數設置為MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE。

危害情況:當前文件可以被其他應用讀取和寫入,導致信息洩漏、文件內容被篡改,影響應用程序的正常運行或更嚴重的問題。

修復建議:使用getSharedPreferences時第二個參數設置為MODE_PRIVATE。禁止使用MODE_WORLD_READABLE |MODE_WORLD_WRITEABLE模式。

數據加密:

明文數字證書漏洞

Apk使用的數字證書可被用來校驗服務器的合法身份,以及在與服務器進行通信的過程中對傳輸數據進行加密、解密運算,保證傳輸數據的保密性、完整性。

明文存儲的數字證書如果被篡改,客戶端可能連接到假冒的服務端上,導致用戶名、密碼等信息被竊取;如果明文證書被盜取,可能造成傳輸數據被截獲解密,用戶信息洩露,或者偽造客戶端向服務器發送請求,篡改服務器中的用戶數據或造成服務器響應異常。

AES弱加密

風險詳情:在AES加密時,使用了“AES/ECB/NoPadding”或“AES/ECB/PKCS5padding”的模式。

危害情況:ECB是將文件分塊後對文件塊做同一加密,破解加密只需要針對一個文件塊進行解密,降低了破解難度和文件安全性。

修復建議:禁止使用AES加密的ECB模式,顯式指定加密算法為:CBC或CFB模式,可帶上PKCS5Padding填充。AES密鑰長度最少是128位,推薦使用256位。

隨機數不安全使用

風險詳情:調用SecureRandom類中的setSeed方法。

危害情況:生成的隨機數具有確定性,存在被破解的可能性。

修復建議:用/dev/urandom或/dev/random來初始化偽隨機數生成器。

AES/DES硬編碼密鑰

風險詳情:使用AES或DES加解密時,密鑰採用硬編碼在程序中。

危害情況:通過反編譯獲取密鑰可以輕易解密APP通信數據。

修復建議:密鑰加密存儲或變形後進行加解密運算,不要硬編碼到代碼中。

數據傳輸:與上面的重複了,也可以把webview系列的漏洞歸入這一小類。

第四大類:文件目錄遍歷類漏洞

Provider文件目錄遍歷

風險詳情:當Provider被導出且覆寫了openFile方法時,沒有對Content Query Uri進行有效判斷或過濾。

危害情況:攻擊者可以利用openFile()接口進行文件目錄遍歷以達到訪問任意可讀文件的目的。

修復建議:一般情況下無需覆寫openFile方法,如果必要,對提交的參數進行“../”目錄跳轉符或其他安全校驗。

unzip解壓縮漏洞

風險詳情:解壓 zip文件,使用getName()獲取壓縮文件名後未對名稱進行校驗。

危害情況:攻擊者可構造惡意zip文件,被解壓的文件將會進行目錄跳轉被解壓到其他目錄,覆蓋相應文件導致任意代碼執行。

修復建議:解壓文件時,判斷文件名是否有../特殊字符。

第五大類:文件格式解析類漏洞

FFmpeg文件讀取

風險詳情:使用了低版本的FFmpeg庫進行視頻解碼。

危害情況:在FFmpeg的某些版本中可能存在本地文件讀取漏洞,可以通過構造惡意文件獲取本地文件內容。

修復建議:升級FFmpeg庫到最新版。

安卓“Janus”漏洞

漏洞詳情:向原始的AppAPK的前部添加一個攻擊的classes.dex文件(A文件),安卓系統在校驗時計算了A文件的hash值,並以”classes.dex”字符串做為key保存, 然後安卓計算原始的classes.dex文件(B),並再次以”classes.dex”字符串做為key保存,這次保存會覆蓋掉A文件的hash值,導致Android系統認為APK沒有被修改,完成安裝,APK程序運行時,系統優先以先找到的A文件執行,忽略了B,導致漏洞的產生。

危害情況:該漏洞可以讓攻擊者繞過安卓系統的signature scheme V1簽名機制,進而直接對App進行篡改。而且由於安卓系統的其他安全機制也是建立在簽名和校驗基礎之上,該漏洞相當於繞過了安卓系統的整個安全機制。

修復建議:禁止安裝有多個同名ZipEntry的APK文件。

第六大類:內存堆棧類漏洞

未使用編譯器堆棧保護技術

風險詳情:為了檢測棧中的溢出,引入了Stack Canaries漏洞緩解技術。在所有函數調用發生時,向棧幀內壓入一個額外的被稱作canary的隨機數,當棧中發生溢出時,canary將被首先覆蓋,之後才是EBP和返回地址。在函數返回之前,系統將執行一個額外的安全驗證操作,將棧幀中原先存放的canary和.data中副本的值進行比較,如果兩者不吻合,說明發生了棧溢出。

危害情況:不使用StackCanaries棧保護技術,發生棧溢出時系統並不會對程序進行保護。

修復建議:使用NDK編譯so時,在Android.mk文件中添加:LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all

未使用地址空間隨機化技術

風險詳情:PIE全稱Position Independent Executables,是一種地址空間隨機化技術。當so被加載時,在內存裡的地址是隨機分配的。

危害情況:不使用PIE,將會使得shellcode的執行難度降低,攻擊成功率增加。

修復建議:NDK編譯so時,加入LOCAL_CFLAGS := -fpie -pie開啟對PIE的支持。

libupnp棧溢出漏洞

風險詳情:使用了低於1.6.18版本的libupnp庫文件。

危害情況:構造惡意數據包可造成緩衝區溢出,造成代碼執行。

修復建議:升級libupnp庫到1.6.18版本或以上。

第七大類:動態類漏洞

DEX文件動態加載

風險詳情:使用DexClassLoader加載外部的 apk、jar 或 dex文件,當外部文件的來源無法控制時或是被篡改,此時無法保證加載的文件是否安全。

危害情況:加載惡意的dex文件將會導致任意命令的執行。

修復建議:加載外部文件前,必須使用校驗簽名或MD5等方式確認外部文件的安全性。

動態註冊廣播

風險詳情:使用registerReceiver動態註冊的廣播在組件的生命週期裡是默認導出的。

危害情況:導出的廣播可以導致拒絕服務、數據洩漏或是越權調用。

修復建議:使用帶權限檢驗的registerReceiver API進行動態廣播的註冊。

第八大類:校驗或限定不嚴導致的風險或漏洞

Fragment注入

風險詳情:通過導出的PreferenceActivity的子類,沒有正確處理Intent的extra值。

危害情況:攻擊者可繞過限制訪問未授權的界面。

修復建議:當targetSdk大於等於19時,強制實現了isValidFragment方法;小於19時,在PreferenceActivity的子類中都要加入isValidFragment ,兩種情況下在isValidFragment方法中進行fragment名的合法性校驗。

隱式意圖調用

風險詳情:封裝Intent時採用隱式設置,只設定action,未限定具體的接收對象,導致Intent可被其他應用獲取並讀取其中數據。

危害情況:Intent隱式調用發送的意圖可被第三方劫持,導致內部隱私數據洩露。

修復建議:可將隱式調用改為顯式調用。

第九大類:命令行調用類相關的風險或漏洞

動態鏈接庫中包含執行命令函數

風險詳情:在native程序中,有時需要執行系統命令,在接收外部傳入的參數執行命令時沒有做過濾或檢驗。

危害情況:攻擊者傳入任意命令,導致惡意命令的執行。

修復建議:對傳入的參數進行嚴格的過濾。

避免踩坑:易盾安全老司機起底Android九大漏洞,附解決建議


分享到:


相關文章: