WebPreferences Vulnerability Fix
已发现一个远程代码执行漏洞,该漏洞会影响能够在 Electron 版本 (3.0.0-beta.6、2.0.7、1.8.7 和 1.7.15) 上打开嵌套子窗口的应用。此漏洞已被分配 CVE 标识符 CVE-2018-15685。
受影响的平台
如果您符合以下条件,则会受到影响
- 您嵌入任何远程用户内容,即使在沙箱中也是如此
- 您接受带有任何 XSS 漏洞的用户输入
详情
如果任何用户代码在 iframe
内运行/可以创建 iframe
,您都将受到影响。考虑到存在 XSS 漏洞的可能性,可以假定大多数应用都容易受到这种情况的影响。
如果您使用 nativeWindowOpen: true
或 sandbox: true
选项打开任何窗口,您也会受到影响。尽管此漏洞也需要在您的应用中存在 XSS 漏洞,但如果您使用这些选项中的任何一个,您仍然应该应用以下缓解措施之一。
缓解措施
我们已经发布了新版本的 Electron,其中包含针对此漏洞的修复程序:3.0.0-beta.7
、2.0.8
、1.8.8
和 1.7.16
。我们敦促所有 Electron 开发者立即将其应用更新到最新的稳定版本。
如果由于某种原因您无法升级您的 Electron 版本,您可以通过对所有 webContents
的 new-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 Security 的 Matt Austin 负责任地发现并报告给了 Electron 项目。
要了解有关保持 Electron 应用安全的最佳实践的更多信息,请参阅我们的安全教程。
如果您希望报告 Electron 中的漏洞,请发送电子邮件至 security@electronjs.org。