# BrowExt - 권한 및 호스트_권한
htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**!
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
## 기본 정보
### **`permissions`**
권한은 확장 프로그램의 **`manifest.json`** 파일에서 **`permissions`** 속성을 사용하여 정의되며 브라우저가 액세스할 수 있는 거의 모든 것에 액세스를 허용합니다(쿠키 또는 물리적 저장소):
이전 manifest는 확장 프로그램이 `storage` 권한이 필요하다고 선언합니다. 이는 확장 프로그램이 [저장소 API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)를 사용하여 데이터를 영구적으로 저장할 수 있음을 의미합니다. 사용자에게 일부 제어 수준을 제공하는 쿠키나 `localStorage` API와 달리, **확장 프로그램 저장소는 일반적으로 확장 프로그램을 제거함으로써만 지울 수 있습니다**.
확장 프로그램은 **`manifest.json`** 파일에서 지정된 권한을 요청하며 확장 프로그램을 설치한 후에는 브라우저에서 항상 해당 권한을 확인할 수 있습니다. 아래 이미지에서 보여지는 것처럼:
[**크로미움 브라우저 확장 프로그램이 요청할 수 있는 권한의 완전한 목록은 여기에서 확인할 수 있습니다**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 및 [**파이어폭스 확장 프로그램을 위한 완전한 목록은 여기에서 확인할 수 있습니다**](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": [
""
]
```
## 브라우저 확장 프로그램이 자유롭게 액세스할 수 있는 호스트입니다. 이는 브라우저 확장 프로그램이 **`fetch("https://gmail.com/")`**을 호출할 때 CORS에 의해 제한되지 않기 때문입니다.
### `permissions` 및 `host_permissions` 남용
또한 **`host_permissions`**은 "고급" [**탭 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)를 호출하여 사용자의 브라우저 탭 목록을 얻을 뿐만 아니라 로드된 **웹 페이지(주소 및 제목)를 알 수 있습니다.**
{% hint style="danger" %}
뿐만 아니라 [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated)와 같은 리스너도 **훨씬 더 유용해집니다.** 이들은 새로운 페이지가 탭에 로드될 때마다 알림을 받습니다.
{% endhint %}
### 콘텐츠 스크립트 실행
콘텐츠 스크립트는 일반적으로 확장 프로그램 매니페스트에 정적으로 작성되지 않습니다. 충분한 **`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 모두 오용될 경우 큰 문제를 일으킬 수 있습니다.
{% hint style="danger" %}
위의 기능 외에도 콘텐츠 스크립트는 예를 들어 웹 페이지에 입력된 자격 증명을 **가로챌 수 있습니다.** 이들을 남용하는 또 다른 전형적인 방법은 각 웹 사이트에 **광고를 삽입**하는 것입니다. 뉴스 웹 사이트의 신뢰도를 남용하기 위해 **사기 메시지를 추가**하는 것도 가능합니다. 마지막으로, **은행 웹 사이트를 조작**하여 자금 이체를 재지정할 수도 있습니다.
{% endhint %}
### 암시적 권한
일부 확장 프로그램 권한은 **명시적으로 선언할 필요가 없습니다.** 예를 들어 [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()`는 그렇지 않습니다.
{% hint style="danger" %}
확장 프로그램은 원하는 대로 언제든지 탭을 생성할 수 있습니다.
{% endhint %}
`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()`와 매우 유사하지만 **기존 탭을 수정**합니다. 따라서 악의적인 확장 프로그램은 예를 들어 광고 페이지를 임의로 로드하여 탭을 활성화할 수 있습니다.
### 웹캠, 지리적 위치 및 기타
웹 사이트가 웹캠(비디오 회의 도구) 또는 지리적 위치(지도)에 액세스하기 위한 특별한 권한을 요청할 수 있다는 것을 알고 계실 것입니다. 이는 남용 가능성이 큰 기능이므로 사용자는 매번 이를 확인해야 합니다.
{% hint style="danger" %}
그러나 브라우저 확장 프로그램의 경우 **웹캠이나 마이크에 액세스하려면** [**한 번만 권한을 요청하면**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**됩니다.**
{% endhint %}
일반적으로 확장 프로그램은 설치된 직후에 이를 수행합니다. 이 프롬프트이 수락되면, **웹캠 액세스가 언제든지 가능**하며, 사용자가 확장 프로그램과 상호 작용하지 않는 경우에도 가능합니다. 네, 사용자는 확장 프로그램이 웹캠 액세스가 실제로 필요한 경우에만 이 프롬프트를 수락할 것입니다. 그러나 그 이후에는 확장 프로그램이 비밀리에 무언가를 녹음하지 않도록 신뢰해야 합니다.
[정확한 지리적 위치](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) 또는 [클립보드 내용](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard\_API)에 액세스하기 위해 명시적으로 권한을 부여할 필요가 없습니다. **확장 프로그램은 단순히 매니페스트의** [**permissions 항목**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **에 `geolocation` 또는 `clipboard`를 추가하면 됩니다.** 이러한 액세스 권한은 확장 프로그램이 설치될 때 암시적으로 부여됩니다. 따라서 이러한 권한을 가진 악의적이거나 침해당한 확장 프로그램은 사용자가 알아차리지 못하고 이동 프로필을 생성하거나 복사된 비밀번호를 모니터링할 수 있습니다.
[**history API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history)에 액세스하기 위해 [**permissions 항목**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions)에 **`history`** 키워드를 추가하면 사용자의 전체 탐색 기록을 기다리지 않고 한꺼번에 검색할 수 있습니다.
**`bookmarks`** **권한**은 비슷한 남용 가능성을 가지고 있으며, 이를 통해 [**bookmarks API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks)를 통해 모든 책갈피를 읽을 수 있습니다.
### 저장소 권한
확장 프로그램 저장소는 일반적으로 [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)와 매우 유사한 키-값 컬렉션입니다. 따라서 여기에는 민감한 정보를 저장해서는 안 됩니다.
그러나 광고 회사도 이 저장소를 남용할 수 있습니다.
### 추가 권한
[**여기에서 크로미움 브라우저 확장 프로그램이 요청할 수 있는 권한의 완전한 목록을 찾을 수 있습니다**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) 및 [**여기에서 파이어폭스 확장 프로그램을 위한 완전한 목록을 찾을 수 있습니다**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
## 예방
Google의 개발자 정책은 확장 프로그램이 기능에 필요한 것보다 더 많은 권한을 요청하는 것을 명시적으로 금지하여 과도한 권한 요청을 완화합니다. 브라우저 확장 프로그램이 이 경계를 넘어선 사례는 브라우저 자체와 함께 배포된 경우였습니다.
브라우저는 확장 프로그램 권한 남용을 더 억제할 수 있습니다. 예를 들어, 화면 녹화에 사용되는 Chrome의 [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) 및 [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) API는 남용을 최소화하기 위해 설계되었습니다. tabCapture API는 확장 프로그램 아이콘을 클릭하는 등 직접 사용자 상호작용을 통해서만 활성화될 수 있으며, desktopCapture는 창이 녹화되기 위해 사용자 확인을 요구하여 은밀한 녹화 활동을 방지합니다.
그러나 보안 조치를 강화하면 확장 프로그램의 유연성과 사용자 친화성이 감소할 수 있습니다. [activeTab 권한](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)
제로부터 영웅이 될 때까지 AWS 해킹 배우기htARTE (HackTricks AWS Red Team Expert)!
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.