Electronでアプリを書く場合は、気合いと根性でXSSを発生させないようにしなければならない。
そのうちもう少しきちんと書きますが、とりあえず時間がないので結論だけ書くと、タイトルが全てでElectronでアプリを書く場合は気合いと根性でXSSを発生させないようにしなければならない。
これまでWebアプリケーション上でXSSが存在したとしても、影響範囲はそのWebアプリケーションの中に留まるので、Webアプリケーションの提供側がそれを許容するのであればXSSの存在に目をつむることもできた。しかし、ElectronアプリでDOM-based XSSが一か所でも発生すると、(おそらく)確実に任意コード実行へとつながり、利用者のPCの(そのユーザー権限での)全機能が攻撃者によって利用できる。
そのため、Electronでアプリケーションを作成する開発者は気合いと根性でXSSを完全につぶさなければならない。
nodeIntegration:falseやContent-Security-Policyといった保護機構は残念ながら役に立たない。
mainWindow = new BrowserWindow({width: 600, height: 400, webPreferences:{nodeIntegration:false}});
みたいにレンダラプロセスでnode機能を切り離し、さらにレンダラのHTMLで
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
ていたとしても、レンダラのHTML上に
<webview nodeintegration src="data:text/html,<script>require('child_process').exec('calc.exe',function(){})</script>"></webview>
のようなタグを注入されると、nodeの機能をフルに活用して任意のコードが実行可能となる。
現在、多くのElectron製アプリケーションで任意コード実行可能な脆弱性が存在していることを確認しています。