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 之前,建议大家使用系统自带的浏览器访问网页,并且慎重访问社交应用中陌生人发来的链接。
漏洞触发条件:
1、使用WebView.addJavascriptInterface方法注册可供javascript调用的java对象。
2、使用WebView加载外部网页。
3、Android系统版本低于4.2
漏洞原因:
Android系统通过WebView.addJavascriptInterface方法注册可供javascript调用的java对象,以用于增强javascript的功能。但是系统并没有对注册JAVA类的方法调用的限制。导致攻击者可以利用反射机制调用未注册的其它任何JAVA类,最终导致javascript能力的无限增强。攻击者利用该漏洞可以根据客户端能力为所欲为。
WebView webview = new WebView(context);
WebSettings webset= webview.getSettings();
webset.setJavaScriptEnabled(true);
webview.addJavascriptInterface(new JSInvoke(), “jsinvoke”);
利用该漏洞的外部javascript脚本:
出于安全考虑,为了防止Java层的函数被随便调用,Google在4.2版本之后,规定允许被调用的函数必须以@JavascriptInterface进行注解,所以如果某应用依赖的API Level为17或者以上,就不会受该问题的影响(注:Android 4.2中API Level小于17的应用也会受影响)。在各应用厂商修复该问题期间,我们建议用户暂时使用系统自带的浏览器访问网页,并且不要访问社交应用中陌生人发来的链接。
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
根据上网快鸟联合创始姜向前的介绍,该漏洞的原理是在 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> |
五、相关链接
http://drops.wooyun.org/papers/548http://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
相关文章推荐
- android WebView详解,常见漏洞详解和安全源码
- android WebView详解,常见漏洞详解和安全源码(下)
- Android安全开发之WebView漏洞及建议
- 【Android安全】WebView密码明文保存漏洞
- Android 安全--WebView不校验证书漏洞
- Android:为WebView中的Java与JavaScript的交互漏洞提供【安全可靠】的多样互通方案
- Android静态安全检测 -> WebView系统隐藏接口漏洞检测
- Android安全之WebViewUXSS漏洞
- Android:你所忽略 WebView 带来的那些安全漏洞(总结)
- android WebView详解,常见漏洞详解和安全源码(上)
- android面试(5)-WebView安全漏洞
- Android为WebView中的Java与JavaScript的交互漏洞提供安全可靠的多样互通方案
- Android安全--webview远程代码执行漏洞
- Android静态安全检测 -> WebView File域同源策略绕过漏洞
- Android WebView 安全漏洞解决方案
- Android静态安全检测 -> WebView组件远程代码执行漏洞检测
- android安全之webview远程代码执行漏洞
- Android安全漏洞修复-webview中的漏洞修复
- android WebView详解,常见漏洞详解和安全源码(上)
- Android安全之WebViewUXSS漏洞