Xcheck之Node.js安全检查引擎
2021-07-22 19:19:40 Author: www.secpulse.com(查看原文) 阅读量:115 收藏

image245.png

0x00 Node.js安全检查引擎

Node.js作为常见的Web开发语言之一,Xcheck也针对该语言打造了对应的扫描引擎:JsCheck

同样基于污点传播模型,支持以下常见漏洞类型:

目前JsCheck支持以下2个框架:Koa、Express,其他框架有需要可以方便添加。

image.png

0x01 Node.js一些有意思的特性

JsCheck为了能够精准的做污点传播,对Node.js的特性进行了精确的适配,比如:this关键字,变量声明提升等。

this关键字

Node.js里的this根据所处的位置不同(普通函数,箭头函数),调用方式不同(直接调用,赋值给一个对象的属性再调用,当做构造函数调用),有着不同的指向含义。
1)当在文件的最上层的时候,this指向的当前文件的exports对象:

image.png

输出:

image.png

2)当this在一个普通函数里,this指向的是global对象:

image.png

输出:

image.png

3)当this在一个构造函数里,this指向的是该构造函数生成的对象:

image.png

输出:

image.png

4)当this在箭头函数里,this指向的对象就会根据this定义时所处的为上下文而定:

image.png

输出:

image.png

变量声明提升

在Node.js里,如果一个变量不使用var,const,let修饰,那么默认它是一个全局变量:

image.png

输出:

image.png

如果使用了var声明变量,则会出现变量声明提升:

image.png

输出:

image.png

不但变量的声明会提升,函数的声明也会提升:

image.png

等价于:

image.png

0x02 误报消除的尝试

在处理误报的时候,最不好处理的就是用户自定义的过滤逻辑。因为,这里的写法形式很多,难以提取出固定的模式,其中有两个关键点:
1.识别出一段代码是过滤逻辑
2.判定此段过滤逻辑是完备的
针对这两个点,目前从业界来看,都没有完美的解决办法,Xcheck在这里做了一些尝试,对一些情况能够做出准确的判定。
比如,通过字符串直接比对的情况:

image.png

检测不满足条件后抛出异常的情况:

image.png

对污点数据进行常量化替换(清洗):

image.png

过滤逻辑叠加污点对象传播时:

image.png

判定对象和风险函数执行的对象不是同一个的情况:

image.png

常见目录穿越漏洞的过滤逻辑:

image.png

从实测效果来看,JsCheck的误报已经明显降低,但是后续还有优化提升空间。

0x03 扫描样例

目前,使用github上CodeQL的Node.js测试集来扫描,未做专门适配的情况下发现漏洞243个。

image.png

查看详细的扫描报告,针对每个漏洞,各个污点传播节点有详细的展示:

image.png

专注于代码安全 | 公众号:腾讯代码安全检查Xcheck

本文作者:Xcheck

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/163008.html


文章来源: https://www.secpulse.com/archives/163008.html
如有侵权请联系:admin#unsafe.sh