跳到主要内容

WebPreferences 漏洞修复

·阅读 2 分钟

发现了一个远程代码执行漏洞,该漏洞影响了可以在 Electron 版本(3.0.0-beta.6, 2.0.7, 1.8.7 和 1.7.15)上打开嵌套子窗口的应用程序。该漏洞已被分配 CVE 标识符 CVE-2018-15685


受影响的平台

如果您符合以下条件,则会受到影响

  1. 您嵌入了任何远程用户内容,即使是在沙箱中
  2. 您的应用程序接受具有任何 XSS 漏洞的用户输入

详情

如果任何用户代码在 iframe 中运行或可以创建 iframe,您就会受到影响。考虑到存在 XSS 漏洞的可能性,可以认为大多数应用程序都容易受到这种情况的影响。

如果您使用 nativeWindowOpen: truesandbox: true 选项打开任何窗口,您也会受到影响。尽管此漏洞也需要在您的应用程序中存在 XSS 漏洞,但如果您使用这两个选项中的任何一个,仍然应该应用下面的缓解措施之一。

缓解措施

我们已经发布了包含此漏洞修复的新版本 Electron:3.0.0-beta.72.0.81.8.81.7.16。我们敦促所有 Electron 开发者立即将其应用程序更新到最新的稳定版本。

如果由于某种原因您无法升级 Electron 版本,您可以通过对所有 webContentsnew-window 事件统一调用 event.preventDefault() 来保护您的应用程序。如果您根本不使用 window.open 或任何子窗口,那么这对于您的应用程序也是一个有效的缓解措施。

mainWindow.webContents.on('new-window', (e) => e.preventDefault());

如果您依赖于子窗口创建孙子窗口的能力,那么第三种缓解策略是在您的顶级窗口上使用以下代码

const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on(
'new-window',
(event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {};
}
Object.assign(
options.webPreferences,
topWebContents.getLastWebPreferences(),
);
if (options.webContents) {
handle(options.webContents);
}
},
);
};
handle(topWebContents);
};

enforceInheritance(mainWindow.webContents);

这段代码将手动强制将顶级窗口的 webPreferences 应用于所有无限深度的子窗口。

更多信息

此漏洞由 Contrast SecurityMatt Austin 发现并负责任地报告给 Electron 项目。

要了解有关确保 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至 security@electronjs.org