Group of Software Security In Progress

Abusing Hidden Properties to Attack the Node.js Ecosystem

作者:Feng Xiao, Jianwei Huang, Yichang Xiong, Guangliang Yang, Hong Hu, Guofei Gu, Wenke Lee

单位:GeorgiaTech, Texas A&M, PennState, Independent

会议:the Proceedings of the 30th USENIX Security Symposium

原文:Abusing Hidden Properties to Attack the Node.js Ecosystem

Abstract

现在,Node.js 因为其动态语言和高性能 JavaScript 运行时等特性被广泛应用在桌面环境和服务端环境。近年来,虽然有很多针对动态语言的共享对象方面的研究,但是却没有针对 JavaScript 和 Node.js 的相关安全隐患的研究。

在本文中,作者引入了一种系统的分析工具填补了这方面的空白。作者设计并发明了一种新的 Node.js 中的攻击,并将其命名为“隐藏属性滥用”(Hidden Property Abuse, HPA)。作者在其进一步的研究中发现,依据漏洞利用和影响,HPA 攻击与现有的攻击都显著地不同。通过 HPA 攻击,一个远程 web 攻击者可以获取敏感信息、绕过安全检查甚至发起 DoS 攻击。

为了帮助 Node.js 的开发者们更好地防御 HPA 攻击,作者开发了一个先进的漏洞发现与自动化利用生成的工具:LYNX。作者使用 LYNX 检查了一系列被广泛使用的 Node.js 程序并发现了 15 个之前未被发现的漏洞,其中 10 个已经被分配了 CVE 编号,8 个被评级为了高危或者严重等级。

Introduction

Node.js 是一种跨平台且高性能的一个 JavaScript 执行环境,近几年被广泛使用在桌面环境客户端与服务端环境。正是如此,Node.js 的安全性至关重要。Node.js 应用程序主要使用 JavaScript 这种动态语言编写,近年针对动态语言例如 PHP、Ruby 的对象安全问题 CWE-915,即内部对象属性被外部用户输入所修改的问题研究较多,但是却没有针对 JavaScript 的研究。

在本文中,作者首次引入了对象共享与客户端服务器通信之间的问题。作者确认了 CWE-915 也同样存在于 JavaScript 与 Node.js 中。为了证明这种安全问题,作者引入了一种先进的攻击手段:HPA 攻击,并在进一步的研究中发现这种攻击与现有的 PHP 和 Ruby 中的攻击并不相同。

为了帮助 Node.js 社区,作者开源了他们所编写的分析工具 LYNX。LYNX 结合了动态分析与静态分析的优点,可以自动化分析应用并针对漏洞生成漏洞利用。

最后,作者使用了 102 个真实的 Node.js 应用评估了 LYNX,最后找到了 15 个先前未知的漏洞。作者遵循了漏洞披露义务,并在撰写本文章时获得了 10 个分配的 CVE 编号,其中有 8 个被评级为高危或严重,7 个已经被程序维护者修复。最后,作者与 Node.js 社区沟通,并给出了三个潜在的 HPA 漏洞修复方法。

本文主要贡献:

  1. 发明了 Hidden Property Abuse 攻击,并展示了其安全威胁
  2. 设计并编写了 LYNX,帮助检测 HPA 漏洞,并自动编写漏洞利用
  3. 评估中展示出了 HPA 漏洞在真实世界中的严重安全影响

Background

  • Node.js 与其运行时

    Node.js 被用于在浏览器之外运行 JavaScript,很多以事件驱动的服务或者中间件和传统的 Web 应用采用 Node.js 部署。为了与运行环境交互,Node.js 在 V8 引擎之上实现了一套接口以提供一些例如文件操作等功能。但是,Node.js 并没有强制的宿主环境隔离,因此如果 Node.js 运行的应用被攻击可能会导致严重的安全威胁

  • 对象共享

    与 PHP 等语言类似,要传递对象则存在对象序列化与反序列化的过程。在作者对 npm 仓库的调查中,关于对象分享有许多种实现的方式。现在最为常见的即使用 JSON 序列化或查询字符串(query-string)序列化作为对象共享的方式,当然也有例如 HTTP 头的其他方法。

Hidden Property Abusing

Threat Model

  1. Node.js 应用或其模块无害但存在漏洞
  2. 应用实现了对象分享(例如数据反序列化)

在这种模型下,远程 Web 攻击者可以通过合法的接口发送精心构造的数据达到攻击效果

Attack Vectors

  • 受限于应用的对象属性操控

    Web 应用错误地将特定的对象属性暴露使得攻击者可控

    攻击者可能通过这种攻击向量来将特定的对象属性传递到内部对象,从而访问敏感的接口

  • 原型链劫持

    攻击者劫持特定对象的原型链,加入受攻击者控制的特定属性

需要注意的是,HPA 与原型链污染并不属于同一种漏洞,因为 HPA 可以仅劫持一个或多个对象的原型链,而并非像原型链污染一样修改 Object 对象的原型导致所有对象原型链被污染。

HPA 与其他攻击的对比

HPA 与 Ruby 的 Mass Assignment 的对比

  1. 传递攻击载荷方式不同
  2. HPA 可以引入隐藏的属性
  3. HPA 可以引入新的属性

LYNX Design and Implementation

Challenges & Solutions

  • 如何发现 Node.js 应用中的隐藏属性

    首先使用动态分析的方法标记用户输入的对象,然后使用静态分析消除漏报

  • 如何在大量隐藏属性中找到有价值或可以利用的属性

    利用符号执行来探索所有执行路径,检查敏感行为,最后生成漏洞利用

Design Overview

  • 动态分析
    1. 标记输入对象 - 给对象递归加上唯一标识符
    2. 识别属性载体 - <O,L,S> 元组标记 (O:对象,L:JavaScript file,S:对象可视范围)
    3. 驱动动态分析 - testcases
  • 静态分析

    动态分析的局限:路径不全面,漏报较多

    污点分析 - 符号执行

完整示例:

(以上这个示例有个非常严重的错误,forEach中的匿名函数return null语句并不会出现两个可能的路径,因此该函数只可能return object

  • 修剪结果

    例如某 email 的输入参数

    json { "from": "xx", "to": "xx" }

    json { "from": "xx", "to": "xx", "cc": "xx" }

    多出来的 cc并非属于隐藏属性

    作者依赖于一个发现:有文档的参数通常会被一个调度器(例如 if-else 语句)一同处理

    1. 未使用的参数与使用的参数被同一调度器处理:从 API 参数中记录使用的属性,然后找出与使用的属性位于同一调度器中的隐藏属性候选对象
    2. 未使用的参数与使用的参数被不同调度器处理:检查所有的对象并查看是否有被同一调度器处理,如果存在则从结果中移除

Generating HPA Exploits

漏洞利用模版生成

直接利用原始对象作为模版,并在对象中插入属性

原始对象作为模版:

1
2
3
4
{
    "email": "aa@gmail.com",
    "passwd": "11"
}

插入属性后:

1
2
3
4
5
{
    "email": "aa@gmail.com",
    "passwd": "11",
    "constructor": SYMBOL
}

探索攻击路径

作者总结了以下 6 种敏感函数触发点(Sink):

  1. 敏感数据库查询方法
  2. 敏感文件系统操作方法
  3. 代码执行接口
  4. 模块引用结果
  5. 全局方法或变量
  6. 循环条件

作者主要使用搜集好的经过分类的接口进行识别,现在主要覆盖了以下三种恶意行为:

  1. 返回值操控
  2. 全局变量修改
  3. 循环条件操控

攻击路径探索算法:

Implementation

动态部分:Jalangi

静态部分:Esprima

符号执行:ExpoSE

Evaluation

作者提出了三个问题:

  1. 隐藏属性是否广泛存在于 Node.js 应用中
  2. LYNX 能否找到这些隐藏属性并生成对应的漏洞利用
  3. 被发现的漏洞如何扩大了 Node.js 应用生态中的攻击面

Data Set

PC:属性携带者

HP:隐藏属性

DA:有文档的参数

Result

Discussion

Countermeasures

  1. 输入校验
  2. 避免多个参数打包进一个参数中
  3. 隔离内部对象与外部输入

Limitations

  1. 需要外部触发
  2. 存在漏报
  3. 不能覆盖完整的 Node.js 生态中的对象输入渠道

Conclusion

在本文中,作者主要介绍了一种全新的 Node.js 生态中的攻击方法:HPA,并设计实现了 LYNX 工具对很多 Node.js 应用进行分析,发现了很多高风险的漏洞