mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
112 lines
13 KiB
Markdown
112 lines
13 KiB
Markdown
# BrowExt - permissions & host_permissions
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Basic Information
|
|
|
|
### **`permissions`**
|
|
|
|
권한은 확장 프로그램의 **`manifest.json`** 파일에서 **`permissions`** 속성을 사용하여 정의되며 브라우저가 접근할 수 있는 거의 모든 것(쿠키 또는 물리적 저장소)에 대한 접근을 허용합니다:
|
|
|
|
이전 매니페스트는 확장 프로그램이 `storage` 권한을 요구한다고 선언합니다. 이는 [저장소 API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)를 사용하여 데이터를 지속적으로 저장할 수 있음을 의미합니다. 사용자에게 어느 정도의 제어를 제공하는 쿠키나 `localStorage` API와 달리, **확장 프로그램 저장소는 일반적으로 확장 프로그램을 제거해야만 지울 수 있습니다**.
|
|
|
|
확장 프로그램은 **`manifest.json`** 파일에 표시된 권한을 요청하며, 확장 프로그램을 설치한 후에는 **항상 브라우저에서 권한을 확인할 수 있습니다**, 아래 이미지와 같이:
|
|
|
|
<figure><img src="../../images/image (18).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
[**Chromium 브라우저 확장이 요청할 수 있는 권한의 전체 목록은 여기에서 확인할 수 있습니다**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 및 [**Firefox 확장 프로그램의 전체 목록은 여기에서 확인할 수 있습니다**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.**
|
|
|
|
### `host_permissions`
|
|
|
|
선택적이지만 강력한 설정인 **`host_permissions`**는 확장 프로그램이 [`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies), [`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest), 및 [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs)와 같은 API를 통해 상호작용할 수 있는 호스트를 나타냅니다.
|
|
|
|
다음 `host_permissions`는 기본적으로 모든 웹을 허용합니다:
|
|
```json
|
|
"host_permissions": [
|
|
"*://*/*"
|
|
]
|
|
|
|
// Or:
|
|
"host_permissions": [
|
|
"http://*/*",
|
|
"https://*/*"
|
|
]
|
|
|
|
// Or:
|
|
"host_permissions": [
|
|
"<all_urls>"
|
|
]
|
|
```
|
|
이것들은 브라우저 확장 프로그램이 자유롭게 접근할 수 있는 호스트입니다. 이는 브라우저 확장 프로그램이 **`fetch("https://gmail.com/")`**를 호출할 때 CORS에 의해 제한되지 않기 때문입니다.
|
|
|
|
## `permissions` 및 `host_permissions` 악용하기
|
|
|
|
### 탭
|
|
|
|
게다가, **`host_permissions`**는 “고급” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **기능을 잠금 해제합니다.** 이들은 확장 프로그램이 [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query)를 호출하여 **사용자의 브라우저 탭 목록**을 가져오고 어떤 **웹 페이지(주소 및 제목)가 로드되었는지** 알 수 있게 해줍니다.
|
|
|
|
> [!CAUTION]
|
|
> 뿐만 아니라, [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **와 같은 리스너도 훨씬 더 유용해집니다.** 이들은 새로운 페이지가 탭에 로드될 때마다 알림을 받습니다.
|
|
|
|
### 콘텐츠 스크립트 실행 <a href="#running-content-scripts" id="running-content-scripts"></a>
|
|
|
|
콘텐츠 스크립트는 반드시 확장 프로그램 매니페스트에 정적으로 작성될 필요는 없습니다. 충분한 **`host_permissions`**가 주어지면, **확장 프로그램은** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **또는** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript)를 호출하여 동적으로 로드할 수 있습니다.
|
|
|
|
두 API는 확장 프로그램에 포함된 파일뿐만 아니라 **임의의 코드**를 콘텐츠 스크립트로 실행할 수 있게 해줍니다. 전자는 문자열로 JavaScript 코드를 전달할 수 있는 반면, 후자는 주입 취약점에 덜 취약한 JavaScript 함수를 기대합니다. 그럼에도 불구하고, 두 API는 잘못 사용될 경우 큰 혼란을 초래할 수 있습니다.
|
|
|
|
> [!CAUTION]
|
|
> 위의 기능 외에도, 콘텐츠 스크립트는 예를 들어 **웹 페이지에 입력되는 자격 증명을 가로챌 수 있습니다.** 이들을 악용하는 또 다른 고전적인 방법은 **모든 웹사이트에 광고를 주입하는 것입니다.** 뉴스 웹사이트의 신뢰성을 악용하기 위해 **사기 메시지를 추가하는 것**도 가능합니다. 마지막으로, 이들은 **은행 웹사이트를 조작하여** 자금 이체를 우회할 수 있습니다.
|
|
|
|
### 암묵적 권한 <a href="#implicit-privileges" id="implicit-privileges"></a>
|
|
|
|
일부 확장 프로그램 권한은 **명시적으로 선언할 필요가 없습니다.** 한 예로 [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs)가 있습니다: 그 기본 기능은 어떤 권한 없이도 접근할 수 있습니다. 어떤 확장 프로그램이든 탭을 열고 닫을 때 알림을 받을 수 있지만, 이 탭이 어떤 웹사이트와 관련이 있는지는 알 수 없습니다.
|
|
|
|
너무 무해하게 들리나요? [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create)는 그리 무해하지 않습니다. 이는 **새 탭을 생성하는 데 사용될 수 있으며**, 본질적으로 [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open)과 동일합니다. 그러나 `window.open()`은 **팝업 차단기의 영향을 받지만, `tabs.create()`는 그렇지 않습니다.**
|
|
|
|
> [!CAUTION]
|
|
> 확장 프로그램은 원할 때마다 임의의 수의 탭을 생성할 수 있습니다.
|
|
|
|
가능한 `tabs.create()` 매개변수를 살펴보면, 그 기능이 `window.open()`이 허용하는 것보다 훨씬 더 넓다는 것을 알 수 있습니다. Firefox는 이 API와 함께 `data:` URI의 사용을 허용하지 않지만, Chrome은 그러한 보호가 없습니다. **최상위에서 이러한 URI의 사용은** [**피싱에 악용되었기 때문에 금지되었습니다**](https://bugzilla.mozilla.org/show_bug.cgi?id=1331351)**.**
|
|
|
|
[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update)는 `tabs.create()`와 매우 유사하지만 **기존 탭을 수정합니다.** 따라서 악의적인 확장 프로그램은 예를 들어 임의로 광고 페이지를 당신의 탭 중 하나에 로드할 수 있으며, 해당 탭을 활성화할 수도 있습니다.
|
|
|
|
### 웹캠, 지리적 위치 및 친구들 <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
|
|
|
|
웹사이트가 특별한 권한을 요청할 수 있다는 것을 알고 있을 것입니다. 예를 들어, 웹캠(화상 회의 도구)이나 지리적 위치(지도)에 접근하기 위해서입니다. 이는 악용 가능성이 상당한 기능이므로, 사용자는 매번 여전히 이를 원한다고 확인해야 합니다.
|
|
|
|
> [!CAUTION]
|
|
> 브라우저 확장 프로그램은 그렇지 않습니다. **브라우저 확장 프로그램이** [**당신의 웹캠이나 마이크에 접근하고 싶다면**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, 단 한 번만 권한을 요청하면 됩니다.**
|
|
|
|
일반적으로 확장 프로그램은 설치 직후에 이를 요청합니다. 이 프롬프트가 수락되면, **언제든지 웹캠 접근이 가능해집니다.** 사용자가 이 시점에서 확장 프로그램과 상호작용하지 않더라도 가능합니다. 네, 사용자는 확장 프로그램이 정말로 웹캠 접근이 필요할 때만 이 프롬프트를 수락할 것입니다. 그러나 그 이후에는 확장 프로그램이 비밀리에 아무것도 녹음하지 않을 것이라고 신뢰해야 합니다.
|
|
|
|
[당신의 정확한 지리적 위치](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) 또는 [클립보드 내용](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API)에 접근하는 경우, 명시적으로 권한을 부여할 필요가 전혀 없습니다. **확장 프로그램은 단순히 `geolocation` 또는 `clipboard`를** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **에 추가합니다.** 이러한 접근 권한은 확장 프로그램이 설치될 때 암묵적으로 부여됩니다. 따라서 이러한 권한을 가진 악의적이거나 손상된 확장 프로그램은 당신의 이동 프로필을 생성하거나 복사된 비밀번호를 모니터링할 수 있습니다.
|
|
|
|
**`history`** 키워드를 확장 프로그램 매니페스트의 [permissions entry](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions)에 추가하면 **`history API`**에 대한 **접근이 허용됩니다.** 이를 통해 사용자의 전체 브라우징 기록을 한 번에 검색할 수 있으며, 사용자가 이러한 웹사이트를 다시 방문할 때까지 기다릴 필요가 없습니다.
|
|
|
|
**`bookmarks`** **권한**은 유사한 악용 가능성을 가지고 있으며, 이 권한은 **모든 북마크를** [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks) **를 통해 읽을 수 있게 해줍니다.**
|
|
|
|
### 저장소 권한 <a href="#the-storage-permission" id="the-storage-permission"></a>
|
|
|
|
확장 프로그램 저장소는 단순히 키-값 컬렉션으로, 어떤 웹사이트에서도 사용할 수 있는 [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)와 매우 유사합니다. 따라서 여기에는 민감한 정보를 저장해서는 안 됩니다.
|
|
|
|
그러나 광고 회사는 이 저장소를 악용할 수도 있습니다.
|
|
|
|
### 더 많은 권한
|
|
|
|
여기에서 [**Chromium 브라우저 확장 프로그램이 요청할 수 있는 권한의 전체 목록을 찾을 수 있습니다**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 및 [**Firefox 확장 프로그램에 대한 전체 목록은 여기에서 확인할 수 있습니다**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.**
|
|
|
|
## 예방 <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
|
|
|
|
구글 개발자의 정책은 확장 프로그램이 기능에 필요한 것보다 더 많은 권한을 요청하는 것을 명시적으로 금지하여 과도한 권한 요청을 효과적으로 완화합니다. 브라우저 확장 프로그램이 이 경계를 넘은 사례는 브라우저 자체와 함께 배포된 경우로, 애드온 스토리를 통해서가 아닙니다.
|
|
|
|
브라우저는 확장 프로그램 권한의 남용을 더욱 억제할 수 있습니다. 예를 들어, Chrome의 [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) 및 [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API는 화면 녹화를 위해 설계되었으며, 남용을 최소화하도록 되어 있습니다. tabCapture API는 확장 프로그램 아이콘을 클릭하는 것과 같은 직접적인 사용자 상호작용을 통해서만 활성화될 수 있으며, desktopCapture는 녹화할 창에 대한 사용자 확인을 요구하여 은밀한 녹화 활동을 방지합니다.
|
|
|
|
그러나 보안 조치를 강화하면 종종 확장 프로그램의 유연성과 사용자 친화성이 감소합니다. [activeTab permission](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission)은 이러한 거래를 보여줍니다. 이는 확장 프로그램이 전체 인터넷에 대한 호스트 권한을 요청할 필요를 없애기 위해 도입되었으며, 사용자가 명시적으로 활성화할 때만 현재 탭에 접근할 수 있도록 합니다. 이 모델은 사용자 주도 작업이 필요한 확장 프로그램에는 효과적이지만, 자동 또는 사전 조치가 필요한 경우에는 편의성과 즉각적인 반응성을 저해합니다.
|
|
|
|
## **참고문헌**
|
|
|
|
- [https://palant.info/2022/08/17/impact-of-extension-privileges/](https://palant.info/2022/08/17/impact-of-extension-privileges/)
|
|
- [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|