近日,国家信息安全漏洞共享平台(CNVD)收录了Node.js反序列化远程代码执行漏洞(CNVD-2017-01206,对应 CVE-2017-594)。攻利用漏洞执行远程执行操作系统指令,获得服务器权限。由于目前验证代码已经公开,极有可能诱发大规模网站攻击。

一、漏洞情况分析

Node.js是一个Javascript运行环境(runtime),对Google V8引擎进行了封装。Node.js同时也是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建快速响应、易于扩展的网络应用。

Node.js反序列化模块node-serialize库中的unserialize()函数未做安全处理,该漏洞通过传递调用JavaScript IIFE函数表达式的方式实现远程任意代码执行的效果。攻击者可通过远程攻击获得当前服务器运行环境权限,由于实际部署中node.js运行环境较多为操作系统root权限,因此可完全控制服务器主机。CNVD对该漏洞的综合评级为“高危”。目前,相关利用方式已经在互联网上公开,近期出现攻击尝试爆发的可能。

二、漏洞影响范围

根据漏洞研究者测试结果,由于涉及IIFE函数表达式,漏洞影响到Node.js现有的所有版本。根据CNVD秘书处的普查结果,目前互联网上直接标定使用node.js运行环境的服务器约有6.8万余台,其中排名前五名的国家和地区是美国(占比58.9%)、中国(23.2%)、英国(4.1%)、荷兰(3.6%)、德国(3.0%)。由于一个应用广泛的名为Express的WEB应用开发框架是基于node.js运行环境的,根据CNVD秘书处初步普查结果,受该漏洞影响的网站服务器有可能超过70万台,后续CNVD将进一步进行漏洞实际威胁影响的精确评估,做好境内用户的应急响应工作。

三、漏洞修复建议

厂商尚未提供漏洞修补方案,请关注主页更新情况:https://github.com/luin/serialize。同时也可以通过以下临时解决方案加固服务器主机:

1. 修改/node_modules/node-serialize/lib/serialize.js中的FUNCFLAG值为随机值并保证该值不被泄漏。

2. 确保Serialize字符串仅内部发送。

3. 使用公钥(RAS)加密Serialize字符串,确保字符串不被篡改。

附:参考链接:

https://youtu.be/GFacPoWOcw0(已公开的利用过程)

https://www.exploit-db.com/docs/41289.pdf(公开的分析信息)

http://www.cnvd.org.cn/flaw/show/CNVD-2017-01206

注:CNVD技术组成员单位杭州安恒信息技术有限公司及时报告了预警信息。