From 31a591e497b92fa719537043e2a649f0fd6b02fe Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 8 Sep 2025 02:45:30 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/electron --- .../electron-desktop-apps/README.md | 326 ++++++++++++------ 1 file changed, 225 insertions(+), 101 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index 8df6dd6a3..38bea746d 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -1,30 +1,30 @@ -# Electron Desktop Apps +# Electron デスクトップアプリ {{#include ../../../banners/hacktricks-training.md}} -## Introduction +## はじめに -Electronは、ローカルバックエンド(**NodeJS**)とフロントエンド(**Chromium**)を組み合わせていますが、最新のブラウザのセキュリティメカニズムのいくつかが欠けています。 +Electron はローカルのバックエンド(**NodeJS**)とフロントエンド(**Chromium**)を組み合わせていますが、最新のブラウザが備えるいくつかのセキュリティ機構を欠いています。 -通常、Electronアプリのコードは`.asar`アプリケーション内にあります。コードを取得するには、抽出する必要があります: +通常、Electron アプリのコードは `.asar` アーカイブの中にあることが多く、コードを取得するには抽出する必要があります: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -Electronアプリのソースコード内の`packet.json`には、セキュリティ設定が行われている`main.js`ファイルが指定されています。 +Electronアプリのソースコードでは、`packet.json`内にセキュリティ設定が行われている`main.js`ファイルが指定されているのを見つけることができます。 ```json { "name": "standard-notes", "main": "./app/index.js", ``` -Electronには2つのプロセスタイプがあります: +Electronには2つのプロセスタイプがあります: -- メインプロセス(NodeJSへの完全なアクセス権を持つ) -- レンダラープロセス(セキュリティ上の理由からNodeJSへのアクセスが制限されるべき) +- Main Process (NodeJSへの完全なアクセス権を持つ) +- Renderer Process (セキュリティ上の理由からNodeJSへのアクセスは制限されるべき) ![](<../../../images/image (182).png>) -**レンダラープロセス**は、ファイルを読み込むブラウザウィンドウになります: +A **renderer process** は、ファイルを読み込むブラウザウィンドウになります: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,20 +32,20 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -**renderer process**の設定は、main.jsファイル内の**main process**で**構成**できます。いくつかの設定は、**設定が正しく構成されている**場合、ElectronアプリケーションがRCEやその他の脆弱性を持つのを**防ぐ**ことができます。 +**レンダラープロセス**の設定は、main.js ファイル内の**メインプロセス**で**構成**できます。いくつかの設定は、**Electron アプリケーションが RCE を受けるのを防ぐ**などの脆弱性を防げるもので、**設定が正しく構成されている**場合に有効です。 -Electronアプリケーションは、Node APIを介して**デバイスにアクセス**することができますが、それを防ぐように構成することもできます: +Electron アプリケーションは Node APIs を介して**デバイスにアクセスできる**可能性がありますが、それを防ぐように構成できます: -- **`nodeIntegration`** - デフォルトでは`off`です。オンの場合、renderer processからNode機能にアクセスできます。 -- **`contextIsolation`** - デフォルトでは`on`です。オフの場合、mainとrendererプロセスは隔離されません。 -- **`preload`** - デフォルトでは空です。 -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - デフォルトではオフです。NodeJSが実行できるアクションを制限します。 -- WorkersにおけるNode Integration -- **`nodeIntegrationInSubframes`** - デフォルトでは`off`です。 -- **`nodeIntegration`**が**有効**になっている場合、これはElectronアプリケーション内のiframeで**読み込まれたウェブページ**で**Node.js APIs**を使用することを許可します。 -- **`nodeIntegration`**が**無効**になっている場合、preloadsはiframe内で読み込まれます。 +- **`nodeIntegration`** - is `off` by default. If on, allows to access node features from the renderer process. +- **`contextIsolation`** - is `on` by default. If off, main and renderer processes aren't isolated. +- **`preload`** - empty by default. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - is off by default. It will restrict the actions NodeJS can perform. +- Node Integration in Workers +- **`nodeIntegrationInSubframes`**- is `off` by default. +- If **`nodeIntegration`** is **有効**, this would allow the use of **Node.js APIs** in web pages that are **iframe に読み込まれた** within an Electron application. +- If **`nodeIntegration`** is **無効**, then preloads will load in the iframe -構成の例: +Example of configuration: ```javascript const mainWindowOptions = { title: "Discord", @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -いくつかの **RCEペイロード** は [here](https://7as.es/electron/nodeIntegration_rce.txt) から: +以下は [here](https://7as.es/electron/nodeIntegration_rce.txt) からのいくつかの **RCE payloads**: ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### トラフィックのキャプチャ +### トラフィックをキャプチャ -start-main構成を変更し、次のようなプロキシの使用を追加します: +start-main の設定を変更し、次のような proxy の使用を追加します: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` ## Electron Local Code Injection -Electronアプリをローカルで実行できる場合、任意のJavaScriptコードを実行させることが可能です。方法を確認してください: +もしローカルで Electron App を実行できるなら、任意の javascript コードを実行させることが可能な場合があります。詳しくは次を確認してください: {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -111,7 +111,7 @@ Electronアプリをローカルで実行できる場合、任意のJavaScript ## RCE: XSS + nodeIntegration -**nodeIntegration**が**on**に設定されている場合、ウェブページのJavaScriptは`require()`を呼び出すだけでNode.jsの機能を簡単に使用できます。例えば、Windowsでcalcアプリケーションを実行する方法は次の通りです: +If the **nodeIntegration** is set to **on**, a web page's JavaScript can use Node.js features easily just by calling the `require()`. For example, the way to execute the calc application on Windows is: ```html ``` -> [!NOTE] > **`contextIsolation`がオンの場合、これは機能しません** +> [!NOTE] > **もし `contextIsolation` が有効になっている場合、これは動作しません** ## RCE: XSS + contextIsolation -_**contextIsolation**_は、**ウェブページのスクリプトとJavaScript Electronの内部コードの間に分離されたコンテキストを導入**し、各コードのJavaScript実行が互いに影響を与えないようにします。これはRCEの可能性を排除するために必要な機能です。 +_**contextIsolation**_ は、web ページのスクリプトと JavaScript の Electron 内部コードの間に **分離されたコンテキスト** を導入し、それぞれの JavaScript 実行が互いに影響を与えないようにします。これは RCE の可能性を排除するために必要な機能です。 -コンテキストが分離されていない場合、攻撃者は以下のことができます: +もしコンテキストが分離されていないと、攻撃者は次のことが可能になります: -1. **レンダラーで任意のJavaScriptを実行**(XSSまたは外部サイトへのナビゲーション) -2. **プリロードまたはElectron内部コードで使用される組み込みメソッドを上書き**して独自の関数にする -3. **上書きされた関数の使用をトリガー** -4. RCE? +1. レンダラー内で **arbitrary JavaScript in renderer** を実行する(XSS または外部サイトへの遷移) +2. preload や Electron 内部コードで使用される **built-in method を上書き** して自分の関数にする +3. **Trigger** して **overwritten function** の使用を呼び出す +4. RCE? + +There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: -組み込みメソッドを上書きできる場所は2つあります:プリロードコードまたはElectron内部コード: {{#ref}} electron-contextisolation-rce-via-preload-code.md {{#endref}} + {{#ref}} electron-contextisolation-rce-via-electron-internal-code.md {{#endref}} + {{#ref}} electron-contextisolation-rce-via-ipc.md {{#endref}} -### クリックイベントのバイパス +### Bypass click event -リンクをクリックする際に制限が適用されている場合、通常の左クリックの代わりに**ミドルクリック**を行うことでそれらをバイパスできるかもしれません。 +リンクをクリックしたときに制限がある場合、通常の left click の代わりに **doing a middle click** を行うことでそれらを回避できることがあります ```javascript window.addEventListener('click', (e) => { ``` ## RCE via shell.openExternal -この例に関する詳細は[https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8)および[https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)を確認してください。 +この例の詳細は [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) と [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) を参照してください。 -Electronデスクトップアプリケーションを展開する際には、`nodeIntegration`と`contextIsolation`の設定が正しいことを確認することが重要です。**クライアント側のリモートコード実行(RCE)**がプリロードスクリプトやメインプロセスからのElectronのネイティブコードをターゲットにする場合、これらの設定が整っていれば効果的に防止されることが確立されています。 +Electron デスクトップアプリケーションを展開する際は、`nodeIntegration` と `contextIsolation` の設定を正しく行うことが重要です。これらの設定により、main process から preload scripts や Electron のネイティブコードを標的とする **client-side remote code execution (RCE)** が実質的に防止されることが確認されています。 -ユーザーがリンクと対話したり新しいウィンドウを開いたりすると、特定のイベントリスナーがトリガーされ、アプリケーションのセキュリティと機能にとって重要です: +ユーザーがリンクをクリックしたり新しいウィンドウを開いたりすると、アプリのセキュリティと機能にとって重要な特定のイベントリスナーがトリガーされます: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -これらのリスナーは**デスクトップアプリケーションによってオーバーライドされ**、独自の**ビジネスロジック**を実装します。アプリケーションは、ナビゲートされたリンクを内部で開くべきか、外部のウェブブラウザで開くべきかを評価します。この決定は通常、`openInternally`という関数を通じて行われます。この関数が`false`を返す場合、リンクは外部で開くべきであることを示し、`shell.openExternal`関数を利用します。 +これらのリスナーは、デスクトップアプリケーションによって**上書きされ**、独自の**ビジネスロジック**を実装します。アプリケーションは、遷移したリンクを内部で開くべきか外部のウェブブラウザで開くべきかを判断します。この判断は通常 `openInternally` 関数で行われます。もしこの関数が `false` を返すと、リンクは外部で開くべきであることを示し、`shell.openExternal` 関数を使用します。 -**以下は簡略化された擬似コードです:** +**以下は簡略化した擬似コードです:** ![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>) ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Electron JSのセキュリティベストプラクティスは、`openExternal`関数で信頼できないコンテンツを受け入れることを避けるように助言しています。これは、さまざまなプロトコルを通じてRCEを引き起こす可能性があります。オペレーティングシステムは、RCEを引き起こす可能性のある異なるプロトコルをサポートしています。このトピックに関する詳細な例とさらなる説明については、[このリソース](https://positive.security/blog/url-open-rce#windows-10-19042)を参照してください。ここには、この脆弱性を悪用できるWindowsプロトコルの例が含まれています。 +Electron JS のセキュリティベストプラクティスは、`openExternal` 関数で信頼できないコンテンツを受け入れるべきではないと助言しています。さもないと、さまざまなプロトコルを介して RCE を引き起こす可能性があります。オペレーティングシステムは RCE を引き起こし得るさまざまなプロトコルをサポートしています。このトピックの詳細な例や説明については、[this resource](https://positive.security/blog/url-open-rce#windows-10-19042) を参照してください。ここにはこの脆弱性を悪用できる Windows プロトコルの例が含まれています。 -macOSでは、`openExternal`関数を悪用して、`shell.openExternal('file:///System/Applications/Calculator.app')`のように任意のコマンドを実行できます。 +macos では、`openExternal` 関数を悪用して `shell.openExternal('file:///System/Applications/Calculator.app')` のように任意のコマンドを実行させることができます。 -**Windowsプロトコルの悪用の例には:** +**Windows プロトコルの悪用例には以下が含まれます:** ```html ``` -## RCE: webviewTag + 脆弱なプリロードIPC + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -この脆弱性は**[このレポート](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**にあります。 +この vuln は **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)** にあります。 -**webviewTag**は**非推奨の機能**で、**レンダラープロセス**内で**NodeJS**を使用することを可能にします。これは、プリロードコンテキスト内でスクリプトを読み込むことを許可するため、無効にするべきです。 +The **webviewTag** は **deprecated feature** で、**renderer process** 内で **NodeJS** の使用を許可します。無効化すべきで、preload コンテキスト内にスクリプトを読み込めるため、次のようになります: ```xml ``` -したがって、任意のページを読み込むことができる攻撃者は、そのタグを使用して**任意のプリロードスクリプトを読み込む**ことができます。 +したがって、任意のページを読み込める攻撃者は、そのタグを使って**任意の preload script を読み込む**ことができます。 -このプリロードスクリプトは、その後**脆弱なIPCサービス(`skype-new-window`)**を呼び出すために悪用され、**`shell.openExternal`**を呼び出してRCEを取得しました: +この preload script は悪用され、**vulnerable IPC service (`skype-new-window`)** を呼び出し、それが **`shell.openExternal`** を呼び出して RCE を引き起こしていました: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -247,11 +250,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## 内部ファイルの読み取り: XSS + contextIsolation -**`contextIsolation`を無効にすると、ローカルファイルを読み取るために``タグを使用できるようになります**。これは`