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

?

SSL通信客户端检测信任任意证书

风险详情:自定义SSLx509 TrustManager,重写checkClientTrusted方法,方法内不做任何服务端的证书校验。

危害情况:黑客可以使用中间人攻击获取加密内容。

修复建议:严格判断服务端和客户端证书校验,对于异常事件禁止return 空或者null。

开放socket端口

风险详情:app绑定端口进行监听,建立连接后可接收外部发送的数据。

危害情况:攻击者可构造恶意数据对端口进行测试,对于绑定了IP 0.0.0.0的app可发起远程攻击。

修复建议:如无必要,只绑定本地ip127.0.0.1,并且对接收的数据进行过滤、验证。

第三大类:数据安全风险

数据储存:

SD卡数据被第三方程序访问

漏洞描述:发现调用getExternalStorageDirectory,存储内容到SD卡可以被任意程序访问,存在安全隐患。

安全建议:建议存储敏感信息到程序私有目录,并对敏感数据加密。

全局File可读写漏洞-openFileOutput

风险详情:openFileOutput(Stringname,int mode)方法创建内部文件时,将文件设置了全局的可读权限MODE_WORLD_READABLE。

危害情况:攻击者恶意读取文件内容,获取敏感信息。

修复建议:请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可读属性。

全局文件可写

?

风险详情:openFileOutput(Stringname,int mode)方法创建内部文件时,将文件设置了全局的可写权限MODE_WORLD_WRITEABLE。

危害情况:攻击者恶意写文件内容破坏APP的完整性。

修复建议:请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写属性。

全局文件可读可写

风险详情:openFileOutput(Stringname,int mode)方法创建内部文件时,将文件设置了全局的可读写权限。

危害情况:攻击者恶意写文件内容或者,破坏APP的完整性,或者是攻击者恶意读取文件内容,获取敏感信息。

修复建议:请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写、写属性。

私有文件泄露风险-getSharedPreferences:

配置文件可读

风险详情:使用getSharedPreferences打开文件时第二个参数设置为MODE_WORLD_READABLE。

危害情况:文件可以被其他应用读取导致信息泄漏。

修复建议:如果必须设置为全局可读模式供其他程序使用,请保证存储的数据非隐私数据或是加密后存储。

配置文件可写

风险详情:使用getSharedPreferences打开文件时第二个参数设置为MODE_WORLD_WRITEABLE。

危害情况:文件可以被其他应用写入导致文件内容被篡改,可能导致影响应用程序的正常运行或更严重的问题。

修复建议:使用getSharedPreferences时第二个参数设置为MODE_PRIVATE即可。

配置文件可读可写

风险详情:使用getSharedPreferences打开文件时,如将第二个参数设置为MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE。

危害情况:当前文件可以被其他应用读取和写入,导致信息泄漏、文件内容被篡改,影响应用程序的正常运行或更严重的问题。

修复建议:使用getSharedPreferences时第二个参数设置为MODE_PRIVATE。禁止使用MODE_WORLD_READABLE |MODE_WORLD_WRITEABLE模式。

数据加密:

明文数字证书漏洞

Apk使用的数字证书可被用来校验服务器的合法身份,以及在与服务器进行通信的过程中对传输数据进行加密、解密运算,保证传输数据的保密性、完整性。

明文存储的数字证书如果被篡改,客户端可能连接到假冒的服务端上,导致用户名、密码等信息被窃取;如果明文证书被盗取,可能造成传输数据被截获解密,用户信息泄露,或者伪造客户端向服务器发送请求,篡改服务器中的用户数据或造成服务器响应异常。

AES弱加密

风险详情:在AES加密时,使用了“AES/ECB/NoPadding”或“AES/ECB/PKCS5padding”的模式。

危害情况:ECB是将文件分块后对文件块做同一加密,破解加密只需要针对一个文件块进行解密,降低了破解难度和文件安全性。

修复建议:禁止使用AES加密的ECB模式,显式指定加密算法为:CBC或CFB模式,可带上PKCS5Padding填充。AES密钥长度最少是128位,推荐使用256位。

?

随机数不安全使用

风险详情:调用SecureRandom类中的setSeed方法。

危害情况:生成的随机数具有确定性,存在被破解的可能性。

修复建议:用/dev/urandom或/dev/random来初始化伪随机数生成器。

AES/DES硬编码密钥

风险详情:使用AES或DES加解密时,密钥采用硬编码在程序中。

危害情况:通过反编译获取密钥可以轻易解密APP通信数据。

修复建议:密钥加密存储或变形后进行加解密运算,不要硬编码到代码中。

数据传输:与上面的重复了,也可以把webview系列的漏洞归入这一小类。

第四大类:文件目录遍历类漏洞

Provider文件目录遍历

风险详情:当Provider被导出且覆写了openFile方法时,没有对Content Query Uri进行有效判断或过滤。

危害情况:攻击者可以利用openFile()接口进行文件目录遍历以达到访问任意可读文件的目的。

修复建议:一般情况下无需覆写openFile方法,如果必要,对提交的参数进行“../”目录跳转符或其他安全校验。

unzip解压缩漏洞

风险详情:解压 zip文件,使用getName()获取压缩文件名后未对名称进行校验。

危害情况:攻击者可构造恶意zip文件,被解压的文件将会进行目录跳转被解压到其他目录,覆盖相应文件导致任意代码执行。

修复建议:解压文件时,判断文件名是否有../特殊字符。

第五大类:文件格式解析类漏洞

?

FFmpeg文件读取

风险详情:使用了低版本的FFmpeg库进行视频解码。

危害情况:在FFmpeg的某些版本中可能存在本地文件读取漏洞,可以通过构造恶意文件获取本地文件内容。

修复建议:升级FFmpeg库到最新版。

安卓“Janus”漏洞

漏洞详情:向原始的AppAPK的前部添加一个攻击的classes.dex文件(A文件),安卓系统在校验时计算了A文件的hash值,并以”classes.dex”字符串做为key保存, 然后安卓计算原始的classes.dex文件(B),并再次以”classes.dex”字符串做为key保存,这次保存会覆盖掉A文件的hash值,导致Android系统认为APK没有被修改,完成安装,APK程序运行时,系统优先以先找到的A文件执行,忽略了B,导致漏洞的产生。

危害情况:该漏洞可以让攻击者绕过安卓系统的signature scheme V1签名机制,进而直接对App进行篡改。而且由于安卓系统的其他安全机制也是建立在签名和校验基础之上,该漏洞相当于绕过了安卓系统的整个安全机制。

修复建议:禁止安装有多个同名ZipEntry的APK文件。

?

第六大类:内存堆栈类漏洞

未使用编译器堆栈保护技术

风险详情:为了检测栈中的溢出,引入了Stack Canaries漏洞缓解技术。在所有函数调用发生时,向栈帧内压入一个额外的被称作canary的随机数,当栈中发生溢出时,canary将被首先覆盖,之后才是EBP和返回地址。在函数返回之前,系统将执行一个额外的安全验证操作,将栈帧中原先存放的canary和.data中副本的值进行比较,如果两者不吻合,说明发生了栈溢出。

危害情况:不使用StackCanaries栈保护技术,发生栈溢出时系统并不会对程序进行保护。

修复建议:使用NDK编译so时,在Android.mk文件中添加:LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all

未使用地址空间随机化技术

风险详情:PIE全称Position Independent Executables,是一种地址空间随机化技术。当so被加载时,在内存里的地址是随机分配的。

危害情况:不使用PIE,将会使得shellcode的执行难度降低,攻击成功率增加。

修复建议:NDK编译so时,加入LOCAL_CFLAGS := -fpie -pie开启对PIE的支持。

libupnp栈溢出漏洞

风险详情:使用了低于1.6.18版本的libupnp库文件。

危害情况:构造恶意数据包可造成缓冲区溢出,造成代码执行。

修复建议:升级libupnp库到1.6.18版本或以上。

第七大类:动态类漏洞

DEX文件动态加载

风险详情:使用DexClassLoader加载外部的 apk、jar 或 dex文件,当外部文件的来源无法控制时或是被篡改,此时无法保证加载的文件是否安全。

危害情况:加载恶意的dex文件将会导致任意命令的执行。

修复建议:加载外部文件前,必须使用校验签名或MD5等方式确认外部文件的安全性。

动态注册广播

风险详情:使用registerReceiver动态注册的广播在组件的生命周期里是默认导出的。

危害情况:导出的广播可以导致拒绝服务、数据泄漏或是越权调用。

修复建议:使用带权限检验的registerReceiver API进行动态广播的注册。

第八大类:校验或限定不严导致的风险或漏洞

Fragment注入

风险详情:通过导出的PreferenceActivity的子类,没有正确处理Intent的extra值。

危害情况:攻击者可绕过限制访问未授权的界面。

修复建议:当targetSdk大于等于19时,强制实现了isValidFragment方法;小于19时,在PreferenceActivity的子类中都要加入isValidFragment ,两种情况下在isValidFragment方法中进行fragment名的合法性校验。

隐式意图调用

风险详情:封装Intent时采用隐式设置,只设定action,未限定具体的接收对象,导致Intent可被其他应用获取并读取其中数据。

危害情况:Intent隐式调用发送的意图可被第三方劫持,导致内部隐私数据泄露。

修复建议:可将隐式调用改为显式调用。

第九大类:命令行调用类相关的风险或漏洞

动态链接库中包含执行命令函数

风险详情:在native程序中,有时需要执行系统命令,在接收外部传入的参数执行命令时没有做过滤或检验。

危害情况:攻击者传入任意命令,导致恶意命令的执行。

修复建议:对传入的参数进行严格的过滤。

原文地址:http://blog.51cto.com/13610827/2116789

时间: 2024-10-02 22:25:01

避免踩坑:易盾安全老司机起底Android九大漏洞,附解决建议的相关文章

安卓易学,爬坑不易——腾讯老司机的RecyclerView局部刷新爬坑之路

针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验.目前功能还在免费开放中. 点击地址:http://wetest.qq.com/cube立即体验! 作者:Hoolly,腾讯移动客户端开发工程师. 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处 WeTest导读 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人.下面让我们看看腾讯开发工程

放心嗨!Android 9 Pie发布,网易云易盾加固已第一时间适配

自5月份谷歌在年度开发者大会上首次亮相Android 9 P后,其正式版Android 9 Pie昨天正式发布,网易云易盾移动安全已在昨天第一时间里进行了最终适配. 早在今年初,易盾就做好了相关的准备工作.在谷歌Android P开发者预览版发布不久后,易盾的安全工程师就完成了加固等方面的测试. 在正式版Android 9 Pie推出前,作为谷歌的合作伙伴,易盾不断与谷歌的工程师紧密沟通,压测可能潜在的问题.同时,易盾积极参与了行业内Android P相关的专项活动,不断完善自己的解决方案. 整

网易云易盾推出面向微信小程序的大数据反作弊产品

近日,国内领先的业务风控服务网易云易盾对外推出面向微信小程序的大数据反作弊产品,源于网易20年的核心业务风控技术与全面稳健的策略模型,有机整合了设备指纹.IP画像.规则引擎等八大能力,可广泛应用电商营销.金融支付.生活服务类小程序场景,帮助企业防范微信小程序端的黑灰产作弊侵害. 易盾安全调查显示,小程序已成为企业业务风险环节新缺口 易盾安全经过调查发现,相比App,大部分互联网开发者还没有足够的能力利用小程序的特性建立起有效的风控策略."羊毛党"通过自己养号或着批量购买的大量微信号,就

vue+ vue-router + webpack 踩坑之旅

说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少不了res.render("xx",data)    这句话的意思就是去查找相应的模板文件然后在用数据去渲染在将渲染好的页面去返回给浏览器,给浏览器去解析,渲染模板其实就是做的替换字符串+拼接字符串的活  各种的模板引擎也有各个优化的点(比如可以将对应的模板编译的函数保存在内存中,然后在通

Android老司机搬砖小技巧

作为一名Android世界的搬运工,每天搬砖已经够苦够累了,走在坑坑洼洼的道路一不小心就掉坑里了. SDK常用工具类 Android SDK中本身就拥有很多轮子,熟悉这些轮子,可以提高我们的搬砖效率. android.text.TextUtils 字符串操作常用方法:isEmpty() ,join(),split()等 if(!TextUtils.isEmpty(text)){ //do something } android.webkit.URLUtil 链接相关常用方法:isHttpUrl(

之后要接触更多代码管理的知识——2015踩坑有感

前言 学习是没有止境的,管理代码的能力也永远需要提高. 前几个月还觉得R语言,业务上要用的都学得七七八八了呢,这几个月在自家部门吭哧吭哧搞报表自动化时,各个坑一踩一个准,才明白写代码,懂得一点语言特性固然重要,弄一套科学地管理代码的方法,却是势在必行. 因此在这里总结一下这几个月来我踩过的种种坑,以及之后在查阅种种大神的经验,以及学软件工程这门课时看到的一些比较妥当的方法,算是这几个月的一个总结.2016年的时候,真的要多学学如何科学地管理代码,科学开发 请注意,因为我属于跨专业半路出家写代码,

jQuery版本升级踩坑大全

背景 -------------------------------------------------------------------------------- jQuery想必各个web工程师都再熟悉不过了,不过现如今很多网站还采用了很古老的jQuery版本.其实如果早期版本使用不当,可能会有DOMXSS漏洞,非常建议升级到jQuery 1.9.x或以上版本.前段时间我就主导了这件事情,把公司里我们组负责的项目jQuery版本从1.4.2升级到了jQuery 1.11.3.jQuery官

jQuery升级踩坑大全

背景 jQuery想必各个web工程师都再熟悉不过了,不过现如今很多网站还采用了很古老的jQuery版本.其实如果早期版本使用不当,可能会有DOMXSS漏洞,非常建议升级到jQuery 1.9.x或以上版本.前段时间我就主导了这件事情,把公司里我们组负责的项目jQuery版本从1.4.2升级到了jQuery 1.11.3.jQuery官方也为类似升级工作提供了jQuery Migrate插件. 言归正传. 坑从何处来 jQuery 1.11.3是1.x时代的最后一个版本(作者更新:2016年1月

利用vue-router和compoment重构代码--踩坑

业务主要功能 获取所有的数据库列表 点击某一个数据库列表的时候,右侧分页展示数据 点击右侧某一条数据的时候,现实数据详情 以下是之前的页面,存在以下问题: 前段开发没有工程化(webpack) 主要功能耦合,列表,详情,(检索,重构的是为了加功能方便) 左侧的数据库链接是直接跳页的,分页的链接是跳页的,右侧点击的详情页却是vue-resource加载的 代码结构混乱,之前为了快速实现功能.所有代码写在一个文件上.难读. 功能效果图 数据列表页效果 数据详情效果 代码重构思路 前段模块化开发,用w