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