阿里聚安适Android应用缝隙扫描器解析:本地拒绝处事检测详解 8090安适门户
阿里聚安适的Android应用缝隙扫描器有一个检测项是本地拒绝处事缝隙的检测,给与的是静态分析加动态模糊测试的要领来检测,检测功效准确全面。本文将讲一下应用缝隙扫描器在针对本地拒绝处事的检测要领。
一、本地拒绝处事孕育产生原因和影响
Android应用使用Intent机制在组件之间通报数据,如果应用在使用getIntent(),getAction(),Intent.getXXXExtra()获取到空数据、异常或者畸形数据时没有进行异常捕获,应用就会产生Crash,应用不成使用(本地拒绝处事)。恶意应用可通过向受害者应用发送此类空数据、异常或者畸形数据从而使应用孕育产生本地拒绝处事。
阿里聚安适的博客以前有一篇文章《Android应用本地拒绝处事缝隙浅析》,里面详细讲了孕育产生本地拒绝处事的四种情况:
1、NullPointerException空数据异常:应用措施没有对getAction()等获取到的数据进行空指针判断,从而导致空指针异常而导致应用瓦解。
2、ClassCastException类型转换异常:措施没有对getSerializableExtra()等获取到的数据进行类型判断而进行强制类型转换,从而导致类型转换异常而导致应用瓦解。
3、IndexOutOfBoundsException数组越界异常:措施没有对getIntegerArrayListExtra()等获取到的数据数组元素巨细的判断,从而导致数组访谒越界而导致应用瓦解。
4、ClassNotFoundException异常:措施没有无法找到从getSerializableExtra ()获取到的序列化类东西的类界说,因此产生类不决义的异常而导致应用瓦解。
当应用被恶意应用打击时,本地拒绝处事一般会导致正在运行的应用瓦解,首先影响用户体验,其次影响到后台的Crash统计数据,此外对照严重的后果是应用如果是系统级的软件,可能导致手机重启。Nexus 5曾经呈现过这样的情况,它预装了一个用来测试网络连通性的系统应用,这个应用是隐藏状态,无法在桌面上打开,包名为com.lge.SprintHiddenMenu。在Android 4.4.3之前的版本里,这个应用里有大量导出的activity,这些 activity不需要任何权限就可以被外部挪用。此中一个为com.lge.SprintHiddenMenu.sprintspec.SCRTN的组件是导出的,并且没有任何权限限制,给它发送一个空Intent,可导致Nexus 5手机重启。
二、阿里聚安适扫描器的进化提升
一个简单的本地拒绝处事类缝隙,要想进行大规模的自动化扫描,扫描器也要做不少的事情,并且跟着对本地拒绝处事缝隙的认识,阿里聚安适的缝隙扫描器也在不停进行优化提高。
2.1 空Intent阶段
这个阶段的扫描器是低级阶段,一般只是通过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,则此组件为导出的组件。
2.2 解析Key值阶段
空Intent导致的拒绝处事终究只是一部分,还有类型转换异常、数组越界异常等导致的本地拒绝处事。在解析Key值阶段扫描器需要分析组件代码中是否使用了一些关键函数。
在Activity组件中的onCreate()要领中,Service组件中的onBind()和onStartCommand()要领中,BroadcastReceiver组件的onReceive()要领中,如果组件没有做好权限控制,都可接受任不测部应用传过来的Intent,通过查找getIntent()、getAction()和getXXExtra()这些关键函数,检测其是否有try catch异常掩护,如果没有则会有本地拒绝处事危害。
在这一阶段扫描器遇到的挑战是找到这些关键函数中的Key值,Action值,不只要找到,还要找到key对应的类型,来组装adb命令,发送命令给安置好的应用进行测试。
2.3 通用型拒绝处事阶段
2015年年初的时候,业界又爆出了通用型拒绝处事,由于应用中使用了getSerializableExtra() 的API,应用开发者没有对传入的数据做异常判断,恶意应用可以通过传入序列化数据,导致应用本地拒绝处事。此种要领传入的key值不管是否与缝隙应用不异,城市抛出类不决义的异常,对比解析Key值阶段通用性大大得到了提高。
针对这个常用的手工检测POC代码如下:
此阶段扫描器遇到的难题是无法直接通过adb命令进行测试,因为无法用adb命令通报序列化东西给应用。业界大部分缝隙扫描器也因为无法发送序列化东西给应用都止步解析Key值组装adb命令阶段,而阿里聚安适的缝隙扫描器能够发送序列化东西数据给指定的应用,再结合静态分析查找导出的组件和关键函数,动态运行应用,精确识别出会产生本地拒绝处事的应用组件,同时实现了大规模自动化测试。
2.4 动态注册BroadcastReceiver阶段
BroadcastReceiver组件一般分为两种,一种是静态注册,提前在AndroidManifest.xml声明组件;此外一种是动态注册,在代码中使用registerReceiver()要领注册BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册。
动态注册BroadcastReceiver的常见使用要领如下:
很多开发者没有意识到,如上使用registerReceiver()要领注册的是全局BroadcastReceiver,和静态注册BroadcastReceiver android:exported属性为true性质一样,如果没有指定权限访谒控制(permission参数),可以被任不测部应用访谒,向其通报Intent,按照具体情况孕育产生的风险可能差别,一种对照遍及的情况是容易孕育产生本地拒绝处事缝隙。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12913.html