# BrowExt - uprawnienia i host_permissions
{{#include ../../banners/hacktricks-training.md}}
## Podstawowe informacje
### **`permissions`**
Uprawnienia są definiowane w pliku **`manifest.json`** rozszerzenia za pomocą właściwości **`permissions`** i pozwalają na dostęp do prawie wszystkiego, do czego może uzyskać dostęp przeglądarka (ciasteczka lub fizyczne przechowywanie):
Poprzedni manifest deklaruje, że rozszerzenie wymaga uprawnienia `storage`. Oznacza to, że może używać [API storage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) do trwałego przechowywania swoich danych. W przeciwieństwie do ciasteczek lub API `localStorage`, które dają użytkownikom pewien poziom kontroli, **przechowywanie w rozszerzeniu można zazwyczaj wyczyścić tylko przez odinstalowanie rozszerzenia**.
Rozszerzenie poprosi o uprawnienia wskazane w jego pliku **`manifest.json`** i po zainstalowaniu rozszerzenia możesz **zawsze sprawdzić jego uprawnienia w swojej przeglądarce**, jak pokazano na tym obrazie:
Możesz znaleźć [**pełną listę uprawnień, o które może prosić rozszerzenie przeglądarki Chromium tutaj**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) oraz [**pełną listę dla rozszerzeń Firefox tutaj**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.**
### `host_permissions`
Opcjonalne, ale potężne ustawienie **`host_permissions`** wskazuje, z którymi hostami rozszerzenie będzie mogło wchodzić w interakcje za pomocą API, takich jak [`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) i [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs).
Następujące `host_permissions` zasadniczo pozwalają na dostęp do każdej strony internetowej:
```json
"host_permissions": [
"*://*/*"
]
// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]
// Or:
"host_permissions": [
""
]
```
Te hosty, do których rozszerzenie przeglądarki ma swobodny dostęp. Dzieje się tak, ponieważ gdy rozszerzenie przeglądarki wywołuje **`fetch("https://gmail.com/")`**, nie jest ograniczone przez CORS.
## Nadużywanie `permissions` i `host_permissions`
### Karty
Ponadto **`host_permissions`** odblokowują również „zaawansowane” [**API kart**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **funkcjonalności.** Umożliwiają one rozszerzeniu wywoływanie [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) i nie tylko uzyskiwanie **listy kart przeglądarki użytkownika**, ale także dowiadywanie się, która **strona internetowa (czyli adres i tytuł) jest załadowana**.
> [!CAUTION]
> Nie tylko to, ale również nasłuchiwacze, takie jak [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **stają się znacznie bardziej użyteczne.** Będą powiadamiane za każdym razem, gdy nowa strona ładowana jest do karty.
### Uruchamianie skryptów treści
Skrypty treści nie muszą być koniecznie zapisane statycznie w manifeście rozszerzenia. Przy wystarczających **`host_permissions`**, **rozszerzenia mogą również ładować je dynamicznie, wywołując** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **lub** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript).
Oba API pozwalają na wykonywanie nie tylko plików zawartych w rozszerzeniach jako skryptów treści, ale także **dowolnego kodu**. Pierwsze pozwala na przekazywanie kodu JavaScript jako ciągu, podczas gdy drugie oczekuje funkcji JavaScript, która jest mniej podatna na luki w zabezpieczeniach związane z wstrzykiwaniem. Mimo to, oba API mogą wyrządzić poważne szkody, jeśli są niewłaściwie używane.
> [!CAUTION]
> Oprócz powyższych możliwości, skrypty treści mogą na przykład **przechwytywać dane uwierzytelniające**, gdy są one wprowadzane na stronach internetowych. Innym klasycznym sposobem ich nadużycia jest **wstrzykiwanie reklam** na każdej stronie internetowej. Możliwe jest również dodawanie **wiadomości oszukańczych**, aby nadużyć wiarygodności stron informacyjnych. Wreszcie, mogą **manipulować stronami bankowymi**, aby przekierowywać przelewy pieniężne.
### Uprawnienia domyślne
Niektóre uprawnienia rozszerzenia **nie muszą być jawnie deklarowane**. Przykładem jest [API kart](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): jego podstawowa funkcjonalność jest dostępna bez jakichkolwiek uprawnień. Każde rozszerzenie może być powiadamiane, gdy otwierasz i zamykasz karty, po prostu nie będzie wiedziało, z jaką stroną internetową te karty są związane.
Brzmi zbyt nieszkodliwie? [API tabs.create()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) jest nieco mniej takie. Może być używane do **tworzenia nowej karty**, zasadniczo tak samo jak [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open), które może być wywoływane przez każdą stronę internetową. Jednak podczas gdy `window.open()` podlega **blokadzie wyskakujących okienek, `tabs.create()` nie podlega**.
> [!CAUTION]
> Rozszerzenie może tworzyć dowolną liczbę kart, kiedy tylko chce.
Jeśli przejrzysz możliwe parametry `tabs.create()`, zauważysz również, że jego możliwości wykraczają daleko poza to, co `window.open()` ma prawo kontrolować. I podczas gdy Firefox nie pozwala na użycie URI `data:` z tym API, Chrome nie ma takiej ochrony. **Użycie takich URI na najwyższym poziomie zostało** [**zakazane z powodu nadużyć związanych z phishingiem**](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) jest bardzo podobne do `tabs.create()`, ale **modyfikuje istniejącą kartę**. Tak więc złośliwe rozszerzenie może na przykład dowolnie załadować stronę reklamową do jednej z twoich kart i może również aktywować odpowiadającą jej kartę.
### Kamera internetowa, geolokalizacja i inne
Prawdopodobnie wiesz, że strony internetowe mogą żądać specjalnych uprawnień, np. w celu uzyskania dostępu do twojej kamery internetowej (narzędzia do wideokonferencji) lub lokalizacji geograficznej (mapy). To funkcje z dużym potencjałem nadużyć, więc użytkownicy muszą za każdym razem potwierdzać, że nadal chcą tego.
> [!CAUTION]
> Nie tak w przypadku rozszerzeń przeglądarki. **Jeśli rozszerzenie przeglądarki** [**chce uzyskać dostęp do twojej kamery internetowej lub mikrofonu**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, musi tylko raz poprosić o pozwolenie**
Zazwyczaj rozszerzenie robi to natychmiast po zainstalowaniu. Gdy to zapytanie zostanie zaakceptowane, **dostęp do kamery internetowej jest możliwy w dowolnym momencie**, nawet jeśli użytkownik w tym momencie nie wchodzi w interakcję z rozszerzeniem. Tak, użytkownik zaakceptuje to zapytanie tylko wtedy, gdy rozszerzenie naprawdę potrzebuje dostępu do kamery internetowej. Ale po tym muszą zaufać rozszerzeniu, że nie nagra nic w tajemnicy.
Dzięki dostępowi do [twojej dokładnej lokalizacji geograficznej](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) lub [zawartości twojego schowka](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), udzielenie pozwolenia jest całkowicie niepotrzebne. **Rozszerzenie po prostu dodaje `geolocation` lub `clipboard` do** [**wpisu uprawnień**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **swojego manifestu**. Te uprawnienia dostępu są następnie przyznawane domyślnie, gdy rozszerzenie jest instalowane. Tak więc złośliwe lub skompromitowane rozszerzenie z tymi uprawnieniami może stworzyć twój profil ruchu lub monitorować twój schowek w poszukiwaniu skopiowanych haseł, nie zauważając niczego.
Dodanie słowa kluczowego **`history`** do [wpisu uprawnień](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) manifestu rozszerzenia przyznaje **dostęp do** [**API historii**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Umożliwia to pobranie całej historii przeglądania użytkownika za jednym razem, bez czekania, aż użytkownik ponownie odwiedzi te strony internetowe.
Uprawnienie **`bookmarks`** ma podobny potencjał nadużyć, pozwala na **odczytanie wszystkich zakładek za pomocą** [**API zakładek**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
### Uprawnienie do przechowywania
Przechowywanie rozszerzenia to jedynie kolekcja klucz-wartość, bardzo podobna do [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage), której mogłaby używać każda strona internetowa. Dlatego nie powinno się tutaj przechowywać żadnych wrażliwych informacji.
Jednak firmy reklamowe mogą również nadużywać tego przechowywania.
### Więcej uprawnień
Możesz znaleźć [**pełną listę uprawnień, które może żądać rozszerzenie przeglądarki Chromium tutaj**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) oraz [**pełną listę dla rozszerzeń Firefox tutaj**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api_permissions)**.**
## Zapobieganie
Polityka dewelopera Google wyraźnie zabrania rozszerzeniom żądania większych uprawnień niż to konieczne do ich funkcjonalności, skutecznie łagodząc nadmierne żądania uprawnień. Przykładem, w którym rozszerzenie przeglądarki przekroczyło tę granicę, było jego dystrybuowanie z samą przeglądarką, a nie przez sklep z dodatkami.
Przeglądarki mogłyby dodatkowo ograniczyć nadużycia uprawnień rozszerzeń. Na przykład, API [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) i [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) Chrome, używane do nagrywania ekranu, są zaprojektowane w celu minimalizacji nadużyć. API tabCapture może być aktywowane tylko poprzez bezpośrednią interakcję użytkownika, taką jak kliknięcie na ikonę rozszerzenia, podczas gdy desktopCapture wymaga potwierdzenia użytkownika, aby okno mogło być nagrywane, zapobiegając potajemnym nagraniom.
Jednak zaostrzenie środków bezpieczeństwa często prowadzi do zmniejszenia elastyczności i przyjazności dla użytkownika rozszerzeń. Uprawnienie [activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) ilustruje ten kompromis. Zostało wprowadzone, aby wyeliminować potrzebę, aby rozszerzenia żądały uprawnień hosta w całym internecie, pozwalając rozszerzeniom na dostęp tylko do bieżącej karty po wyraźnej aktywacji przez użytkownika. Ten model jest skuteczny dla rozszerzeń wymagających działań inicjowanych przez użytkownika, ale nie sprawdza się w przypadku tych, które wymagają automatycznych lub prewencyjnych działań, co kompromituje wygodę i natychmiastową reakcję.
## **Referencje**
- [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}}