跳至主要內容

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 手動套用至所有深度無限的子視窗。

進一步資訊

此漏洞是由 Matt Austin(來自 Contrast Security)發現並負責地回報給 Electron 專案。

若要深入瞭解保持 Electron 應用程式安全的最佳做法,請參閱我們的安全性教學

如果您想要回報 Electron 中的漏洞,請傳送電子郵件至 security@electronjs.org