0x00 Node.js安全检查引擎
Node.js作为常见的Web开发语言之一,Xcheck也针对该语言打造了对应的扫描引擎:JsCheck。
同样基于污点传播模型,支持以下常见漏洞类型:
命令注入
SQL注入
URL跳转
SSRF
路径穿越
XXE
反序列化
模板注入
XPath注入
目前JsCheck支持以下2个框架:Koa、Express,其他框架有需要可以方便添加。
0x01 Node.js一些有意思的特性
JsCheck为了能够精准的做污点传播,对Node.js的特性进行了精确的适配,比如:this关键字,变量声明提升等。
this关键字
Node.js里的this根据所处的位置不同(普通函数,箭头函数),调用方式不同(直接调用,赋值给一个对象的属性再调用,当做构造函数调用),有着不同的指向含义。
1)当在文件的最上层的时候,this指向的当前文件的exports
对象:
输出:
2)当this在一个普通函数里,this指向的是global
对象:
输出:
3)当this在一个构造函数里,this指向的是该构造函数生成的对象:
输出:
4)当this在箭头函数里,this指向的对象就会根据this定义时所处的为上下文而定:
输出:
变量声明提升
在Node.js里,如果一个变量不使用var,const,let
修饰,那么默认它是一个全局变量:
输出:
如果使用了var声明变量,则会出现变量声明提升:
输出:
不但变量的声明会提升,函数的声明也会提升:
等价于:
0x02 误报消除的尝试
在处理误报的时候,最不好处理的就是用户自定义的过滤逻辑。因为,这里的写法形式很多,难以提取出固定的模式,其中有两个关键点:
1.识别出一段代码是过滤逻辑
2.判定此段过滤逻辑是完备的
针对这两个点,目前从业界来看,都没有完美的解决办法,Xcheck在这里做了一些尝试,对一些情况能够做出准确的判定。
比如,通过字符串直接比对的情况:
检测不满足条件后抛出异常的情况:
对污点数据进行常量化替换(清洗):
过滤逻辑叠加污点对象传播时:
判定对象和风险函数执行的对象不是同一个的情况:
常见目录穿越漏洞的过滤逻辑:
从实测效果来看,JsCheck的误报已经明显降低,但是后续还有优化提升空间。
0x03 扫描样例
目前,使用github上CodeQL的Node.js测试集来扫描,未做专门适配的情况下发现漏洞243个。
查看详细的扫描报告,针对每个漏洞,各个污点传播节点有详细的展示:
来源:freebuf.com 2021-06-07 15:42:36 by: Xcheck
请登录后发表评论
注册