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製アプリケーションで任意コード実行可能な脆弱性が存在していることを確認しています。