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 98fbfeb66..7d653d2c0 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 @@ -4,14 +4,14 @@ ## Wprowadzenie -Electron łączy lokalny backend (z **NodeJS**) i frontend (**Chromium**), chociaż brakuje mu niektórych mechanizmów zabezpieczeń nowoczesnych przeglądarek. +Electron łączy lokalny backend (z **NodeJS**) i frontend (**Chromium**), chociaż brakuje mu niektórych mechanizmów bezpieczeństwa nowoczesnych przeglądarek. -Zazwyczaj kod aplikacji electron można znaleźć wewnątrz aplikacji `.asar`, aby uzyskać kod, musisz go wyodrębnić: +Zazwyczaj kod aplikacji Electron znajdziesz wewnątrz pakietu `.asar`; aby uzyskać kod, musisz go wyodrębnić: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -W kodzie źródłowym aplikacji Electron, w pliku `packet.json`, można znaleźć określony plik `main.js`, w którym ustawione są konfiguracje zabezpieczeń. +W kodzie źródłowym aplikacji Electron, w pliku `packet.json`, można znaleźć wskazany plik `main.js`, w którym ustawione są konfiguracje bezpieczeństwa. ```json { "name": "standard-notes", @@ -20,7 +20,7 @@ W kodzie źródłowym aplikacji Electron, w pliku `packet.json`, można znaleź Electron ma 2 typy procesów: - Proces główny (ma pełny dostęp do NodeJS) -- Proces renderera (powinien mieć ograniczony dostęp do NodeJS z powodów bezpieczeństwa) +- Proces renderera (powinien mieć ograniczony dostęp do NodeJS ze względów bezpieczeństwa) ![](<../../../images/image (182).png>) @@ -32,18 +32,18 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Ustawienia **procesu renderera** mogą być **konfigurowane** w **procesie głównym** w pliku main.js. Niektóre z konfiguracji **zapobiegną uzyskaniu RCE przez aplikację Electron** lub inne podatności, jeśli **ustawienia są poprawnie skonfigurowane**. +Ustawienia **procesu renderera** można **skonfigurować** w **procesie głównym** w pliku main.js. Niektóre konfiguracje będą **zapobiegać uzyskaniu RCE przez aplikację Electron** lub innym podatnościom, jeśli **ustawienia są poprawnie skonfigurowane**. -Aplikacja electron **może uzyskać dostęp do urządzenia** za pomocą interfejsów API Node, chociaż można ją skonfigurować, aby temu zapobiec: +Aplikacja Electron **może uzyskać dostęp do urządzenia** za pomocą Node apis, chociaż można to skonfigurować, aby temu zapobiec: -- **`nodeIntegration`** - jest `wyłączone` domyślnie. Jeśli włączone, pozwala na dostęp do funkcji node z procesu renderera. -- **`contextIsolation`** - jest `włączone` domyślnie. Jeśli wyłączone, procesy główny i renderera nie są izolowane. -- **`preload`** - pusty domyślnie. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - jest wyłączone domyślnie. Ograniczy działania, które NodeJS może wykonać. -- Integracja Node w Workerach -- **`nodeIntegrationInSubframes`** - jest `wyłączone` domyślnie. -- Jeśli **`nodeIntegration`** jest **włączone**, pozwoli to na użycie **API Node.js** w stronach internetowych, które są **ładowane w iframe** w aplikacji Electron. -- Jeśli **`nodeIntegration`** jest **wyłączone**, wówczas preloady będą ładowane w iframe. +- **`nodeIntegration`** - jest domyślnie ustawione na `off`. Jeśli jest włączone, umożliwia dostęp do funkcji Node z procesu renderera. +- **`contextIsolation`** - domyślnie jest `on`. Jeśli `off`, procesy główny i renderer nie są izolowane. +- **`preload`** - domyślnie puste. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - jest domyślnie `off`. Ograniczy działania, które NodeJS może wykonywać. +- Node Integration in Workers +- **`nodeIntegrationInSubframes`** - jest domyślnie `off`. +- Jeśli **`nodeIntegration`** jest **włączone**, to pozwoli na użycie **Node.js APIs** na stronach WWW, które są **ładowane w iframe'ach** w aplikacji Electron. +- Jeśli **`nodeIntegration`** jest **wyłączone**, wtedy preloady zostaną załadowane w iframe Przykład konfiguracji: ```javascript @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Niektóre **RCE payloads** z [tutaj](https://7as.es/electron/nodeIntegration_rce.txt): +Niektóre **RCE payloads** z [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### Capture traffic +### Przechwytywanie ruchu -Zmodyfikuj konfigurację start-main i dodaj użycie proxy, takiego jak: +Zmodyfikuj konfigurację start-main i dodaj użycie proxy, na przykład: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` -## Wstrzykiwanie kodu lokalnego w Electron +## Lokalna injekcja kodu w aplikacji Electron + +Jeśli możesz uruchomić lokalnie aplikację Electron, możliwe, że będziesz w stanie sprawić, by wykonała dowolny kod JavaScript. Zobacz, jak w: -Jeśli możesz lokalnie uruchomić aplikację Electron, istnieje możliwość, że możesz sprawić, aby wykonała dowolny kod JavaScript. Sprawdź jak w: {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -111,7 +112,7 @@ Jeśli możesz lokalnie uruchomić aplikację Electron, istnieje możliwość, ## RCE: XSS + nodeIntegration -Jeśli **nodeIntegration** jest ustawione na **włączone**, JavaScript na stronie internetowej może łatwo korzystać z funkcji Node.js, po prostu wywołując `require()`. Na przykład, sposób uruchomienia aplikacji kalkulatora w systemie Windows to: +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] > **Jeśli `contextIsolation` jest włączony, to nie zadziała** +> [!NOTE] > **Jeśli `contextIsolation` jest włączone, to nie zadziała** ## RCE: XSS + contextIsolation -_**contextIsolation**_ wprowadza **oddzielone konteksty między skryptami strony internetowej a wewnętrznym kodem JavaScript Electron**, aby wykonanie JavaScriptu każdego kodu nie wpływało na siebie nawzajem. Jest to niezbędna funkcja, aby wyeliminować możliwość RCE. +The _**contextIsolation**_ wprowadza **oddzielne konteksty między skryptami strony a wewnętrznym kodem JavaScript Electron**, dzięki czemu wykonanie JavaScript jednego z nich nie wpływa na drugie. To niezbędna funkcja, aby wyeliminować możliwość RCE. -Jeśli konteksty nie są izolowane, atakujący może: +If the contexts aren't isolated an attacker can: -1. Wykonać **dowolny JavaScript w rendererze** (XSS lub nawigacja do zewnętrznych stron) -2. **Nadpisać wbudowaną metodę**, która jest używana w preload lub wewnętrznym kodzie Electron na własną funkcję +1. Execute **arbitrary JavaScript in renderer** (XSS or navigation to external sites) +2. **Nadpisać wbudowaną metodę**, która jest używana w preload lub wewnętrznym kodzie Electron, żeby przejąć kontrolę 3. **Wywołać** użycie **nadpisanej funkcji** 4. RCE? -Są 2 miejsca, w których wbudowane metody mogą być nadpisane: w kodzie preload lub w wewnętrznym kodzie Electron: +There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: {{#ref}} @@ -180,34 +181,34 @@ electron-contextisolation-rce-via-ipc.md ### Ominięcie zdarzenia kliknięcia -Jeśli na kliknięcie linku nałożone są ograniczenia, możesz być w stanie je obejść **wykonując kliknięcie środkowe** zamiast zwykłego lewego kliknięcia. +If there are restrictions applied when you click a link you might be able to bypass them **klikając środkowym przyciskiem myszy** zamiast zwykłego lewego kliknięcia ```javascript window.addEventListener('click', (e) => { ``` -## RCE za pomocą shell.openExternal +## RCE przez shell.openExternal -Aby uzyskać więcej informacji na temat tych przykładów, sprawdź [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) oraz [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) +Aby uzyskać więcej informacji na temat tych przykładów, zobacz [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) i [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -Podczas wdrażania aplikacji desktopowej Electron, zapewnienie odpowiednich ustawień dla `nodeIntegration` i `contextIsolation` jest kluczowe. Ustalono, że **wykonywanie zdalnego kodu po stronie klienta (RCE)**, które celuje w skrypty preload lub natywny kod Electron z głównego procesu, jest skutecznie zapobiegane przy tych ustawieniach. +Podczas wdrażania aplikacji desktopowej Electron kluczowe jest ustawienie właściwych opcji `nodeIntegration` i `contextIsolation`. Uznaje się, że **client-side remote code execution (RCE)** wymierzone w preload scripts lub natywny kod Electrona z procesu głównego jest skutecznie uniemożliwione przy takich ustawieniach. -Po interakcji użytkownika z linkami lub otwieraniu nowych okien, uruchamiane są określone nasłuchiwacze zdarzeń, które są kluczowe dla bezpieczeństwa i funkcjonalności aplikacji: +Gdy użytkownik wchodzi w interakcję z linkami lub otwiera nowe okna, uruchamiane są określone nasłuchiwacze zdarzeń, które są kluczowe dla bezpieczeństwa i funkcjonalności aplikacji: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -Te nasłuchiwacze są **nadpisywane przez aplikację desktopową**, aby wdrożyć własną **logikę biznesową**. Aplikacja ocenia, czy nawigowany link powinien być otwarty wewnętrznie, czy w zewnętrznej przeglądarce internetowej. Decyzja ta jest zazwyczaj podejmowana za pomocą funkcji `openInternally`. Jeśli ta funkcja zwraca `false`, oznacza to, że link powinien być otwarty zewnętrznie, wykorzystując funkcję `shell.openExternal`. +Te nasłuchiwacze są **nadpisywane przez aplikację desktopową** w celu zaimplementowania własnej **logiki biznesowej**. Aplikacja ocenia, czy nawigowany link powinien zostać otwarty wewnętrznie czy w zewnętrznej przeglądarce. Decyzja ta jest zazwyczaj podejmowana przez funkcję `openInternally`. Jeżeli ta funkcja zwraca `false`, oznacza to, że link powinien zostać otworzony zewnętrznie przy użyciu `shell.openExternal`. -**Oto uproszczony pseudokod:** +**Poniżej uproszczony pseudokod:** ![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>) -Najlepsze praktyki bezpieczeństwa Electron JS odradzają akceptowanie nieufnej zawartości za pomocą funkcji `openExternal`, ponieważ może to prowadzić do RCE przez różne protokoły. Systemy operacyjne obsługują różne protokoły, które mogą wywołać RCE. Aby uzyskać szczegółowe przykłady i dalsze wyjaśnienia na ten temat, można odwołać się do [tego zasobu](https://positive.security/blog/url-open-rce#windows-10-19042), który zawiera przykłady protokołów Windows zdolnych do wykorzystania tej podatności. +Zalecenia dotyczące bezpieczeństwa Electron JS odradzają akceptowanie nieufnej treści za pomocą funkcji `openExternal`, ponieważ może to doprowadzić do RCE przez różne protokoły. Systemy operacyjne obsługują różne protokoły, które mogą wywołać RCE. Po szczegółowe przykłady i dodatkowe wyjaśnienia na ten temat można odnieść się do [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), które zawiera przykłady protokołów Windows, które mogą wykorzystać tę podatność. -W macos funkcja `openExternal` może być wykorzystana do wykonywania dowolnych poleceń, jak w `shell.openExternal('file:///System/Applications/Calculator.app')`. +W macos funkcję `openExternal` można wykorzystać do wykonania dowolnych poleceń, na przykład `shell.openExternal('file:///System/Applications/Calculator.app')`. -**Przykłady exploitów protokołów Windows obejmują:** +**Przykłady Windows protocol exploits obejmują:** ```html ``` -## RCE: webviewTag + podatny preload IPC + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -Ta luka może być znaleziona w **[tym raporcie](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +This vuln można znaleźć w **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. -**webviewTag** to **przestarzała funkcja**, która pozwala na użycie **NodeJS** w **procesie renderowania**, co powinno być wyłączone, ponieważ pozwala na załadowanie skryptu w kontekście preload, jak: +**webviewTag** to **przestarzała funkcja**, która umożliwia użycie **NodeJS** w **renderer process**, którą należy wyłączyć, ponieważ pozwala załadować skrypt wewnątrz preload context, np.: ```xml ``` -Dlatego atakujący, który zdołałby załadować dowolną stronę, mógłby użyć tego tagu do **załadowania dowolnego skryptu preload**. +W związku z tym atakujący, któremu uda się załadować dowolną stronę, mógłby użyć tego tagu, aby **załadować dowolny preload script**. -Ten skrypt preload został następnie wykorzystany do wywołania **vulnerable IPC service (`skype-new-window`)**, który wywoływał **`shell.openExternal`**, aby uzyskać RCE: +Ten preload script został następnie nadużyty, aby wywołać **podatną usługę IPC (`skype-new-window`)**, która wywoływała **`shell.openExternal`**, aby uzyskać RCE: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -248,13 +249,13 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do }, 5000); })(); ``` -## Odczyt wewnętrznych plików: XSS + contextIsolation +## Odczyt plików wewnętrznych: XSS + contextIsolation -**Wyłączenie `contextIsolation` umożliwia użycie tagów ``**, podobnie jak `