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
手動套用至所有深度無限的子視窗。
進一步資訊
此漏洞是由 Matt Austin(來自 Contrast Security)發現並負責地回報給 Electron 專案。
若要深入瞭解保持 Electron 應用程式安全的最佳做法,請參閱我們的安全性教學。
如果您想要回報 Electron 中的漏洞,請傳送電子郵件至 security@electronjs.org。