android应用会遇到各种各样的漏洞,如何从细节上了解各种安全隐患,积极采取适当的防御措施便变得尤为重要。为了让大家对android漏洞有一个非常全面的认识,小编专门邀请资深安全工程师为大家详细解读常见的android漏洞,仅供参考。
第一大类:android manifest配置相关的风险或漏洞
1、程序可被任意调试
风险详情:安卓应用apk配置文件android manifest.xml中android:debuggable=true,调试开关被打开。
危害情况:app可以被调试。
修复建议:把android manifest.xml配置文件中调试开关属性关掉,即设置android:debugable="false"。
2、程序数据任意备份
风险详情:安卓应用apk配置文件androidmanifest.xml中android:allowbackup=true,数据备份开关被打开。
危害情况:app应用数据可被备份导出。
修复建议:把androidmanifest.xml配置文件备份开关关掉,即设置android:allowbackup="false"。
组件暴露:建议使用android:protectionlevel="signature"验证调用来源。
3、activity组件暴露
风险详情:activity组件的属性exported被设置为true或是未设置exported值但intentfilter不为空时,activity被认为是导出的,可通过设置相应的intent唤起activity。
危害情况:黑客可能构造恶意数据针对导出activity组件实施越权攻击。
修复建议:如果组件不需要与其他app共享数据或交互,请将androidmanifest.xml 配置文件中设置该组件为exported = “false”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。
4、service组件暴露
风险详情:service组件的属性exported被设置为true或是未设置exported值但intentfilter不为空时,service被认为是导出的,可通过设置相应的intent唤起service。
危害情况:黑客可能构造恶意数据针对导出service组件实施越权攻击。
修复建议:如果组件不需要与其他app共享数据或交互,请将androidmanifest.xml 配置文件中设置该组件为exported = “false”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。
5、contentprovider组件暴露
风险详情:content provider组件的属性exported被设置为true或是android api<=16时,content provider被认为是导出的。
危害情况:黑客可能访问到应用本身不想共享的数据或文件。
修复建议:如果组件不需要与其他app共享数据或交互,请将androidmanifest.xml 配置文件中设置该组件为exported = “false”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。
6、broadcastreceiver组件暴露
风险详情:broadcastreceiver组件的属性exported被设置为true或是未设置exported值但intentfilter不为空时,broadcastreceiver被认为是导出的。
危害情况:导出的广播可以导致数据泄漏或者是越权。
修复建议:如果组件不需要与其他app共享数据或交互,请将androidmanifest.xml 配置文件中设置该组件为exported = “false”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。
7、intent scheme urls攻击
风险详情:在androidmanifast.xml设置scheme协议之后,可以通过浏览器打开对应的activity。
危害情况:攻击者通过访问浏览器构造intent语法唤起app相应组件,轻则引起拒绝服务,重则可能演变对app进行越权调用甚至升级为提权漏洞。
修复建议:app对外部调用过程和传输数据进行安全检查或检验,配置category filter, 添加android.intent.category.browsable方式规避风险
第二大类:webview组件及与服务器通信相关的风险或漏洞
1、webview存在本地java接口
风险详情:android的webview组件有一个非常特殊的接口函数addjavascriptinterface,能实现本地java与js之间交互。
危害情况:在targetsdkversion小于17时,攻击者利用addjavascriptinterface这个接口添加的函数,可以远程执行任意代码。
修复建议:建议开发者不要使用addjavascriptinterface,使用注入javascript和第三方协议的替代方案。
2、webview组件远程代码执行(调用getclassloader)
风险详情:使用低于17的targetsdkversion,并且在context子类中使用addjavascriptinterface绑定this对象。
危害情况:通过调用getclassloader可以绕过google底层对getclass方法的限制。
修复建议:targetsdkversion使用大于17的版本。
3、webview忽略ssl证书错误
风险详情:webview调用onreceivedsslerror方法时,直接执行handler.proceed()来忽略该证书错误。
危害情况:忽略ssl证书错误可能引起中间人攻击。
修复建议:不要重写onreceivedsslerror方法, 或者对于ssl证书错误问题按照业务场景判断,避免造成数据明文传输情况。
4、webview启用访问文件数据
风险详情:webview中使用setallowfileaccess(true),app可通过webview访问私有目录下的文件数据。
危害情况:在android中,mwebview.setallowfileaccess(true)为默认设置。当setallowfileaccess(true)时,在file域下,可执行任意的javascript代码,如果绕过同源策略能够对私有目录文件进行访问,导致用户隐私泄漏。
修复建议:使用webview.getsettings().setallowfileaccess(false)来禁止访问私有文件数据。
5、ssl通信服务端检测信任任意证书
风险详情:自定义ssl x509 trustmanager,重写checkservertrusted方法,方法内不做任何服务端的证书校验。
危害情况:黑客可以使用中间人攻击获取加密内容。
修复建议:严格判断服务端和客户端证书校验,对于异常事件禁止return 空或者null。
6、https关闭主机名验证
风险详情:构造httpclient时,设置hostnameverifier时参数使用allow_all_hostname_verifier或空的hostnameverifier。
危害情况:关闭主机名校验可以导致黑客使用中间人攻击获取加密内容。
修复建议:app在使用ssl时没有对证书的主机名进行校验,信任任意主机名下的合法的证书,导致加密通信可被还原成明文通信,加密传输遭到破坏。
7、ssl通信客户端检测信任任意证书
风险详情:自定义ssl x509 trustmanager,重写checkclienttrusted方法,方法内不做任何服务端的证书校验。
危害情况:黑客可以使用中间人攻击获取加密内容。
修复建议:严格判断服务端和客户端证书校验,对于异常事件禁止return 空或者null。
8、开放socket端口
风险详情:app绑定端口进行监听,建立连接后可接收外部发送的数据。
危害情况:攻击者可构造恶意数据对端口进行测试,对于绑定了ip 0.0.0.0的app可发起远程攻击。
修复建议:如无必要,只绑定本地ip127.0.0.1,并且对接收的数据进行过滤、验证。
第三大类:数据安全风险
1、数据存储
sd卡数据被第三方程序访问
漏洞描述:发现调用getexternalstoragedirectory,存储内容到sd卡可以被任意程序访问,存在安全隐患。
安全建议:建议存储敏感信息到程序私有目录,并对敏感数据加密
全局file可读写漏洞-openfileoutput
风险详情:openfileoutput(string name,int mode)方法创建内部文件时,将文件设置了全局的可读权限mode_world_readable。
危害情况:攻击者恶意读取文件内容,获取敏感信息。
修复建议:请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可读属性。
全局文件可写
风险详情:openfileoutput(string name,int mode)方法创建内部文件时,将文件设置了全局的可写权限mode_world_writeable。
危害情况:攻击者恶意写文件内容破坏app的完整性。
修复建议:请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写属性。
全局文件可读可写
风险详情:openfileoutput(string name,int mode)方法创建内部文件时,将文件设置了全局的可读写权限。
危害情况:攻击者恶意写文件内容或者,破坏app的完整性,或者是攻击者恶意读取文件内容,获取敏感信息。
修复建议:请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写、写属性。
2、私有文件泄露风险-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模式。
3、数据加密
明文数字证书漏洞:
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系列的漏洞归入这一小类。
第四大类:文件目录遍历类漏洞
1、provider文件目录遍历
风险详情:当provider被导出且覆写了openfile方法时,没有对content query uri进行有效判断或过滤。
危害情况:攻击者可以利用openfile()接口进行文件目录遍历以达到访问任意可读文件的目的。
修复建议:一般情况下无需覆写openfile方法,如果必要,对提交的参数进行“../”目录跳转符或其他安全校验。
2、unzip解压缩漏洞
风险详情:解压zip文件,使用getname()获取压缩文件名后未对名称进行校验。
危害情况:攻击者可构造恶意zip文件,被解压的文件将会进行目录跳转被解压到其他目录,覆盖相应文件导致任意代码执行。
修复建议:解压文件时,判断文件名是否有../特殊字符。
第五大类:文件格式解析类漏洞
1、ffmpeg文件读取
风险详情:使用了低版本的ffmpeg库进行视频解码。
危害情况:在ffmpeg的某些版本中可能存在本地文件读取漏洞,可以通过构造恶意文件获取本地文件内容。
修复建议:升级ffmpeg库到最新版。
2、安卓“janus”漏洞
漏洞详情:向原始的app apk的前部添加一个攻击的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文件。
第六大类:内存堆栈类漏洞
1、未使用编译器堆栈保护技术
风险详情:为了检测栈中的溢出,引入了stack canaries漏洞缓解技术。在所有函数调用发生时,向栈帧内压入一个额外的被称作canary的随机数,当栈中发生溢出时,canary将被首先覆盖,之后才是ebp和返回地址。在函数返回之前,系统将执行一个额外的安全验证操作,将栈帧中原先存放的canary和.data中副本的值进行比较,如果两者不吻合,说明发生了栈溢出。
危害情况:不使用stack canaries栈保护技术,发生栈溢出时系统并不会对程序进行保护。
修复建议:使用ndk编译so时,在android.mk文件中添加:local_cflags := -wall -o2 -u_fortify_source -fstack-protector-all
2、未使用地址空间随机化技术
风险详情:pie全称position independent executables,是一种地址空间随机化技术。当so被加载时,在内存里的地址是随机分配的。
危害情况:不使用pie,将会使得shellcode的执行难度降低,攻击成功率增加。
修复建议:ndk编译so时,加入local_cflags := -fpie -pie开启对pie的支持。
3、libupnp栈溢出漏洞
风险详情:使用了低于1.6.18版本的libupnp库文件。
危害情况:构造恶意数据包可造成缓冲区溢出,造成代码执行。
修复建议:升级libupnp库到1.6.18版本或以上。
第七大类:动态类漏洞
1、dex文件动态加载
风险详情:使用dexclassloader加载外部的apk、jar 或dex文件,当外部文件的来源无法控制时或是被篡改,此时无法保证加载的文件是否安全。
危害情况:加载恶意的dex文件将会导致任意命令的执行。
修复建议:加载外部文件前,必须使用校验签名或md5等方式确认外部文件的安全性。
2、动态注册广播
风险详情:使用registerreceiver动态注册的广播在组件的生命周期里是默认导出的。
危害情况:导出的广播可以导致拒绝服务、数据泄漏或是越权调用。
修复建议:使用带权限检验的registerreceiver api进行动态广播的注册。
第八大类:校验或限定不严导致的风险或漏洞
1、fragment注入
风险详情:通过导出的preferenceactivity的子类,没有正确处理intent的extra值。
危害情况:攻击者可绕过限制访问未授权的界面。
修复建议:当targetsdk大于等于19时,强制实现了isvalidfragment方法;小于19时,在preferenceactivity的子类中都要加入isvalidfragment ,两种情况下在isvalidfragment方法中进行fragment名的合法性校验。
2、隐式意图调用
风险详情:封装intent时采用隐式设置,只设定action,未限定具体的接收对象,导致intent可被其他应用获取并读取其中数据。
危害情况:intent隐式调用发送的意图可被第三方劫持,导致内部隐私数据泄露。
修复建议:可将隐式调用改为显式调用。
第九大类:命令行调用类相关的风险或漏洞
1、动态链接库中包含执行命令函数:
风险详情:在native程序中,有时需要执行系统命令,在接收外部传入的参数执行命令时没有做过滤或检验。
危害情况:攻击者传入任意命令,导致恶意命令的执行。
修复建议:对传入的参数进行严格的过滤。
发表评论