Electronのwebview要素ではallowpopups属性をつけてはいけない

Electronを使ってブラウザのようなアプリケーションを作る場合には webviewタグが使用される。例えば、アプリケーション内にexample.jpのサイトを表示するには以下のようにHTMLに記述する。

<webview src="http://example.jp/"></webview>

ここで、webviewタグにallowpopups属性を付与すると、example.jpサイト内のコードからwindow.open等を使って新たにウィンドウを開くことができるようになる。このとき、example.jpに悪意があり以下のようなコードが含まれているとする。

if( typeof require === "undefined" ) window.open( 'http://example.jp/', '', 'nodeIntegration=1');
else require( "child_process").exec("calc.exe",function(){});

requireが未定義の場合には自身のサイトをwindow.openを使って開きなおしているが、このときに'nodeIntegration=1'を与えている。これにより、新たに生成されたwindowではnodeの機能すなわちrequireやprocessなどが利用可能になる。コードのelse以降は開きなおされたwindow内で動作し、requireが利用可能になっているので、ここでは電卓を起動している。
このように、webviewタグにallowpopups属性が付与されている場合、webview内に表示されているサイトからクライアントPC上で任意コードの実行が可能になる可能性がある。

ここで注意すべきは、allowpopups属性はあくまでも新たにポップアップウィンドウを開くことを許可しているだけであり、開かれたウィンドウがnode機能を利用可能かどうかを制御しているのではないということである。現状のnodeでは、新たにウィンドウを開く際にnode機能をオンにして開くことができるが、allowpopupsを付与しないことによって新たにウィンドウの生成を禁止していることがたまたまnode機能付きでコード実行されるのを禁止しているのに過ぎないという点に留意しておく必要がある。

まとめ。webviewタグにallowpopups属性をつけてリモートサイトを表示している場合、リモートサイトから任意コードの実行が可能になる。