メインコンテンツへスキップ

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: true または sandbox: true オプションを使用してウィンドウを開く場合も影響を受けます。この脆弱性はアプリに XSS の脆弱性が存在する必要もありますが、これらのオプションのいずれかを使用する場合は、以下の軽減策のいずれかを適用する必要があります。

軽減策

この脆弱性の修正を含む新しいバージョンの Electron を公開しました:3.0.0-beta.72.0.81.8.8、および 1.7.16。すべての Electron 開発者は、アプリを最新の安定バージョンにすぐに更新することを強く推奨します。

何らかの理由で Electron のバージョンをアップグレードできない場合は、すべての webContentsnew-window イベントで event.preventDefault() を一括して呼び出すことでアプリを保護できます。window.open や子ウィンドウをまったく使用しない場合も、これはアプリにとって有効な軽減策です。

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

子ウィンドウが孫ウィンドウを作成する機能に依存している場合は、3 番目の軽減策として、トップレベルウィンドウで次のコードを使用します。

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 にメールしてください。