Electron contextIsolation RCE via preload code
Example 1
このコードは、デフォルトブラウザでhttp(s)リンクを開きます:
file:///C:/Windows/systemd32/calc.exe
のようなものを使用して calc を実行することができますが、SAFE_PROTOCOLS.indexOf
がそれを防いでいます。
したがって、攻撃者はXSSまたは任意のページナビゲーションを介してこのJSコードを注入できます:
攻撃者は、SAFE_PROTOCOLS.indexOf
への呼び出しは常に1337を返すため、保護をバイパスしてcalcを実行できます。最終的なエクスプロイト:
他の方法を確認して、許可を求めるプロンプトなしにプログラムを実行する方法を確認してください。
おそらく、コードをロードして実行する別の方法は、file://127.0.0.1/electron/rce.jar
のようなものにアクセスすることです。
例2: DiscordアプリRCE
https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1からの例
preloadスクリプトをチェックすると、DiscordがWebページにDiscordNative.nativeModules.requireModule('MODULE-NAME')
を介して呼び出される許可されたモジュールを許可する関数を公開していることがわかりました。
ここでは、_child_process_モジュールなど、RCEに直接使用できるモジュールを使用することはできませんでしたが、JavaScriptの組み込みメソッドをオーバーライドし、公開されたモジュールの実行に干渉することでRCEを達成できるコードを見つけました。
以下はPoCです。RegExp.prototype.test
とArray.prototype.join
をオーバーライドしながら、"discord_utils"というモジュールで定義されたgetGPUDriverVersions
関数をdevToolsから呼び出すと、calcアプリケーションが表示されることを確認できました。
getGPUDriverVersions
関数は、以下のように "execa" ライブラリを使用してプログラムを実行しようとします:
通常、_execa_はnvidiaSmiPath
変数で指定された"nvidia-smi.exe"を実行しようとしますが、RegExp.prototype.test
とArray.prototype.join
が上書きされたため、引数は"calc"に置き換えられます。
具体的には、引数は次の2つの部分を変更することで置き換えられます。
Last updated