mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/electron-des
This commit is contained in:
parent
21d108d072
commit
85cd167567
@ -19,12 +19,12 @@ Electron 앱의 소스 코드에서 `packet.json` 안에 보안 설정이 지정
|
||||
```
|
||||
Electron에는 2가지 프로세스 유형이 있습니다:
|
||||
|
||||
- Main Process (NodeJS에 대한 완전한 접근 권한을 가짐)
|
||||
- Renderer Process (보안상의 이유로 NodeJS 접근 권한이 제한되어야 함)
|
||||
- 메인 프로세스 (NodeJS에 대한 완전한 접근 권한을 가짐)
|
||||
- 렌더러 프로세스 (보안상의 이유로 NodeJS 접근 권한이 제한되어야 함)
|
||||
|
||||
.png>)
|
||||
|
||||
**renderer process**는 파일을 로드하는 브라우저 창이 될 것입니다:
|
||||
**렌더러 프로세스**는 파일을 로드하는 브라우저 창이 될 것입니다:
|
||||
```javascript
|
||||
const { BrowserWindow } = require("electron")
|
||||
let win = new BrowserWindow()
|
||||
@ -32,7 +32,7 @@ let win = new BrowserWindow()
|
||||
//Open Renderer Process
|
||||
win.loadURL(`file://path/to/index.html`)
|
||||
```
|
||||
**렌더러 프로세스**의 설정은 **main.js** 파일 내의 **메인 프로세스**에서 **구성**할 수 있습니다. 일부 구성은 **설정이 올바르게 구성된 경우** Electron 애플리케이션이 RCE 또는 기타 취약점에 노출되는 것을 **방지**합니다.
|
||||
**렌더러 프로세스**의 설정은 **main.js** 파일의 **메인 프로세스**에서 **구성**할 수 있습니다. 일부 구성은 **설정이 올바르게 구성된 경우** Electron 애플리케이션이 RCE 또는 기타 취약점에 노출되는 것을 **방지**합니다.
|
||||
|
||||
Electron 애플리케이션은 Node API를 통해 **장치에 접근할 수 있지만**, 이를 방지하도록 구성할 수 있습니다:
|
||||
|
||||
@ -42,7 +42,7 @@ Electron 애플리케이션은 Node API를 통해 **장치에 접근할 수 있
|
||||
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - 기본값은 꺼져 있습니다. NodeJS가 수행할 수 있는 작업을 제한합니다.
|
||||
- 워커에서의 Node 통합
|
||||
- **`nodeIntegrationInSubframes`** - 기본값은 꺼져 있습니다.
|
||||
- **`nodeIntegration`**이 **활성화**되면, 이는 Electron 애플리케이션 내의 **iframe에 로드된 웹 페이지에서 Node.js API**를 사용할 수 있게 합니다.
|
||||
- **`nodeIntegration`**이 **활성화**되면, 이는 Electron 애플리케이션 내의 **iframe**에 로드된 웹 페이지에서 **Node.js API**를 사용할 수 있게 합니다.
|
||||
- **`nodeIntegration`**이 **비활성화**되면, 프리로드는 iframe에서 로드됩니다.
|
||||
|
||||
구성 예시:
|
||||
@ -97,7 +97,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
|
||||
```
|
||||
### 트래픽 캡처
|
||||
|
||||
start-main 구성을 수정하고 다음과 같은 프록시 사용을 추가합니다:
|
||||
start-main 구성을 수정하고 다음과 같은 프록시 사용을 추가하세요:
|
||||
```javascript
|
||||
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
|
||||
```
|
||||
@ -111,7 +111,7 @@ Electron 앱을 로컬에서 실행할 수 있다면 임의의 자바스크립
|
||||
|
||||
## RCE: XSS + nodeIntegration
|
||||
|
||||
**nodeIntegration**이 **on**으로 설정되어 있으면, 웹 페이지의 자바스크립트는 `require()`를 호출하기만 하면 Node.js 기능을 쉽게 사용할 수 있습니다. 예를 들어, Windows에서 calc 애플리케이션을 실행하는 방법은 다음과 같습니다:
|
||||
**nodeIntegration**이 **on**으로 설정되어 있으면, 웹 페이지의 자바스크립트는 `require()`를 호출하는 것만으로도 Node.js 기능을 쉽게 사용할 수 있습니다. 예를 들어, Windows에서 calc 애플리케이션을 실행하는 방법은 다음과 같습니다:
|
||||
```html
|
||||
<script>
|
||||
require("child_process").exec("calc")
|
||||
@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
|
||||
|
||||
## RCE: preload
|
||||
|
||||
이 설정에서 언급된 스크립트는 **렌더러의 다른 스크립트보다 먼저 로드**되므로 **Node API에 무제한으로 접근**할 수 있습니다:
|
||||
이 설정에서 표시된 스크립트는 **렌더러의 다른 스크립트보다 먼저 로드**되므로 **Node API에 무제한으로 접근**할 수 있습니다:
|
||||
```javascript
|
||||
new BrowserWindow{
|
||||
webPreferences: {
|
||||
@ -161,7 +161,7 @@ _**contextIsolation**_은 **웹 페이지 스크립트와 JavaScript Electron의
|
||||
3. **덮어쓴 함수의 사용을 트리거**
|
||||
4. RCE?
|
||||
|
||||
내장 메서드를 덮어쓸 수 있는 두 곳이 있습니다: 프리로드 코드 또는 Electron 내부 코드:
|
||||
내장 메서드를 덮어쓸 수 있는 두 곳이 있습니다: 프리로드 코드 또는 Electron 내부 코드에서:
|
||||
|
||||
{{#ref}}
|
||||
electron-contextisolation-rce-via-preload-code.md
|
||||
@ -185,14 +185,14 @@ window.addEventListener('click', (e) => {
|
||||
|
||||
이 예제에 대한 자세한 정보는 [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`에 대한 올바른 설정을 보장하는 것이 중요합니다. **클라이언트 측 원격 코드 실행 (RCE)**이 프리로드 스크립트 또는 메인 프로세스의 Electron 기본 코드를 대상으로 할 때 이러한 설정이 적용되면 효과적으로 방지된다는 것이 확립되었습니다.
|
||||
|
||||
사용자가 링크와 상호작용하거나 새 창을 열 때, 애플리케이션의 보안 및 기능에 중요한 특정 이벤트 리스너가 트리거됩니다:
|
||||
```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` 함수를 사용합니다.
|
||||
|
||||
**여기 간단한 의사코드가 있습니다:**
|
||||
|
||||
@ -226,7 +226,7 @@ window.open(
|
||||
```
|
||||
## 내부 파일 읽기: XSS + contextIsolation
|
||||
|
||||
**`contextIsolation`을 비활성화하면 `<webview>` 태그를 사용할 수 있습니다**, `<iframe>`과 유사하게, 로컬 파일을 읽고 유출하는 데 사용됩니다. 제공된 예시는 이 취약점을 이용하여 내부 파일의 내용을 읽는 방법을 보여줍니다:
|
||||
**`contextIsolation` 비활성화는 `<webview>` 태그의 사용을 가능하게 하여**, `<iframe>`과 유사하게 로컬 파일을 읽고 유출할 수 있습니다. 제공된 예시는 이 취약점을 이용하여 내부 파일의 내용을 읽는 방법을 보여줍니다:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -260,9 +260,9 @@ XSS를 발견했지만 **RCE를 트리거하거나 내부 파일을 훔칠 수
|
||||
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
|
||||
webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
|
||||
```
|
||||
**`openInternally`** 호출은 **링크**가 플랫폼에 속하는 링크이기 때문에 **데스크탑 창**에서 **열릴지** 아니면 **브라우저에서 3자 리소스**로 열릴지를 결정합니다.
|
||||
**`openInternally`**에 대한 호출은 **링크**가 플랫폼에 속하는 링크이기 때문에 **데스크탑 창**에서 **열릴지** 아니면 **브라우저에서 3rd 파티 리소스**로 열릴지를 결정합니다.
|
||||
|
||||
함수가 사용하는 **정규 표현식**이 **우회 공격에 취약한 경우** (예: **서브도메인의 점을 이스케이프하지 않는 경우**) 공격자는 XSS를 악용하여 **새 창을 열 수 있습니다**. 이 창은 공격자의 인프라에 위치하며 **사용자에게 자격 증명을 요청**합니다:
|
||||
함수가 사용하는 **정규 표현식**이 **우회 공격에 취약한 경우**(예: **서브도메인의 점을 이스케이프하지 않는 경우**) 공격자는 XSS를 악용하여 **새 창을 열 수 있습니다**. 이 창은 공격자의 인프라에 위치하며 **사용자에게 자격 증명을 요청**합니다:
|
||||
```html
|
||||
<script>
|
||||
window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
@ -273,7 +273,7 @@ window.open("<http://subdomainagoogleq.com/index.html>")
|
||||
Electron Remote 모듈은 **렌더러 프로세스가 메인 프로세스 API에 접근할 수 있도록** 하여 Electron 애플리케이션 내에서의 통신을 용이하게 합니다. 그러나 이 모듈을 활성화하면 상당한 보안 위험이 발생합니다. 애플리케이션의 공격 표면이 확장되어 교차 사이트 스크립팅(XSS) 공격과 같은 취약점에 더 취약해집니다.
|
||||
|
||||
> [!TIP]
|
||||
> **remote** 모듈이 메인에서 렌더러 프로세스로 일부 API를 노출하지만, 구성 요소를 단순히 악용하는 것만으로 RCE를 얻는 것은 간단하지 않습니다. 그러나 구성 요소는 민감한 정보를 노출할 수 있습니다.
|
||||
> **remote** 모듈이 메인에서 렌더러 프로세스로 일부 API를 노출하지만, 구성 요소만을 악용하여 RCE를 얻는 것은 간단하지 않습니다. 그러나 구성 요소는 민감한 정보를 노출할 수 있습니다.
|
||||
|
||||
> [!WARNING]
|
||||
> 여전히 remote 모듈을 사용하는 많은 앱은 렌더러 프로세스에서 **NodeIntegration을 활성화해야** 하는 방식으로 구현되어 있으며, 이는 **엄청난 보안 위험**입니다.
|
||||
@ -319,7 +319,7 @@ Native.app.exit()
|
||||
```
|
||||
## systemPreferences 모듈
|
||||
|
||||
Electron에서 시스템 기본 설정에 접근하고 **시스템 이벤트를 발생시키는** **주요 API**입니다. **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, 및 **setUserDefault**와 같은 메서드는 모두 이 모듈의 **일부입니다**.
|
||||
Electron에서 시스템 기본 설정에 접근하고 **시스템 이벤트를 발생시키는** **주요 API**입니다. **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, **setUserDefault**와 같은 메서드는 모두 이 모듈의 **일부입니다**.
|
||||
|
||||
**사용 예:**
|
||||
```javascript
|
||||
@ -348,7 +348,7 @@ console.log('Recent Places:', recentPlaces);
|
||||
|
||||
* **setUserDefault**는 이러한 기본 설정을 **수정**할 수 있으며, 이는 앱의 **구성**에 영향을 미칠 수 있습니다.
|
||||
|
||||
* **구버전 Electron**(v8.3.0 이전)에서는 NSUserDefaults의 **표준 스위트**만 **접근 가능**했습니다.
|
||||
* **구버전 Electron**(v8.3.0 이전)에서는 **표준 스위트**의 NSUserDefaults만 **접근 가능**했습니다.
|
||||
|
||||
## Shell.showItemInFolder
|
||||
|
||||
@ -356,6 +356,18 @@ console.log('Recent Places:', recentPlaces);
|
||||
|
||||
자세한 정보는 [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)에서 확인하세요.
|
||||
|
||||
## Content Security Policy
|
||||
|
||||
Electron 앱은 **XSS 공격**을 **방지**하기 위해 **Content Security Policy (CSP)**를 가져야 합니다. **CSP**는 브라우저에서 **신뢰할 수 없는 코드**의 **실행**을 **방지**하는 데 도움이 되는 **보안 표준**입니다.
|
||||
|
||||
일반적으로 **`main.js`** 파일이나 **`index.html`** 템플릿의 **메타 태그** 안에 CSP를 설정합니다.
|
||||
|
||||
자세한 정보는 다음에서 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
pentesting-web/content-security-policy-csp-bypass/
|
||||
{{#endref}}
|
||||
|
||||
## **Tools**
|
||||
|
||||
- [**Electronegativity**](https://github.com/doyensec/electronegativity)는 Electron 기반 애플리케이션의 잘못된 구성 및 보안 안티 패턴을 식별하는 도구입니다.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user