結構致命的ながらあんまり騒がれてない気がしたので調べてみました。
影響のあるアプリ
の、3点全てを満たすアプリ。
原理
ElectronのsetAsDefaultProtocolClientは、レジストリに以下の文字列を登録する。
"(setしたElectronアプリのEXEファイルまでのパス)" "%1"
しかし、%1は単純に置換されるので、以下のようなカスタムURIスキームを踏ませればオプションを任意につけられる。
myapp://hoge" --no-sandbox
そして、gpu-lancher等のような任意のプロセスを動かせるオプションを使ってcmd.exeを呼び出して任意のコードを動かす。
言ってみれば受動型任意コード実行みたいな感じ。
対策
- 最新版Electronを使う
- setAsDefaultProtocolClientの第三引数の最後に -- をつける(参考:https://electronjs.org/blog/protocol-handler-fix)
参考URL
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1000006
Disallow launching unknown apps via browser client. · electron/electron@c49cb29 · GitHub
雑記
これを動かすときは"がエンコードされずに渡されなければならないため、ブラウザが限定されます。
Electron内部からだとダメ。Firefoxもダメ。
Chromeは昨日配信のパッチを当てるとダメ。
唯一IEだけは"をエスケープせずにそのまま渡してくれるので優秀(?)。
よって、PoCを動かすときはIE推奨。
IEは他のブラウザと違ってちゃんとリンク先のアドレス(ここで言うhoge" --no-sandbox)まで含めた確認ウィンドウを出すが、実は長さ制限があるため、ひたすらスペースなりでごまかせば許可してくれる気がする。
特にSkypeのリンクがハメやすそう。
あと、あまり指摘されてない気がするけど、setAsDefaultProtocolClientしたプロトコルは明示的にremoveするまで残ります 。
なので、昔テストで動かしたアプリとかがそのまま残っていると、思わぬ所で発火する可能性があります。(packageしたelectron-api-demosとかはヤバいかも?)
日常使うものならともかく、一回起動させてテストしてそのまま、みたいなアプリがあると、普通に攻撃される可能性が高い。
起動させてからディレクトリを変えたりしてると発火しない(レジストリには起動時のパスが残るので)ものの、再度色々確認したほうが良いかも。
特にHKCU\Software\Classes\以下でURLが指定されてるもの。原理的にはElectron以外でも起こりえるし。