阿里聚安全的Android應用漏洞掃描器有一個檢測項是本地拒絕服務漏洞的檢測,採用的是靜態分析加動態模糊測試的方法來檢測,檢測結果準確全面。本文將講一下應用漏洞掃描器在針對本地拒絕服務的檢測方法。html
Android應用使用Intent機制在組件之間傳遞數據,若是應用在使用getIntent(),getAction(),Intent.getXXXExtra()獲取到空數據、異常或者畸形數據時沒有進行異常捕獲,應用就會發生Crash,應用不可以使用(本地拒絕服務)。惡意應用可經過向受害者應用發送此類空數據、異常或者畸形數據從而使應用產生本地拒絕服務。android
阿里聚安全的博客之前有一篇文章《Android應用本地拒絕服務漏洞淺析》,裏面詳細講了產生本地拒絕服務的四種狀況:shell
NullPointerException空數據異常:應用程序沒有對getAction()等獲取到的數據進行空指針判斷,從而致使空指針異常而致使應用崩潰。數組
ClassCastException類型轉換異常:程序沒有對getSerializableExtra()等獲取到的數據進行類型判斷而進行強制類型轉換,從而致使類型轉換異常而致使應用崩潰。安全
IndexOutOfBoundsException數組越界異常:程序沒有對getIntegerArrayListExtra()等獲取到的數據數組元素大小的判斷,從而致使數組訪問越界而致使應用崩潰。網絡
ClassNotFoundException異常:程序沒有沒法找到從getSerializableExtra ()獲取到的序列化類對象的類定義,所以發生類未定義的異常而致使應用崩潰。app
當應用被惡意應用攻擊時,本地拒絕服務通常會致使正在運行的應用崩潰,首先影響用戶體驗,其次影響到後臺的Crash統計數據,另外比較嚴重的後果是應用若是是系統級的軟件,可能致使手機重啓。Nexus 5曾經出現過這樣的狀況,它預裝了一個用來測試網絡連通性的系統應用,這個應用是隱藏狀態,沒法在桌面上打開,包名爲com.lge.SprintHiddenMenu。在Android 4.4.3以前的版本里,這個應用裏有大量導出的activity,這些 activity不須要任何權限就能夠被外部調用。其中一個爲com.lge.SprintHiddenMenu.sprintspec.SCRTN的組件是導出的,而且沒有任何權限限制,給它發送一個空Intent,可致使Nexus 5手機重啓。ide
一個簡單的本地拒絕服務類漏洞,要想進行大規模的自動化掃描,掃描器也要作很多的工做,而且隨着對本地拒絕服務漏洞的認識,阿里聚安全的漏洞掃描器也在不斷進行優化提升。函數
這個階段的掃描器是初級階段,通常只是經過AndroidManifest.xml文件獲取應用導出的組件,而後使用adb命令發送空intent給導出組件,捕獲應用日誌輸出,查看是否有崩潰產生。工具
針對空Intent致使的本地拒絕服務狀況可發送以下命令測試:
adb shell am start -n com.jaq.dosappsample/.DosActivity adb shell am startservice -n com.jaq.dosappsample/.DosService adb shell am broadcast -n com.jaq.dosappsample/.DosReceiver
何爲導出的組件?
在AndroidManifest.xml文件中若是應用的組件android:exported屬性顯式指定爲「true」,或者並無顯式指定爲「true」也沒有顯式指定爲「false」,什麼也沒有寫,可是有intent-filter並指定了相應的Action,則此組件爲導出的組件。
空Intent致使的拒絕服務畢竟只是一部分,還有類型轉換異常、數組越界異常等致使的本地拒絕服務。在解析Key值階段掃描器須要分析組件代碼中是否使用了一些關鍵函數。
在Activity組件中的onCreate()方法中,Service組件中的onBind()和onStartCommand()方法中,BroadcastReceiver組件的onReceive()方法中,若是組件沒有作好權限控制,均可接受任意外部應用傳過來的Intent,經過查找getIntent()、getAction()和getXXExtra()這些關鍵函數,檢測其是否有try catch異常保護,若是沒有則會有本地拒絕服務風險。
在這一階段掃描器遇到的挑戰是找到這些關鍵函數中的Key值,Action值,不只要找到,還要找到key對應的類型,來組裝adb命令,發送命令給安裝好的應用進行測試。
2015年年初的時候,業界又爆出了通用型拒絕服務,因爲應用中使用了getSerializableExtra() 的API,應用開發者沒有對傳入的數據作異常判斷,惡意應用能夠經過傳入序列化數據,致使應用本地拒絕服務。此種方法傳入的key值不論是否與漏洞應用相同,都會拋出類未定義的異常,相比解析Key值階段通用性大大獲得了提升。
針對這個經常使用的手工檢測POC代碼以下:
此階段掃描器遇到的難題是沒法直接經過adb命令進行測試,由於沒法用adb命令傳遞序列化對象給應用。業界大部分漏洞掃描器也由於沒法發送序列化對象給應用都止步解析Key值組裝adb命令階段,而阿里聚安全的漏洞掃描器可以發送序列化對象數據給指定的應用,再結合靜態分析查找導出的組件和關鍵函數,動態運行應用,精確識別出會發生本地拒絕服務的應用組件,同時實現了大規模自動化測試。
BroadcastReceiver組件通常分爲兩種,一種是靜態註冊,提早在AndroidManifest.xml聲明組件;另一種是動態註冊,在代碼中使用registerReceiver()方法註冊BroadcastReceiver,只有當registerReceiver()的代碼執行到了才進行註冊。
動態註冊BroadcastReceiver的常見使用方法以下:
不少開發者沒有意識到,如上使用registerReceiver()方法註冊的是全局BroadcastReceiver,和靜態註冊BroadcastReceiver android:exported屬性爲true性質同樣,若是沒有指定權限訪問控制(permission參數),能夠被任意外部應用訪問,向其傳遞Intent,根據具體狀況產生的危害可能不一樣,一種比較廣泛的狀況是容易產生本地拒絕服務漏洞。
動態註冊BroadcastReceiver致使導出的Receiver這種狀況很是少被你們注意,現有的一些安全檢測工具、掃描器都不能發現動態註冊的BroadcastReceiver。在此階段,動態註冊BroadcastReceiver隱藏在全部代碼中,在應用的任何地方均可能出現,須要掃描器全局分析應用的代碼找出關鍵函數registerReceiver,還要找出其IntentFilter所設置的Action和Receiver的權限設置,如今通常一個普通的正常Android應用都有幾十M的大小,反編譯成smali代碼會更多,掃描器遇到的挑戰主要是查找的時間和空間挑戰,還有多個參數查找的準確性。目前業界只有阿里聚安全的掃描器有準確掃描動態註冊BroadcastReceiver致使的本地拒絕服務的能力。
經過阿里聚安全的漏洞掃描器對一些樣本進行了檢測,也發現了很多動態註冊BroadcastReceiver致使的本地拒絕服務攻擊。
爲了瞭解本地拒絕服務漏洞的現狀,阿里聚安全的應用漏洞掃描器針對國內外的各行業主要APP進行了掃描,共掃描了三百多款APP。
國內行業主要是經過採集國內某應用市場的APP,咱們採集了各個行業的TOP APP總共有151個,發現拒絕服務漏洞的總個數爲970個,平均個數爲6.4個,其中影音播放類的APP本地拒絕服務個數最多,健康類安全類和運營商類比較少、遊戲類的最少。
國內行業APP本地拒絕服務漏洞狀況:
柱狀圖是國內各個行業APP按本地拒絕服務漏洞平均個數排序:
下圖是各個組件引發的本地拒絕服務的數量、佔比狀況:
國內行業動態註冊BroadcastReceiver致使的本地拒絕服務漏洞有247個,約佔拒絕服務漏洞總數的25%,比靜態註冊BroadcastReceiver的要多很多:
國外行業主要是經過採集Google Play上的APP,咱們也採集了各個行業的TOP APP總共有177個,發現拒絕服務漏洞的總個數是649個,平均漏洞個數爲3.7個,平均漏洞個數最多的是辦公類應用,最少的和國內行業同樣是遊戲。
國外行業APP本地拒絕服務漏洞狀況:
國外各個行業的應用本地拒絕服務漏洞平均個數排序:
各個組件引發的本地拒絕服務的數量、佔比狀況:
國外行業動態註冊BroadcastReceiver致使的本地拒絕服務漏洞有147個,約佔拒絕服務漏洞總數的23%,比國內的狀況略少,可見動態註冊BroadcastReceiver致使的本地拒絕服務都沒有引發你們的重視。
整體上來看,本地拒絕服務風險由於具備Android版本無關性,漏洞自己對APP影響也不大,只與應用開發者是否注意、重視有關,因此如今還常常在應用中出現。在各大廠商的安全應急響應中心評級爲低危漏洞,也有廠商不收此類漏洞,可是這些攻擊面依然存在,若是深刻分析這些組件,有的不只僅是引起本地拒絕服務風險,必須遵循最小權限原則,沒有必要導出的組件不要導出。
(1)阿里聚安全的漏洞掃描器已經具有覆蓋動態註冊Receiver產生的拒絕服務漏洞(目前,還沒發現友商的漏洞掃描器有這樣的能力),使用阿里聚安全的漏洞掃描器進行掃描,可及時發現這些漏洞。
(2)沒必要要導出的組件將其exported屬性顯式的設爲「false」,這樣能夠減小應用的攻擊面。
(3)導出的組件在getIntent()後,Intent.getXXXExtra()時用try…catch作好異常處理。
(4)在導出的組件設置好權限控制,不讓任意第三方應用訪問。
(5)對於動態註冊的BroadcastReceiver,儘可能少用registerReceiver()方法,若是隻在本應用內通訊,改用LocalBroadcastManager的registerReceiver()進行本地註冊,若是必須導出給外部應用,在使用registerReceiver()時要指定好相應的訪問權限。
一、Android APP通用型拒絕服務漏洞分析報告,http://blogs.360.cn/blog/andr...
二、 Android應用本地拒絕服務漏洞淺析,https://jaq.alibaba.com/blog....
三、https://developer.android.com...
四、https://developer.android.com...
五、https://developer.android.com...
六、https://labs.mwrinfosecurity....