WebPreferences 漏洞修复
已发现一个远程代码执行漏洞,影响使用 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 中的漏洞,请提交 GitHub 安全咨询。
