Android常见漏洞¶
Android漏洞可能存在的点:
- 协议——通信协议(本地、网络),协议大部分是由C/C++实现,存在以下安全问题:通信数据引发的逻辑漏洞;通信数据引发的
缓冲区溢出等可能导致远程代码执行/拒绝服务的代码漏洞。 - 组件安全——Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器中可能存在的安全问题,其中最主要的就是intent组件通信导致的拒绝服务/越权漏洞。
- 开放端口——可通过命令查看各APP运行时存在的开放端口,然后去逆向分析APP查看其在此开放端口上进行的操作,从而找寻可能的漏洞。
- IPC(进程间通信)安全——同1。
- 文件读写安全/数据加密安全——Android平台上的隐私泄露也是一个值得关注的攻击面。
Android APP常见安全漏洞¶

AndroidManifest.xml配置文件中默认设置相关问题¶
- allowBackup默认设置风险(Android 2.1以上的系统可为App提供应用程序数据的备份和恢复功能,AndroidManifest.xml文件中的allowBackup属性值控制,其默认值为true。当该属性没有显式设置为false时,攻击者可通过adb backup和adb restore对App的应用数据进行备份和恢复。)
- Debuggable默认设置风险
- 组件默认导出风险
WebView的默认设置问题¶
在 Android开发中,经常会使用 Webview来实现WEB页面的展示,在 Activity中启动自己的浏览器或者简单的展示一些在线内容等。
- setAllowFileAccess()
- setAllowContentAccess()
- setAllowFileAccessFromFileURLs()
- setAllowUniversalAccessFromFileURLs()
-
setSavePassword()
-
Webview默认开启密码保存功能 mWebview.setSavePassword(true),如果该功能未关闭,在用户输入密码时,会弹出提示框,询问用户是否保存密码,如果选择“是”,密码会被明文保到
/data/data/com.package.name/databases/webview.db,如果手机被root之后,获取roo权限的APP就可以任意读取私有目录下的文件去获取用户的密码,因此建议用户密码需要加密存储。 - Android中默认mWebView.setAllowFileAccess(true),在File域下,能够执行任意的JavaScript代码,同源策略跨域访问能够对私有目录文件进行访问等。APP对嵌入的 Webview未对file://形式的URL做限制,会导致隐私信息泄露,针对IM类软件会导致聊天信息、联系人等等重要信息泄露,针对浏览器类软件,则更多的是 cookie信息泄露。
网络相关¶
https通信安全漏洞¶
在Android中使用SSL/TLS协议,通过校验服务器端证书来实现安全通信。(这里指单向SSL校验,与之对应的是双向SSL校验,双向SSL指的是同时校验客户端和服务器端证书。) https证书不校验漏洞:忽略SSL证书校验、忽略域名校验、证书颁发机构被攻击导致私钥泄露,导致中间人攻击,攻击者可通过中间人攻击,盗取账户密码明文、聊天内容、通讯地址、电话号码以及信用卡支付信息等敏感信息,甚至通过中间人劫持将原有信息替换成恶意链接或恶意代码程序,以达到远程控制、恶意扣费等攻击意图。
忽略SSL证书校验¶
原理¶
- 在自定义实现X509TrustManager时,checkServerTrusted中没有检查证书是否可信,导致通信过程中可能存在中间人攻击,造成敏感数据劫持危害。
- 在重写 WebviewClient的 onReceivedSslError方法时,调用 proceed忽略证书验证错误信息继续加载页面,导致通信过程中可能存在中间人攻击,造成敏感数据劫持危害。
防护¶
- 建议自定义实现X509TrustManager时,在 checkServerTrusted中对服务器信息进行严格校验。针对自定义 TrustManager,检查 checkServerTrusted()函数是否为空实现。
- 建议不要重写 TrustManager和 HostnameVerifier,使用系统默认的。
- 在重写 WebViewClient的。 onReceivedSslError方法时,避兔调用 proceed忽略证书验证错误信息继续加载页面。
- 禁止使用proceed()函数忽略证书错误,应该抛给系统进行安全警告。
忽略域名校验¶
原理¶
- 在自定义实现 HostnameVerifier时,没有在verify中进行严格证书校验,导致通信过程中可能存在中间人攻击,造成敏感数据劫持危害。
- 在HostnameVerifier方法中使用
ALLOW_ALL_HOSTNAME_VERIFIER,信任所有Hostname,导致通信过程中可能存在中间人攻击,造成敏感数据劫持危害。
防护¶
- 在自定义实现 HostnameVerifier时,在verify中对Hostname进行严格校验。
- 建议在HostnameVerifier方法中使用
STRICT_HOSTNAME_VERIFIER进行严格证书校验,避免使用ALLOW_ALL_HOSTNAME_VERIFIER。
WebView安全漏洞¶
- 远程代码执行漏洞
- UXSS
- Webview设置方面的安全风险
- Webview忽略证书错误漏洞
- Webview File域同源策略绕过漏洞
WebView设置方面的安全风险¶
setJavaScriptEnabled(),默认为false,即不允许执行JS代码。webview.getWebSettings().setavaScriptEnabled(true);setPluginState(),它有三个状态值ON、ON DEMAND、OFF,默认为OFF。setAllowFileAccess()默认为true,即允许从WebView访问本地文件。setAllowContentAccess()默认为true,即允许从WebView加载Content URL,读取content provider相关内容。setAllowFileAccessFromFileURLs(),这个函数的作用是在JS没有禁用的情况下,设置是否允许file协议的URL访问其他file协议的URL的文件内容。API15及以下默认值为true,API16及以上默认为false。setAllowUniversalAccessFromFileURLs(),这个函数的作用是在JS没有禁用的情况下,设置是否允许file协议的URL访问其他任意来源的内容。setSavePassword()默认值为true,这个函数的作用是设置是否允许WebView自动保存密码。
Webview File域同源策略绕过漏洞¶
原理¶
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(JavaScript、 ActionScript)在没明确授权的情况下,不能读写对方的资源。简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上。同源策略是由 Netscape提出的一个著名的安全策略,现在所有支持 JavaScript的浏览器都会使用这个策略。 在Android系统中,APP访问网页一般是使用浏览器或者是使用了 Android系统内置的 webview组件。如果 Webview没有禁止使用file域并且Webview打开了对 JavaScript的支持。通过 Webview对 javascript 的延时执行和将当前Html文件删除掉并软连接指向其他文件就可以读取到被符号链接所指的文件,然后通过 JavaScript再次读取HTML文件,即可获取到被符号链接所指的文件。
防护¶
-
将不必要导出的组件设置为不导出。
-
如果应用的需要导出包含 Webview的组件,禁止使用File域协议。
myWebView.getSettings.setAllowFileAccess(false);
- 如果需要使用File协议,禁止File协议调用 JavaScript。
myWebView.getSettings.setavaScriptEnabled(false)
WebView安全防护¶
- 手机厂商把手机内置的WebView与google保持更新一致。
- 手机厂商把手机内置的浏览器漏洞修补程度要与Google官方保持一致,并且检测个性化自定义的暴露的API接口。
- 手机浏览器厂商浏览器漏洞修补程度要与 Google官方保持一致,并且检测个性化自定义的暴露的API接口。
- APP开发人员注意 webview的各项默认设置。
- 用户随时把手机的内置 webview以及使用的浏览器更新到最新版本。
白名单绕过漏洞¶
签名白名单绕过¶
关于Android签名¶
Android签名apk之后,会有一个META-INF文件夹,这里有三个文件:
- MANIFEST.MF
存储的是每一个文件对应的SHA1(或者SHA256)消息摘要算法提取出该文件的摘要然后进行BASE64编码。
- CERT.SF
计算这个MANIFEST.MF文件的整体SHA1值,再经过BASE64编码后,记录在CERT.SF主属性块(在文件头上)的SHA1-Digest-Manifest属性值值下。
逐条计算MANIFEST.MF文件中每一个块的SHA1,并经过BASE64编码后,记录在CERT.SF中的同名 块中,属性的名字是SHA1-Digest。
- CERT.RSA
会把之前生成的 CERT.SF文件,用私钥计算出签名,然后将签名以及包含公钥信息的数字证书一同写入CERTRSA 中保存。CERTRSA是一个满足PKCS7格式的文件。
除了RSA格式的文件还有 CERT.DSA/EC两种格式,Android支持DSA、RSA、EC三种加密算法进行签名,都是用来保存用私钥计算出 CERT.SF文件的数字签名、证书发布机构、有效期、公钥、所有者、签名算法等信息。 正常情况下,一个APK中只会生成一个 CERT.RSA/DSA/EC签名文件。但若在APK压缩包中加入其他的签名文件,即可同时存在两个或两个以上的签名文件。
URL白名单绕过漏洞¶
手机应用在特定环境下需要打开外部传入的URL,或者使用外部传入的URL去下载。为了对打开或下载的URL做控制,就需要对域名进行校验。
对URL的域名进行校验,一般习惯使用系统API,getHost来获取域名进行字符串比较,但是由于getHost这个系统API的设计缺陷,使其可以被绕过。
[http://192.168.0.11\.163.com/2.html](http://192.168.0.11\.163.com/2.html) `这个URL使用getHost得到的域名是`192.168.0.11\.163.com`,这样在判断是很容易判断为正常域名可以进行访问,但是在实际打开这个URL时,android的webview会将URL解析为`[http://192.168.0.1/.163.com/2.html](http://192.168.0.1/.163.com/2.html) `来访问,这样.163.com就变为了192.168.0.1这个IP地址下的一个path。这样webview就可能被打开一些不受控制的网页。但是在使用HttpClient等API进行访问时会解析为`[http://192.168.0.1.163.com/2.html](http://192.168.0.1.163.com/2.html)` 所以此时并不能正常访问。但是由于开发习惯,一般这个对域名进行校验的方法会作为一个公共方法使用,所以建议使用其他方法来判断。
对于使用getHost方式获取url进行白名单判断的方式,还有另外一种绕过方式就是url跳转,类似如下的URL跳转都是基于主站的跳转,即便是对于上面提到的这种白名单绕过方式进行了有效限制,但是还是可以进行绕过,由于很多公司对url跳转漏洞都不是很重视,所以结合url跳转漏洞进行的攻击在有的时候也可以达到令人惊奇的程度,危害还是非常严重的,比如说静默下载安装`[http://mbs.hao.163.cn/?c=redirect&ur=http://tu.623.cn/7vNo](http://mbs.hao.163.cn/?c=redirect&ur=http://tu.623.cn/7vNo.)
Socket远程连接漏洞¶
如果手机开放端口,但是缺少对发送者的身份验证或者是存在权限控制缺陷,导致黑客拿下这个端口的权限,便可以获得手机此端口开放的所有功能。此漏洞只与App有关,不受系统版本影响。
APK升级漏洞¶
| APP 升级流程 | 隐患 | 漏洞危害 |
|---|---|---|
| 升级API | 升级API未加密 | 返回恶意下载地址,可下载恶意APK |
| 下载API | 下载API未加密 | 下载路径被篡改,可下载恶意APK |
| 程序安装API | APK本地路径篡改 | 安装错误的APK |
其他¶
加密算法是否存在安全缺陷¶
客户端与服务器通信或数据存储往往采用一些加密算法来保障数据的安全,但是这些算法本身可能存在缺陷。
不安全的哈希/加密算法¶
- MD5哈希算法易遭到已知的哈希冲突攻击。 哈希算法用于确保数据完整性(例如,文件签名或数字证书)时尤其易被攻击。 在这种情况下,攻击者可能会生成两个独立的数据块,以便在不更改哈希值或使相关数字签名无效的情况下,将良性数据替换为恶意数据。
- DES 加密使用的密钥强度较低,可能在一天内被暴力破解。
- RC2 加密容易遭受与密钥相关的攻击,攻击者可以通过这些攻击找出所有密钥值之间的数学关系。
弱加密算法¶
- TripleDES 等加密算法和 SHA1 及 RIPEMD160 等哈希算法被视为弱加密算法。
- 这些加密算法不能与更现代的对应算法提供同样多的安全保证。
- 与更现代的哈希算法相比,加密哈希算法 SHA1 和 RIPEMD160 提供的冲突抗性较低。与更现代的加密算法相比,加密算法 TripleDES 提供的安全位数更少。
重放攻击风险¶
原理¶
重放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。
防护¶
建议在客户端与服务端通信时加上时间戳或判断是否已登录过等条件,防止重放攻击。
业务接口是否存在任意权限调用¶
原理¶
在正常的业务中,敏感功能的接口需要对访问者的身份进行验证,验证通过后才允许调用接口进行操作。接口未做身份验证或身份校验不严,可能导致非授权访问或越权调用。
防护¶
- 建议每个用户登陆后使用随机id进行标识,随时更换新id或在通信过程中使用更多参数如时间戳、数字签名等防止用户越权获取到其他用户的订单等信息。采用加密通信如https安全传输也能在一定程度上解决该问题。
- 建议在本地做好输入数据的校验,在通信过程中应采用多个参数对某次通信进行标识和记录。保证参数的随机性和机密性,防止攻击者构造出针对系统健壮性进行攻击的请求数据。
敏感数据泄露¶
- LogCat输出敏感信息
- 敏感数据明文存储于sdcard
- 数据库敏感数据明文存储
- Shared preference全局可读写
- 敏感信息硬编码
- HTTP敏感信息明文传输
ZIP解压缩漏洞¶
ZIP压缩包文件中允许存在../的字符串,攻击者可通过精心构造ZIP文件,利用多个../从而改变ZIP包中某个文件的存放位置,覆盖替换掉应用原有的文件。如果被覆盖掉的文件是so文件、dex文件或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害应用用户的设备安全和信息安全。比如“寄生兽”漏洞,海豚浏览器远程命令执行漏洞,三星默认输入法远程代码执行等。
Android APP审计系统¶
