macOS Electron Applications Injection
基本情報
Electronが何かわからない場合は、こちらで多くの情報を見つけることができます。ただし、今のところ、Electronはnodeを実行することを知っておくだけで十分です。 そして、nodeには、指定されたファイル以外のコードを実行するために使用できるパラメータと環境変数がいくつかあります。
Electron Fuses
これらのテクニックは次に議論されますが、最近のElectronにはこれらを防ぐためのいくつかのセキュリティフラグが追加されています。これらはElectron Fusesであり、これらはmacOSのElectronアプリケーションが任意のコードを読み込むのを防ぐために使用されるものです:
RunAsNode
: 無効にすると、環境変数**ELECTRON_RUN_AS_NODE
**の使用を防ぎ、コードのインジェクションを防ぎます。EnableNodeCliInspectArguments
: 無効にすると、--inspect
、--inspect-brk
などのパラメータが尊重されなくなります。この方法でコードをインジェクトすることを回避します。EnableEmbeddedAsarIntegrityValidation
: 有効にすると、ロードされた**asar
** ファイルがmacOSによって検証されます。このファイルの内容を変更することによるコードのインジェクションを防ぎます。OnlyLoadAppFromAsar
: これが有効になっている場合、次の順序でロードを検索する代わりに:app.asar
、app
、最後に**default_app.asar
。app.asarのみをチェックして使用するため、embeddedAsarIntegrityValidation
**フューズと組み合わせると、検証されていないコードをロードすることが不可能であることが保証されます。LoadBrowserProcessSpecificV8Snapshot
: 有効にすると、ブラウザプロセスはV8スナップショットにbrowser_v8_context_snapshot.bin
というファイルを使用します。
コードインジェクションを防ぐことはないが、興味深いフューズもあります:
EnableCookieEncryption: 有効にすると、ディスク上のクッキーストアがOSレベルの暗号化キーを使用して暗号化されます。
Electron Fusesの確認
アプリケーションからこれらのフラグを確認することができます:
Electron Fusesの変更
ドキュメントに記載 されているように、Electron Fusesの構成は、Electron binary内に構成されており、どこかに文字列 dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX
が含まれています。
macOSアプリケーションでは、通常、application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
に配置されています。
https://hexed.it/でこのファイルをロードし、前の文字列を検索できます。この文字列の後に、各ヒューズが無効または有効かを示す数字「0」または「1」がASCIIで表示されます。ヒューズの値を変更するには、16進コードを変更します(0x30
は0
で、0x31
は1
です)。
Electronアプリケーションにコードを追加してRCE
Electronアプリが使用している外部JS/HTMLファイルがあるかもしれないため、攻撃者はこれらのファイルにコードをインジェクトし、その署名がチェックされずにアプリのコンテキストで任意のコードを実行できます。
ただし、現時点では2つの制限があります:
kTCCServiceSystemPolicyAppBundles
権限が必要ですが、デフォルトではこれは不可能です。通常、コンパイルされた**
asap
ファイルには、ヒューズembeddedAsarIntegrityValidation
とonlyLoadAppFromAsar
**が有効
になっています。
これにより、この攻撃経路がより複雑になります(または不可能になります)。
kTCCServiceSystemPolicyAppBundles
の要件をバイパスすることが可能であり、アプリケーションを別のディレクトリ(/tmp
など)にコピーし、フォルダ名をapp.app/Contents
からapp.app/NotCon
に変更し、悪意のあるコードでasarファイルを変更し、それを**app.app/Contents
**に戻して実行することができます。
asarファイルからコードを展開することができます。
そして、それを修正した後にパックし直します。
ELECTRON_RUN_AS_NODE
を使用した RCE
ELECTRON_RUN_AS_NODE
を使用した RCEドキュメントによると、この環境変数が設定されている場合、プロセスは通常の Node.js プロセスとして開始されます。
RunAsNode
フューズが無効になっている場合、環境変数 ELECTRON_RUN_AS_NODE
は無視され、これは機能しません。
アプリ Plist からのインジェクション
こちらで提案されているように、この環境変数を plist に悪用して持続性を維持することができます:
NODE_OPTIONS
を使用したRCE
NODE_OPTIONS
を使用したRCE異なるファイルにペイロードを保存して実行することができます:
もし EnableNodeOptionsEnvironmentVariable
が 無効 になっている場合、アプリは起動時に環境変数 NODE_OPTIONS を 無視 します。ただし、環境変数 ELECTRON_RUN_AS_NODE
が設定されている場合は、その環境変数も 無視 されます。ただし、fuse RunAsNode
が無効になっている場合も同様です。
ELECTRON_RUN_AS_NODE
を設定しない場合、次の エラー が発生します: Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.
アプリ Plist からのインジェクション
これらのキーを追加して、この環境変数を plist で悪用することができます:
検査によるRCE
こちらによると、--inspect
、--inspect-brk
、**--remote-debugging-port
**などのフラグを使用してElectronアプリケーションを実行すると、デバッグポートが開かれ、それに接続できるようになります(たとえば、Chromeのchrome://inspect
から)。そのため、コードを注入したり、新しいプロセスを起動したりすることができます。
例えば:
EnableNodeCliInspectArguments
フューズが無効になっている場合、アプリは起動時に --inspect
のようなノードパラメータを無視しますが、環境変数 ELECTRON_RUN_AS_NODE
が設定されている場合は無視されます。ただし、フューズ RunAsNode
が無効になっている場合も同様です。
ただし、electron パラメータ --remote-debugging-port=9229
を使用することはできますが、前述のペイロードは他のプロセスを実行するためには機能しません。
--remote-debugging-port=9222
パラメータを使用すると、Electronアプリから履歴(GETコマンドで)やブラウザのクッキー(ブラウザ内で復号され、それらを提供するjsonエンドポイントがあるため)などの情報を盗むことができます。
これについては、こちらやこちらで学び、自動ツール WhiteChocolateMacademiaNut や以下のようなシンプルなスクリプトを使用できます:
このブログポスト では、このデバッグを悪用して、ヘッドレスクロームが任意の場所に任意のファイルをダウンロードするようにします。
アプリ Plist からのインジェクション
これらのキーを追加して永続性を維持するために、この環境変数を plist で悪用することができます:
古いバージョンを悪用したTCCバイパス
macOSのTCCデーモンは、アプリケーションの実行バージョンをチェックしません。したがって、前述のいずれのテクニックでもElectronアプリケーションにコードをインジェクトできない場合は、以前のバージョンのAPPをダウンロードしてコードをインジェクトすることができます。それでもTCC権限を取得します(Trust Cacheが防止しない限り)。
非JSコードの実行
前述のテクニックにより、Electronアプリケーションのプロセス内でJSコードを実行できます。ただし、子プロセスは親アプリケーションと同じサンドボックスプロファイルで実行され、TCC権限を継承します。 したがって、たとえばカメラやマイクにアクセスするために権限を悪用したい場合は、プロセスから別のバイナリを実行するだけで済みます。
自動インジェクション
ツールelectroniz3rは、インストールされている脆弱なElectronアプリケーションを見つけ、それらにコードをインジェクトするのに簡単に使用できます。このツールは**--inspect
**テクニックを使用しようとします:
自分でコンパイルする必要があり、次のように使用できます:
参考文献
Last updated