阿里聚安全扫描器之本地拒绝服务检测详解
很多开发者没有意识到,如上使用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()时要指定好相应的访问权限。
五、参考
1、Android APP通用型拒绝服务漏洞分析报告,http://blogs.360.cn/blog/android-app%E9%80%9A%E7%94%A8%E5%9E%8B%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E6%8A%A5%E5%91%8A/