标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2024-1042]   作者: ecawen 发表于: [2017-11-12]

本文共 [669] 位读者顶过

Kay作为MalwareBenchmark漏洞挖掘分析团队的核心,在一个月内拿下众多0-day,收获若干CVE,这里将介绍其中之一。 [出自:jiwo.org]

前段时间,小编在使用Node.js的一个第三方函数库serialize-to-js的时候,发现这个库的deserialize函数使用了一个名为safeEval的函数。而总所周知的是,在解释类程序语言(如java, python, php, ruby等)中,eval函数常常是开发者的梦魇,因为稍有不注意,向这个函数传入不可信的数据,那就有可能被注入任何可能的代码,导致严重的后果。

小编这就很纳闷了,咋还有“安全的eval”呢?safeEval真的安全吗?让我们从头来看一下deserialize函数。

该函数提供将字符串对象反序列化成为Java对象的功能,其中safeEval函数是关键,它完成字符串到Java代码的转化。这里应该尤其要注意的是,对于JavaScipt来说,有个特性可能成为潜在的隐患:IIFE(Immediately Invoked Function Expression),意为立即调用的函数表达式,也就是说,声明函数的同时立即调用这个函数。

在Java中,函数的声明和IIFE的区别在于,在函数的声明中,我们首先看到的是function关键字,而IIFE我们首先看到的是左边的(。也就是说,使用一对()将函数的声明括起来,使得JS编译器不再认为这是一个函数声明,而是一个IIFE,即需要立刻执行声明的函数。比如下面这条的语句,在声明这个函数的同时,该函数被立即调用了。

那么,我们是否可以构造一个包含一个IIFE对象的字符串呢?我们来试试。

果不其然,通过传入IIFE,反序列化之后的函数被立即执行了。看到这里,屏幕前的你是不是也觉得找到了一个任意代码执行的漏洞呢?我们试一下这个”漏洞“能不能造成破坏。我们这里尝试一下输出当前目录下的文件。

从上图可以看到,payload传入deserialize函数之后并没有被反序列化成功,而是报了一个TypeError错误。这是什么原因呢?于是小编就查阅了一下safeEval的具体实现,发现这个函数是对vm模块中runInContext函数的封装。而这个函数是不允许执行require(xxx)这样代码,杜绝了许多危险的函数。

那么safeEval函数是否真的能够避免所有的危险呢?从它的实现来说,我们可以基本确定的是,恶意的输入不会带来完整性或者保密性的破坏,但是却有可能通过在IIFE中包含一个简单的死循环就把主线程给占用了,给实现拒绝服务攻击。

演示视频如下:

<iframe src="https://v.qq.com/iframe/player.html?vid=u1327mengvk&width=500&height=375&auto=0" width="500" height="375" class="center-iframe">

该漏洞影响了serialize-to-js v1.0以后的所有版本,目前开发者尚未提供漏洞修补方案,因此MalwareBenchmark建议在使用该函数库的时候,限制用户数据的传入。

评论

暂无
发表评论
 返回顶部 
热度(669)
 关注微信