Electron Desktop Apps
はじめに
Electronは、ローカルバックエンド(NodeJS)とフロントエンド(Chromium)を組み合わせていますが、最新のブラウザのセキュリティメカニズムのいくつかが欠けています。
通常、Electronアプリのコードは.asar
アプリケーション内に見つかります。コードを取得するには、抽出する必要があります:
Electronアプリのソースコード内のpacket.json
には、セキュリティ設定が行われているmain.js
ファイルが指定されています。
Electronには2つのプロセスタイプがあります:
メインプロセス(NodeJSへの完全なアクセス権を持つ)
レンダラープロセス(セキュリティ上の理由からNodeJSへのアクセスが制限されるべき)
レンダラープロセスは、ファイルを読み込むブラウザウィンドウになります:
設定は、renderer process内でmain processのmain.jsファイルに設定できます。いくつかの設定は、設定が正しく構成されている場合、ElectronアプリケーションがRCEやその他の脆弱性を防ぐことができます。
Electronアプリケーションは、Node APIを介してデバイスにアクセスすることができますが、それを防ぐように構成することもできます:
nodeIntegration
- デフォルトではoff
です。オンの場合、renderer processからNode機能にアクセスできます。contextIsolation
- デフォルトではon
です。オフの場合、mainとrendererプロセスは分離されません。preload
- デフォルトでは空です。sandbox
- デフォルトではオフです。NodeJSが実行できるアクションを制限します。WorkersにおけるNode Integration
nodeIntegrationInSubframes
- デフォルトではoff
です。nodeIntegration
が有効になっている場合、これはElectronアプリケーション内のiframeで読み込まれたウェブページでNode.js APIを使用することを許可します。nodeIntegration
が無効になっている場合、preloadsはiframe内で読み込まれます。
設定の例:
いくつかの RCEペイロード は こちら から:
トラフィックのキャプチャ
start-main構成を変更し、次のようなプロキシの使用を追加します:
Electronローカルコードインジェクション
Electronアプリをローカルで実行できる場合、任意のJavaScriptコードを実行させることが可能です。方法は以下を確認してください:
macOS Electron Applications InjectionRCE: XSS + nodeIntegration
nodeIntegrationがonに設定されている場合、ウェブページのJavaScriptはrequire()
を呼び出すだけでNode.jsの機能を簡単に使用できます。例えば、Windowsでcalcアプリケーションを実行する方法は次の通りです:
RCE: preload
この設定で示されたスクリプトはレンダラー内の他のスクリプトの前に読み込まれ、したがってNode APIへの無制限のアクセスを持ちます:
したがって、スクリプトはノード機能をページにエクスポートできます:
contextIsolation
がオンの場合、これは機能しません
RCE: XSS + contextIsolation
contextIsolation は、ウェブページのスクリプトとJavaScript Electronの内部コードの間に分離されたコンテキストを導入し、各コードのJavaScript実行が互いに影響を与えないようにします。これはRCEの可能性を排除するために必要な機能です。
コンテキストが分離されていない場合、攻撃者は以下のことができます:
レンダラーで任意のJavaScriptを実行(XSSまたは外部サイトへのナビゲーション)
プリロードまたはElectron内部コードで使用される組み込みメソッドを上書きして独自の関数にする
上書きされた関数の使用をトリガー
RCE?
組み込みメソッドを上書きできる場所は2つあります:プリロードコードまたはElectron内部コード:
Electron contextIsolation RCE via preload codeElectron contextIsolation RCE via Electron internal codeElectron contextIsolation RCE via IPCクリックイベントのバイパス
リンクをクリックする際に制限が適用されている場合、通常の左クリックの代わりにミドルクリックを行うことでそれをバイパスできるかもしれません。
RCE via shell.openExternal
この例に関する詳細は、https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 および https://benjamin-altpeter.de/shell-openexternal-dangers/ を確認してください。
Electronデスクトップアプリケーションを展開する際には、nodeIntegration
と contextIsolation
の設定が正しいことを確認することが重要です。クライアント側のリモートコード実行 (RCE) がプリロードスクリプトやメインプロセスからのElectronのネイティブコードをターゲットにする場合、これらの設定が整っていれば効果的に防止されることが確立されています。
ユーザーがリンクと対話したり新しいウィンドウを開いたりすると、特定のイベントリスナーがトリガーされ、アプリケーションのセキュリティと機能にとって重要です:
これらのリスナーはデスクトップアプリケーションによってオーバーライドされ、独自のビジネスロジックを実装します。アプリケーションは、ナビゲートされたリンクを内部で開くべきか、外部のウェブブラウザで開くべきかを評価します。この決定は通常、openInternally
という関数を通じて行われます。この関数がfalse
を返す場合、リンクは外部で開くべきであることを示し、shell.openExternal
関数を利用します。
以下は簡略化された擬似コードです:
Electron JSのセキュリティベストプラクティスは、openExternal
関数で信頼できないコンテンツを受け入れることを避けるように助言しています。これは、さまざまなプロトコルを通じてRCEを引き起こす可能性があります。オペレーティングシステムは、RCEを引き起こす可能性のある異なるプロトコルをサポートしています。このトピックに関する詳細な例やさらなる説明については、このリソースを参照してください。ここには、この脆弱性を悪用できるWindowsプロトコルの例が含まれています。
Windowsプロトコルの悪用の例には:
内部ファイルの読み取り: XSS + contextIsolation
contextIsolation
を無効にすると、ローカルファイルを読み取って外部に流出させるために、<webview>
タグを使用できるようになります。提供された例は、この脆弱性を利用して内部ファイルの内容を読み取る方法を示しています:
さらに、内部ファイルを読み取るための別の方法が共有されており、Electronデスクトップアプリにおける重要なローカルファイル読み取り脆弱性を強調しています。これには、アプリケーションを悪用してデータを外部に流出させるためのスクリプトを注入することが含まれます:
RCE: XSS + 古いChromium
アプリケーションで使用されているchromiumが古い場合、既知の****脆弱性があると、それを悪用してXSSを通じてRCEを取得することが可能かもしれません。 このwriteupの例を参照してください: https://blog.electrovolt.io/posts/discord-rce/
内部URLの正規表現バイパスによるXSSフィッシング
XSSを見つけたが、RCEをトリガーできないか内部ファイルを盗むことができない場合、フィッシングを通じて資格情報を盗むためにそれを使用することを試みることができます。
まず、フロントエンドのJSコードを確認して、新しいURLを開こうとしたときに何が起こるかを知る必要があります:
openInternally
への呼び出しは、リンクがプラットフォームに属するリンクであるため、デスクトップウィンドウで開かれるか、ブラウザの3rdパーティリソースとして開かれるかを決定します。
関数で使用されるregexがバイパスに対して脆弱な場合(例えば、サブドメインのドットをエスケープしない場合)、攻撃者はXSSを悪用して、新しいウィンドウを開くことができ、そのウィンドウは攻撃者のインフラストラクチャに位置し、ユーザーに資格情報を要求します:
ツール
Electronegativity は、Electronベースのアプリケーションにおける誤設定やセキュリティのアンチパターンを特定するためのツールです。
Electrolint は、Electronegativityを使用するElectronアプリケーション用のオープンソースのVS Codeプラグインです。
nodejsscan は、脆弱なサードパーティライブラリをチェックするためのツールです。
Electro.ng: 購入が必要です。
ラボ
https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s では、脆弱なElectronアプリを悪用するためのラボを見つけることができます。
ラボに役立ついくつかのコマンド:
参考文献
Electronのセキュリティに関するさらなる研究と記事はhttps://github.com/doyensec/awesome-electronjs-hackingで確認できます。
Last updated