避免踩坑:易盾安全老司機起底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程式中,有時需要執行系統命令,在接收外部傳入的引數執行命令時沒有做過濾或檢驗。
危害情況:攻擊者傳入任意命令,導致惡意命令的執行。
修復建議:對傳入的引數進行嚴格的過濾。
相關文章
- 二手房購買流程及注意事項,建議收藏!避免踩坑!2020-12-09
- Golang 需要避免踩的 50 個坑2019-04-10Golang
- Docker 部署 redis教程,附帶部分小建議,防止踩坑2020-08-31DockerRedis
- mpvue開發音訊類小程式踩坑和建議2019-03-11Vue音訊
- puppetter安裝就踩坑-解決篇2018-09-13
- 避免踩坑的外貿知識點奉上~2023-05-19
- Android學習“易錯” 系列:老司機都掉的坑,你進去了嗎?2020-03-31Android
- Swift 4 踩坑之 Codable 協議2017-12-19Swift協議
- 踩坑CBO,解決那些坑爹的SQL優化問題2017-06-12SQL優化
- 小紅書分享踩坑和解決2024-08-22
- Android Studio踩坑記2016-08-21Android
- 手把手教你部署驗證freeswitch(避免踩坑)2021-05-19
- 新手如何操作自媒體?這樣操作避免踩坑2021-03-11
- IT人,那些年,一起踩過的坑2021-12-01
- 網易易盾王博:易盾融媒體內容安全解決方案能幫行業把握內容出口的合規性2019-07-25行業
- Android、Java RSA加密踩坑記2019-01-21AndroidJava加密
- Android 軟鍵盤踩坑記2018-12-21Android
- Android Studio踩坑記錄2024-06-03Android
- Spring Boot 容器化踩坑與解決方案(1)2019-04-18Spring Boot
- electron實現靜默列印(各種踩坑解決)2024-03-18
- 部署Prometheus Operator完整流程及踩坑解決思路2024-05-13Prometheus
- 避免HBase PageFilter踩坑,這幾點你必須要清楚2019-08-15Filter
- 電視機頂盒web開發總結,避免踩坑2018-06-04Web
- Vue2.0構建——踩過的坑2017-11-23Vue
- 10個企業網路安全建議,解決99%的網路安全問題2019-12-07
- 智慧時代的內容安全,易盾是如何落地的?2019-03-11
- Android開發踩坑及最佳實踐(工作踩坑記錄 持續更新...)2018-11-16Android
- 建議:避免建立不必要的物件。2017-08-17物件
- golang定時任務踩坑及終極解決方案2019-10-05Golang
- 外包公司中的"煉獄",極度摧殘,避免踩坑。2022-12-28
- Android-Drawable setColorFilter方法踩坑2021-09-09AndroidFilter
- 高危漏洞!Apache Log4j 遠端程式碼執行漏洞(附修復建議)2021-12-10Apache
- 那些年我們一起踩過的Dubbo坑2019-03-28
- 最近用Timer踩了一個坑,分享一下避免別人繼續踩2014-11-03
- 安卓易學,爬坑不易—騰訊老司機的RecyclerView區域性重新整理爬坑之路2018-07-18安卓View
- 網易易盾正式對外推手游出海安全解決方案2019-08-07
- 企業應該如何選型低程式碼才能避免踩坑呢?2021-03-22
- CRM系統操作難度高怎麼辦?如何避免踩坑呢?2023-11-09