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时没有对证书的主机名进行校验,信任任意主机名下的合法的证书,导致加密通信可被还原成明文通信,加密传输遭到破坏。