避免踩坑:易盾安全老司机起底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时没有对证书的主机名进行校验,信任任意主机名下的合法的证书,导致加密通信可被还原成明文通信,加密传输遭到破坏。

你可能感兴趣的:(android)