BrowExt - uprawnienia i host_permissions

Reading time: 8 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

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 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 oraz pełną listę dla rozszerzeń Firefox tutaj.

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, webRequest i 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": [
"<all_urls>"
]

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 funkcjonalności. Umożliwiają one rozszerzeniu wywoływanie 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 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() lub 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: 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() jest nieco mniej takie. Może być używane do tworzenia nowej karty, zasadniczo tak samo jak 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.

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, 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 lub zawartości twojego schowka, udzielenie pozwolenia jest całkowicie niepotrzebne. Rozszerzenie po prostu dodaje geolocation lub clipboard do wpisu uprawnień 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ń manifestu rozszerzenia przyznaje dostęp do API historii. 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.

Uprawnienie do przechowywania

Przechowywanie rozszerzenia to jedynie kolekcja klucz-wartość, bardzo podobna do 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 oraz pełną listę dla rozszerzeń Firefox tutaj.

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 i 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 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

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks