Google Chrome V8漏洞技术分析与防护方案

Google Chrome V8引擎3.20至4.2版本中存在远程代码执行漏洞,该漏洞是由于源代码中“observe_accept_invalid”异常类型被误写为“observe_invalid_accept”。攻击者可利用该漏洞造成kMessages关键对象信息泄露,执行任意代码。基于Android 4.4.4至5.1版本系统的WebView控件开发的手机APP均可能受上述漏洞影响。

其中的漏洞信息列表如下:

CNNVD_ID 级别 描述
CNNVD-201608-414 严重 源代码中“observe_accept_invalid”异常类型被误写导致远程代码执行

详情见如下地址:

http://www.cnnvd.org.cn/vulnerability/show/cv_cnnvdid/CNNVD-201608-414

什么是Google Chrome V8引擎?

Google V8 JavaScript Engine是美国谷歌(Google)公司为Chrome浏览器开发的一套开源JavaScript引擎。V8在运行之前将JavaScript编译成了机器码,而非字节码或是解释执行它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。

影响的版本

  • Google Chrome JavaScript V8 引擎 3.20-4.2。
  • Android 4.4.4-5.1上使用WebView控件所开发的APP。

不受影响的版本

  • Google Chrome JavaScript V8引擎 > 4.2。

漏洞分析

V8是一个Google开发的开源高性能JavaScript引擎。V8其内置机制将底层native的对象或代码暴露给上层JavaScript代码,供其访问调用,从而提供效率。本次BadKernel漏洞,存在于ConvertAcceptListToTypeMap函数。该函数代码见以下地址:http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/object-observe.js#ConvertAcceptListToTypeMap

V8-1

在MakeTypeError时,作者错误使用“observe_accept_invalid”。在http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/messages.js#75中可以看到并没有定义“observe_accept_invalid”,而是定义了“observe_invalid_accept”。

V8-2

因此,攻击者可以通过精巧的内存控制,通过此漏洞调用对象的observe方法实现信息泄露,进而实现任意代码执行。

此漏洞的调用流程:

1.JavaScript代码调用对象的observe方法,Object.observe()

2.http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/bootstrapper.cc#1633

V8-3

3.http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/object-observe.js#375

V8-4

4.http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/object-observe.js#ConvertAcceptListToTypeMap

V8-5

5.http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/messages.js#323

6.http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/messages.js#MakeGenericError

7.http://androidxref.com/5.0.0_r2/xref/external/chromium_org/v8/src/messages.js#FormatMessage

V8-6

检测方法

用户可以通过访问包含如下JavaScript代码的html页面,判断自身的V8版本是否存在此漏洞。

<html>
<title>BadKernel Test</title>
<script>
var kMessages;
Object.prototype.__defineGetter__("observe_accept_invalid",function()   {kMessages=this});
try{Object.observe({},function(){},1)}catch(e){}
delete Object.prototype["observe_accept_invalid"];
if(!kMessages)
alert('badKernel vulnerability not exists.');
else
alert('badKernel vulnerability exists!');
</script>
</html>

 

防护方案

1.受影响的厂商,尽快升级V8版本至4.2以上版本。

2.对于暂时因各种原因无法升级的厂商,将ConvertAcceptListToTypeMap函数中observe_accept_invalid修改为observe_invalid_accept,并重新编译V8至自身APP内,推送APP升级。

3.绿盟科技免费检测。

请用安卓手机端安装的各浏览器逐一访问如下链接或扫描二维码进行漏洞检测。https://cloud.nsfocus.com/krosa/views/weixin_h5/webkitloophole.html

V8-7

 

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技

北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。

基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。

北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。

如果您需要了解更多内容,可以
加入QQ群:486207500、570982169
直接询问:010-68438880-8669

 

Spread the word. Share this post!

Meet The Author

Leave Comment