Synode:检测并自动防止Node.js上的注入攻击

作者:{Esi}@ArkTeam

原文作者:Cristian-Alexandru Staicu, Michael Pradel, Ben Livshits

原文标题:Synode: Understanding and Automatically Preventing Injection Attacks on Node.js

原文会议:Network and Distributed System Security (NDSS). 2018.

JavaScript是Web应用程序客户端最广泛使用的编程语言,为当今90%以上的网站提供支持。最近,JavaScript越来越流行于浏览器之外的平台,比如使用Node.js,移动编程(Apache Cordova / Phone-Gap)的服务器端和桌面应用程序,甚至用于编写操作系统,比如Firefox OS。

研究表明,使用JavaScript编写的移动应用程序很容易包含注入漏洞,与客户端JavaScript代码不同,Node.js应用程序的特性是可以与操作系统自由交互,而无需安全沙箱。因此,注入是Node.js最严重的安全威胁,并且Node.js模块通过npm安装,npm没有机制来指定或检查第三方模块的安全属性,而且模块间可以通过依赖关系来传播漏洞,导致安全受到更大的威胁。


图1 在npm模块中使用注入API的普遍性

本文提供了235,850个Node.js模块的大规模研究,最后发现Node.js平台与其它javascript平台的三处不同:

  1. Node.js提供了两种可能意外启用注入的API,eval API和exec API。Eval API采用字符串参数并将其解释为js代码,exec API及其变体,采用字符串参数并将其解释为shell命令。通过eval注入的代码可能包含对exec的调用。
  2. 开发人员不愿意去修复漏洞。
  3. Node.js模块维护者与使用这些模块的开发者互相推卸责任。

根据研究结果,作者介绍了Synode,一种自动识别潜在注入漏洞并防止注入攻击的方法,基本思想是检查所有第三方模块作为其安装的一部分,并重新编写它们来使用安全模式。将静态分析和运行时(runtime)使用的安全策略实施相结合,以安全的方式使用易受攻击的模块。

静态分析:推断在潜在危险汇点处使用的用户输入模版,检查可能传递给易于注入的API的值。

运行时(runtime):对于静态分析显示不安全的案例,通过代码重写实现运行时的实施。运行时方法使用部分实例化的抽象语法树(AST),并确保运行时值不会引入超出预期的任何不需要的代码。

上述组合通过node.js安装钩子应用于模块,从而为第三方模块强制执行安全模式。

该机制易于部署,不需要对Node.js平台进行任何修改,运行速度快(亚毫秒级的运行时间开销),并且可以抵御易受攻击的模块的攻击,同时还可以减少误报(误报小于10 %)。


图2 Synode架构图

作者将静态分析应用于一组包含恶意调用的15,604个Node.js模块,最后发现,36.66%的网站使用静态分析能够保证安全。对于静态分析不保证安全模块的网站,作者使用了利用注入漏洞的恶意输入和执行广告功能模块的良性输入。最后发现运行时(runtime)机制有效地防止了100%的攻击,同时只对8.92%的良性输入保持过度保护,误报率小于10%。

发表评论

电子邮件地址不会被公开。 必填项已用*标注