hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md

14 KiB

BrowExt - uprawnienia i host_permissions

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

permissions

Uprawnienia są określane w pliku manifest.json rozszerzenia za pomocą właściwości permissions i pozwalają na dostęp do praktycznie wszystkiego, do czego może uzyskać dostęp przeglądarka (Ciasteczka lub Pamięć fizyczną):

Poprzedni manifest deklaruje, że rozszerzenie wymaga uprawnienia storage. Oznacza to, że może korzystać z API pamięci, aby przechowywać swoje dane trwale. W przeciwieństwie do ciasteczek lub API localStorage, które dają użytkownikom pewien poziom kontroli, pamięć rozszerzenia zazwyczaj można wyczyścić tylko poprzez odinstalowanie rozszerzenia.

Rozszerzenie będzie prosić o uprawnienia wskazane w swoim pliku manifest.json i Po zainstalowaniu rozszerzenia, zawsze możesz sprawdzić jego uprawnienia w przeglądarce, jak pokazano na tym obrazie:

Możesz znaleźć pełną listę uprawnień, które rozszerzenie przeglądarki Chromium może zażądać 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 współdziałać za pomocą interfejsów takich jak cookies, webRequest i tabs.

Następujące host_permissions zasadniczo pozwalają na każdą stronę internetową:

"host_permissions": [
"*://*/*"
]

// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]

// Or:
"host_permissions": [
"<all_urls>"
]

To są hosty, do których rozszerzenie przeglądarki może uzyskać 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. Pozwalają one rozszerzeniu wywołać tabs.query() i nie tylko otrzymać z powrotem listę kart przeglądarki użytkownika, ale także dowiedzieć się, która strona internetowa (oznaczająca adres i tytuł) jest załadowana.

{% hint style="danger" %} Nie tylko to, słuchacze takie jak tabs.onUpdated stają się również znacznie bardziej użyteczne. Zostaną powiadomieni za każdym razem, gdy nowa strona zostanie załadowana do karty. {% endhint %}

Uruchamianie skryptów zawartości

Skrypty zawartości nie muszą być pisane statycznie w manifeście rozszerzenia. Dzięki wystarczającym host_permissions, rozszerzenia mogą również ładować je dynamicznie, wywołując tabs.executeScript() lub scripting.executeScript().

Oba interfejsy API pozwalają na wykonanie nie tylko plików zawartych w rozszerzeniach jako skrypty zawartości, ale także dowolnego kodu. Pierwszy pozwala na przekazywanie kodu JavaScript jako ciągu znaków, podczas gdy drugi oczekuje funkcji JavaScript, która jest mniej podatna na podatności związane z wstrzykiwaniem. Niemniej jednak, oba interfejsy API spowodują spustoszenie w przypadku niewłaściwego użycia.

{% hint style="danger" %} Oprócz powyższych możliwości, skrypty zawartości mogą na przykład przechwytywać dane uwierzytelniające, gdy są wprowadzane na strony internetowe. Inny klasyczny sposób nadużycia polega na wstrzykiwaniu reklam na każdej stronie internetowej. Dodawanie oszukańczych wiadomości w celu nadużycia wiarygodności stron informacyjnych jest również możliwe. Wreszcie, mogą manipulować stronami bankowymi, aby przekierować transfery pieniężne. {% endhint %}

Impliityczne uprawnienia

Niektóre uprawnienia rozszerzenia nie muszą być wyraźnie deklarowane. Przykładem jest API kart: jego podstawowa funkcjonalność jest dostępna bez żadnych uprawnień. Każde rozszerzenie może być powiadamiane, gdy otwierasz i zamykasz karty, po prostu nie będzie wiedzieć, z jaką stroną internetową te karty się wiążą.

Brzmi zbyt niewinnie? API tabs.create() jest nieco mniej niewinne. Może być używane do utworzenia nowej karty, zasadniczo to samo co window.open(), które może być wywoływane przez dowolną stronę internetową. Jednak podczas gdy window.open() podlega blokerowi wyskakujących okien, tabs.create() nie.

{% hint style="danger" %} Rozszerzenie może tworzyć dowolną liczbę kart w dowolnym momencie. {% endhint %}

Jeśli przejrzysz możliwe parametry tabs.create(), zauważysz również, że jego możliwości wykraczają daleko poza to, co może kontrolować window.open(). I podczas gdy Firefox nie zezwala na użycie adresów data: URI z tym interfejsem API, Chrome nie ma takiej ochrony. Użycie takich URI na najwyższym poziomie zostało zakazane ze względu na nadużycia w celu phishingu.

tabs.update() jest bardzo podobne do tabs.create(), ale zmodyfikuje istniejącą kartę. Złośliwe rozszerzenie może na przykład dowolnie załadować stronę z reklamami do jednej z twoich kart i aktywować odpowiednią kartę.

Kamera internetowa, geolokalizacja i przyjaciele

Prawdopodobnie wiesz, że strony internetowe mogą prosić o specjalne uprawnienia, np. w celu uzyskania dostępu do kamery internetowej (narzędzia do wideokonferencji) lub lokalizacji geograficznej (mapy). Są to funkcje z dużym potencjałem nadużyć, dlatego użytkownicy muszą za każdym razem potwierdzać, czy nadal chcą to zrobić.

{% hint style="danger" %} Nie w przypadku rozszerzeń przeglądarki. Jeśli rozszerzenie przeglądarki chce uzyskać dostęp do twojej kamery internetowej lub mikrofonu, musi poprosić o zgodę tylko raz {% endhint %}

Zazwyczaj rozszerzenie zrobi to natychmiast po zainstalowaniu. Po zaakceptowaniu tego monitu, dostęp do kamery internetowej jest możliwy w dowolnym momencie, nawet jeśli użytkownik nie korzysta w tym momencie z rozszerzenia. Tak, użytkownik zaakceptuje ten monit tylko wtedy, gdy rozszerzenie naprawdę potrzebuje dostępu do kamery internetowej. Ale potem muszą zaufać rozszerzeniu, że nie będzie nagrywać niczego w tajemnicy.

Dzięki dostępowi do twojej dokładnej lokalizacji geograficznej lub zawartości schowka, udzielenie zgody jest całkowicie zbędne. Rozszerzenie po prostu dodaje geolocation lub clipboard do wpisu uprawnień w swoim manifeście. Te uprawnienia dostępu są udzielane w sposób domyślny podczas instalacji rozszerzenia. Dlatego złośliwe lub skompromitowane rozszerzenie z tymi uprawnieniami może tworzyć twój profil ruchu lub monitorować schowek w poszukiwaniu skopiowanych haseł bez twojej wiedzy.

Dodanie słowa kluczowego history do wpisu uprawnień w manifeście rozszerzenia udziela dostępu do API historii. Pozwala to na pobranie całej historii przeglądania użytkownika od razu, bez konieczności oczekiwania, aż użytkownik odwiedzi te strony internetowe ponownie.

Uprawnienie bookmarks ma podobny potencjał nadużycia, umożliwia ono odczytywanie wszystkich zakładek za pomocą API zakładek.

Uprawnienie do przechowywania

Przechowywanie rozszerzenia to zbiór kluczy i wartości, bardzo podobny do localStorage, którego mogłaby użyć dowolna strona internetowa. Dlatego tutaj nie powinny być przechowywane żadne poufne informacje.

Jednak firmy reklamowe mogą również nadużywać tego przechowywania.

Więcej uprawnień

Możesz znaleźć pełną listę uprawnień, które rozszerzenie przeglądarki Chromium może żądać tutaj oraz pełną listę dla rozszerzeń Firefox tutaj.

Zapobieganie

Polityka dewelopera Google wyraźnie zabrania rozszerzeniom żądania większej liczby uprawnień niż jest to konieczne dla ich funkcjonalności, skutecznie ograniczając nadmierne żądania uprawnień. Przykładem, gdzie rozszerzenie przeglądarki przekroczyło tę granicę, było jego dystrybuowanie razem z przeglądarką, a nie poprzez sklep z dodatkami.

Przeglądarki mogłyby dalej ograniczyć nadużycia uprawnień rozszerzeń. Na przykład API tabCapture i desktopCapture w Chrome, używane do nagrywania ekranu, zostały zaprojektowane w taki sposób, aby minimalizować nadużycia. API tabCapture może być aktywowane tylko poprzez bezpośrednią interakcję użytkownika, taką jak kliknięcie w ikonę rozszerzenia, podczas gdy desktopCapture wymaga potwierdzenia użytkownika, aby okno zostało nagrane, zapobiegając tajnemu nagrywaniu działań.

Jednakże, 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ć konieczność żądania uprawnień hosta w całym internecie przez rozszerzenia, pozwalając rozszerzeniom uzyskać dostęp tylko do bieżącej karty po wyraźnym aktywowaniu przez użytkownika. Ten model jest skuteczny dla rozszerzeń wymagających działań inicjowanych przez użytkownika, ale nie wystarcza dla tych wymagających działań automatycznych lub prewencyjnych, co kompromituje wygodę i natychmiastową reakcję.

Referencje

Zacznij od zera i zostań mistrzem hakowania AWS dzięki htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: