mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-21 08:28:27 +00:00
Translated ['pentesting-web/browser-extension-pentesting-methodology/REA
This commit is contained in:
parent
101c8cfd55
commit
330707dc13
1 changed files with 143 additions and 80 deletions
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Zacznij od zera i stań się ekspertem od hakowania AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -20,7 +20,7 @@ Rozszerzenia przeglądarki są napisane w JavaScript i są ładowane przez przeg
|
|||
|
||||
## Główne składniki
|
||||
|
||||
Układy rozszerzeń prezentują się najlepiej, gdy są wizualizowane i składają się z trzech składników. Przyjrzyjmy się każdemu składnikowi dokładniej.
|
||||
Układy rozszerzeń prezentują się najlepiej wizualizowane i składają się z trzech składników. Przyjrzyjmy się każdemu z nich dokładniej.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (16) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||
|
||||
|
@ -30,16 +30,16 @@ Każdy skrypt zawartości ma bezpośredni dostęp do DOM **jednej strony interne
|
|||
|
||||
### **Rdzeń rozszerzenia**
|
||||
|
||||
Rdzeń rozszerzenia zawiera większość uprawnień/dostępu do rozszerzenia, ale rdzeń rozszerzenia może współdziałać tylko z zawartością internetową za pomocą [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i skryptów zawartości. Ponadto rdzeń rozszerzenia nie ma bezpośredniego dostępu do maszyny docelowej.
|
||||
Rdzeń rozszerzenia zawiera większość uprawnień/dostępów rozszerzenia, ale rdzeń rozszerzenia może współdziałać z zawartością internetową tylko za pomocą [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i skryptów zawartości. Ponadto rdzeń rozszerzenia nie ma bezpośredniego dostępu do maszyny docelowej.
|
||||
|
||||
### **Binarny natywny**
|
||||
|
||||
Rozszerzenie pozwala na binarny plik natywny, który może **uzyskać dostęp do maszyny docelowej z pełnymi uprawnieniami użytkownika**. Plik natywny współdziała z rdzeniem rozszerzenia za pomocą standardowego interfejsu programowania aplikacji wtyczek Netscape ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) używanego przez Flash i inne wtyczki przeglądarkowe.
|
||||
Rozszerzenie pozwala na binarny natywny, który może **uzyskać dostęp do maszyny docelowej z pełnymi uprawnieniami użytkownika**. Binarny natywny współdziała z rdzeniem rozszerzenia za pomocą standardowego interfejsu programistycznego aplikacji wtyczki Netscape ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) używanego przez Flash i inne wtyczki przeglądarkowe.
|
||||
|
||||
### Granice
|
||||
|
||||
{% hint style="danger" %}
|
||||
Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu zawartości do rdzenia rozszerzenia oraz z rdzenia rozszerzenia do pliku binarnego natywnego.
|
||||
Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu zawartości do rdzenia rozszerzenia oraz z rdzenia rozszerzenia do binarnego natywnego.
|
||||
{% endhint %}
|
||||
|
||||
Każdy składnik rozszerzenia jest odseparowany od siebie przez **silne granice ochronne**. Każdy składnik działa w **oddzielnym procesie systemu operacyjnego**. Skrypty zawartości i rdzenie rozszerzeń działają w **procesach piaskownicy** niedostępnych dla większości usług systemu operacyjnego.
|
||||
|
@ -48,7 +48,7 @@ Co więcej, skrypty zawartości oddzielone są od powiązanych stron internetowy
|
|||
|
||||
## **`manifest.json`**
|
||||
|
||||
Rozszerzenie Chrome to po prostu folder ZIP z rozszerzeniem [.crx](https://www.lifewire.com/crx-file-2620391). Rdzeniem rozszerzenia jest plik **`manifest.json`** znajdujący się w głównym katalogu, który określa układ, uprawnienia i inne opcje konfiguracyjne.
|
||||
Rozszerzenie Chrome to po prostu folder ZIP z rozszerzeniem [.crx](https://www.lifewire.com/crx-file-2620391). Rdzeniem rozszerzenia jest plik **`manifest.json`** znajdujący się w głównym katalogu, który określa układ, uprawnienia i inne opcje konfiguracji.
|
||||
|
||||
Przykład:
|
||||
```json
|
||||
|
@ -83,7 +83,7 @@ Przykład:
|
|||
```
|
||||
### `content_scripts`
|
||||
|
||||
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **przechodzi do pasującej strony**, w naszym przypadku do dowolnej strony pasującej do wyrażenia **`https://example.com/*`** i nie pasującej do wyrażenia **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają arbitralny dostęp do [Modelu Obiektowego Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) strony.
|
||||
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **przechodzi do pasującej strony**, w naszym przypadku do dowolnej strony pasującej do wyrażenia **`https://example.com/*`** i nie pasującej do regexu **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają arbitralny dostęp do [Modelu Obiektowego Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) strony.
|
||||
```json
|
||||
"content_scripts": [
|
||||
{
|
||||
|
@ -115,24 +115,24 @@ document.body.appendChild(div);
|
|||
```
|
||||
<figure><img src="../../.gitbook/assets/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Wiadomość jest wysyłana do stron rozszerzenia przez skrypt treści po kliknięciu tego przycisku, poprzez wykorzystanie [**API runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu treści w bezpośrednim dostępie do interfejsów API, przy czym `storage` należy do nielicznych wyjątków. Dla funkcji poza tymi wyjątkami, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty treści mogą się komunikować.
|
||||
Wiadomość jest wysyłana do stron rozszerzenia przez skrypt treści po kliknięciu tego przycisku, poprzez wykorzystanie [**API runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu treści w bezpośrednim dostępie do interfejsów API, przy czym `storage` należy do nielicznych wyjątków. Dla funkcji poza tymi wyjątkami, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty treści mogą komunikować się.
|
||||
|
||||
{% hint style="warning" %}
|
||||
W zależności od przeglądarki, możliwości skryptu treści mogą nieznacznie się różnić. Dla przeglądarek opartych na Chromium, lista możliwości jest dostępna w [dokumentacji deweloperów Chrome'a](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a dla Firefoksa, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) służy jako główne źródło informacji.\
|
||||
Warto również zauważyć, że skrypty treści mają zdolność komunikowania się z skryptami tła, umożliwiając im wykonywanie działań i przekazywanie odpowiedzi.
|
||||
{% endhint %}
|
||||
|
||||
Aby wyświetlić i debugować skrypty treści w Chrome, menu narzędzi deweloperskich Chrome'a można otworzyć z pozycji Opcje > Więcej narzędzi > Narzędzia deweloperskie LUB poprzez naciśnięcie Ctrl + Shift + I.
|
||||
Aby wyświetlić i debugować skrypty treści w Chrome, menu narzędzi deweloperskich Chrome'a można uzyskać z pozycji Opcje > Więcej narzędzi > Narzędzia deweloperskie LUB poprzez naciśnięcie Ctrl + Shift + I.
|
||||
|
||||
Po wyświetleniu narzędzi deweloperskich, należy kliknąć zakładkę **Źródło**, a następnie zakładkę **Skrypty treści**. Pozwala to na obserwację działających skryptów treści z różnych rozszerzeń oraz ustawianie punktów przerwania w celu śledzenia przepływu wykonania.
|
||||
|
||||
### Wstrzyknięte skrypty treści
|
||||
|
||||
{% hint style="success" %}
|
||||
Zauważ, że **Skrypty treści nie są obowiązkowe**, ponieważ istnieje również możliwość **dynamicznego** **wstrzykiwania** skryptów i **programowego wstrzykiwania** ich na strony internetowe za pomocą **`tabs.executeScript`**. Zapewnia to faktycznie większą **kontrolę granularną**.
|
||||
Zauważ, że **Skrypty treści nie są obowiązkowe**, ponieważ istnieje również możliwość **dynamicznego** **wstrzykiwania** skryptów i **programowego wstrzykiwania ich** na strony internetowe za pomocą **`tabs.executeScript`**. Zapewnia to faktycznie większą **kontrolę granularną**.
|
||||
{% endhint %}
|
||||
|
||||
Dla programowego wstrzykiwania skryptu treści, rozszerzenie musi mieć [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, do której mają być wstrzykiwane skrypty. Uprawnienia te można zabezpieczyć poprzez **żądanie ich** w manifeście rozszerzenia lub tymczasowo poprzez [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
Dla programowego wstrzykiwania skryptu treści, rozszerzenie musi mieć [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, na którą mają być wstrzykiwane skrypty. Uprawnienia te można zabezpieczyć poprzez **żądanie ich** w manifeście rozszerzenia lub tymczasowo poprzez [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
|
||||
#### Przykładowe rozszerzenie oparte na activeTab
|
||||
|
||||
|
@ -234,13 +234,13 @@ js : [ "contentScript.js" ],
|
|||
```
|
||||
### `tło`
|
||||
|
||||
Wiadomości wysyłane przez skrypty zawartości są odbierane przez **stronę tła**, która pełni centralną rolę w koordynowaniu komponentów rozszerzenia. Warto zauważyć, że strona tła pozostaje aktywna przez cały czas trwania rozszerzenia, działając dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektowy Dokumentu (DOM), umożliwiający złożone interakcje i zarządzanie stanem.
|
||||
Wiadomości wysłane przez skrypty zawartości są odbierane przez **stronę tła**, która pełni centralną rolę w koordynowaniu komponentów rozszerzenia. Warto zauważyć, że strona tła pozostaje aktywna przez cały czas trwania rozszerzenia, działając dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektowy Dokumentu (DOM), umożliwiający kompleksowe interakcje i zarządzanie stanem.
|
||||
|
||||
**Kluczowe punkty**:
|
||||
|
||||
* **Rola Strony Tła:** Pełni rolę centrum nerwowego rozszerzenia, zapewniając komunikację i koordynację między różnymi częściami rozszerzenia.
|
||||
* **Trwałość:** Jest nieustannie obecna, niewidoczna dla użytkownika, ale integralna dla funkcjonalności rozszerzenia.
|
||||
* **Automatyczne Generowanie:** Jeśli nie jest jawnie zdefiniowana, przeglądarka automatycznie utworzy stronę tła. Ta automatycznie generowana strona będzie zawierać wszystkie skrypty tła określone w manifeście rozszerzenia, zapewniając bezproblemowe działanie zadań tła rozszerzenia.
|
||||
* **Rola Strony Tła:** Działa jako centrum nerwowe rozszerzenia, zapewniając komunikację i koordynację między różnymi częściami rozszerzenia.
|
||||
* **Trwałość:** Jest to obecna zawsze jednostka, niewidoczna dla użytkownika, ale integralna dla funkcjonalności rozszerzenia.
|
||||
* **Automatyczne Generowanie:** Jeśli nie jest jawnie zdefiniowana, przeglądarka automatycznie utworzy stronę tła. Ta automatycznie wygenerowana strona będzie zawierać wszystkie skrypty tła określone w manifeście rozszerzenia, zapewniając bezproblemową operację zadań tła rozszerzenia.
|
||||
|
||||
{% hint style="success" %}
|
||||
Wygodę zapewnianą przez przeglądarkę poprzez automatyczne generowanie strony tła (gdy nie jest jawnie zadeklarowana) zapewnia, że wszystkie niezbędne skrypty tła są zintegrowane i działające, usprawniając proces konfiguracji rozszerzenia.
|
||||
|
@ -256,7 +256,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" });
|
|||
}
|
||||
})
|
||||
```
|
||||
Wykorzystuje [API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage), aby nasłuchiwać wiadomości. Gdy otrzyma wiadomość `"explain"`, używa [API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs), aby otworzyć stronę w nowej karcie.
|
||||
Wykorzystuje [API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) do nasłuchiwania wiadomości. Gdy otrzyma wiadomość `"explain"`, używa [API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) do otwarcia strony w nowej karcie.
|
||||
|
||||
Aby debugować skrypt tła, możesz przejść do **szczegółów rozszerzenia i sprawdzić serwis workera**, co otworzy narzędzia deweloperskie z skryptem tła:
|
||||
|
||||
|
@ -283,7 +283,7 @@ Zauważ, że te strony nie są trwałe jak strony tła, ponieważ dynamicznie ł
|
|||
|
||||
Ponieważ rozszerzenia przeglądarki mogą być tak **uprzywilejowane**, złośliwe lub skompromitowane mogą umożliwić atakującemu **różne sposoby kradzieży wrażliwych informacji i szpiegowania użytkownika**.
|
||||
|
||||
Sprawdź, jak działają te ustawienia i jak mogą być nadużywane w:
|
||||
Sprawdź, jak działają te ustawienia i jak mogą być wykorzystane w:
|
||||
|
||||
{% content-ref url="browext-permissions-and-host_permissions.md" %}
|
||||
[browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md)
|
||||
|
@ -305,7 +305,7 @@ Aby uzyskać więcej informacji na temat CSP i potencjalnych obejść, sprawdź:
|
|||
|
||||
### `web_accessible_resources`
|
||||
|
||||
aby strona internetowa mogła uzyskać dostęp do strony Rozszerzenia Przeglądarki, na przykład pliku `.html`, ta strona musi być wymieniona w polu **`web_accessible_resources`** pliku `manifest.json`.\
|
||||
Aby strona internetowa mogła uzyskać dostęp do strony Rozszerzenia Przeglądarki, na przykład pliku `.html`, ta strona musi być wymieniona w polu **`web_accessible_resources`** pliku `manifest.json`.\
|
||||
Na przykład:
|
||||
```javascript
|
||||
{
|
||||
|
@ -323,7 +323,7 @@ Na przykład:
|
|||
...
|
||||
}
|
||||
```
|
||||
Te strony są dostępne pod adresem URL:
|
||||
Te strony są dostępne pod adresem URL takim jak:
|
||||
```
|
||||
chrome-extension://<extension-id>/message.html
|
||||
```
|
||||
|
@ -333,21 +333,31 @@ W publicznych rozszerzeniach **identyfikator rozszerzenia jest dostępny**:
|
|||
|
||||
Jednakże, jeśli parametr `manifest.json` **`use_dynamic_url`** jest używany, to **ten identyfikator może być dynamiczny**.
|
||||
|
||||
Zezwolenie na dostęp do tych stron sprawia, że strony te są **potencjalnie podatne na ataki ClickJacking**:
|
||||
{% hint style="success" %}
|
||||
Zauważ, że nawet jeśli strona jest tutaj wymieniona, może być **chroniona przed ClickJacking** dzięki **Polityce Bezpieczeństwa Zawartości**. Dlatego też należy to sprawdzić (sekcja frame-ancestors) zanim potwierdzisz, że atak ClickJacking jest możliwy.
|
||||
{% endhint %}
|
||||
|
||||
Zezwolenie na dostęp do tych stron sprawia, że te strony są **potencjalnie podatne na ClickJacking**:
|
||||
|
||||
{% content-ref url="browext-clickjacking.md" %}
|
||||
[browext-clickjacking.md](browext-clickjacking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Zezwolenie na ładowanie tych stron tylko przez rozszerzenie, a nie przez losowe adresy URL, może zapobiec atakom CLickJacking.
|
||||
Zezwolenie na ładowanie tych stron tylko przez rozszerzenie, a nie przez losowe adresy URL, może zapobiec atakom ClickJacking.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że strony z **`web_accessible_resources`** oraz inne strony rozszerzenia są również zdolne do **kontaktu z skryptami w tle**. Dlatego jeśli jedna z tych stron jest podatna na **XSS**, może to otworzyć większą lukę w zabezpieczeniach.
|
||||
|
||||
Ponadto, zauważ, że można otworzyć tylko strony wskazane w **`web_accessible_resources`** w ramkach, ale z nowej karty można uzyskać dostęp do dowolnej strony w rozszerzeniu, znając identyfikator rozszerzenia. Dlatego jeśli zostanie znalezione XSS nadużywające tych samych parametrów, może to być wykorzystane nawet jeśli strona nie jest skonfigurowana w **`web_accessible_resources`**.
|
||||
{% endhint %}
|
||||
|
||||
### `externally_connectable`
|
||||
|
||||
Zgodnie z [**dokumentacją**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), Właściwość manifestu `"externally_connectable"` deklaruje, **które rozszerzenia i strony internetowe mogą się połączyć** z Twoim rozszerzeniem za pomocą [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) i [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
Zgodnie z [**dokumentacją**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), Właściwość manifestu `"externally_connectable"` deklaruje, **które rozszerzenia i strony internetowe mogą się połączyć** z twoim rozszerzeniem za pomocą [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) i [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
|
||||
* Jeśli klucz **`externally_connectable`** nie jest zadeklarowany w manifeście Twojego rozszerzenia lub jest zadeklarowany jako **`"ids": ["*"]`**, **wszystkie rozszerzenia mogą się połączyć, ale żadne strony internetowe nie mogą**.
|
||||
* Jeśli klucz **`externally_connectable`** nie jest zadeklarowany w manifeście twojego rozszerzenia lub jest zadeklarowany jako **`"ids": ["*"]`**, **wszystkie rozszerzenia mogą się połączyć, ale żadna strona internetowa nie może**.
|
||||
* Jeśli są **określone konkretne identyfikatory**, jak w `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **tylko te aplikacje** mogą się połączyć.
|
||||
* Jeśli są **określone dopasowania**, te aplikacje internetowe będą mogły się połączyć:
|
||||
```json
|
||||
|
@ -357,28 +367,78 @@ Zgodnie z [**dokumentacją**](https://developer.chrome.com/docs/extensions/refer
|
|||
```
|
||||
* Jeśli jest określone jako puste: **`"externally_connectable": {}`**, żadna aplikacja ani strona internetowa nie będzie mogła się połączyć.
|
||||
|
||||
Im mniej rozszerzeń i adresów URL wskazanych tutaj, tym mniejsza będzie powierzchnia ataku.
|
||||
Im **mniej rozszerzeń i adresów URL** tutaj wskazanych, tym **mniejsza powierzchnia ataku**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jeśli strona internetowa podatna na XSS lub przejęcie jest wskazana w **`externally_connectable`**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptu tła**, całkowicie omijając Skrypt Zawartości i jego CSP.
|
||||
Jeśli strona internetowa **podatna na XSS lub przejęcie** jest wskazana w **`externally_connectable`**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptu tła**, całkowicie omijając Skrypt Zawartości i jego CSP.
|
||||
|
||||
Dlatego jest to **bardzo potężne obejście**.
|
||||
|
||||
Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie ma zezwolenia na komunikację z podatnym rozszerzeniem, może wstrzyknąć dane XSS na dozwolonej stronie internetowej lub nadużyć interfejsów **`WebRequest`** lub **`DeclarativeNetRequest`** do manipulowania żądaniami na docelowej domenie, zmieniając żądanie strony dla pliku **JavaScript**. (Należy zauważyć, że CSP na docelowej stronie może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie jest ono upoważnione do komunikacji z podatnym rozszerzeniem, może wstrzyknąć **dane XSS na dozwolonej stronie internetowej** lub nadużyć interfejsów API **`WebRequest`** lub **`DeclarativeNetRequest`** do manipulowania żądaniami na docelowej domenie zmieniając żądanie strony dla **pliku JavaScript**. (Należy zauważyć, że CSP na docelowej stronie może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
{% endhint %}
|
||||
|
||||
##
|
||||
## Podsumowanie komunikacji
|
||||
|
||||
## Komunikacja między Skryptem Zawartości a stroną internetową
|
||||
### Rozszerzenie <--> Aplikacja internetowa
|
||||
|
||||
Środowiska, w których działają **skrypty zawartości** i gdzie istnieją strony hosta, są od siebie **oddzielone**, zapewniając **izolację**. Pomimo tej izolacji, obie strony mają możliwość interakcji z **Model Obiektu Dokumentu (DOM)** strony, wspólnego zasobu. Aby strona hosta mogła komunikować się ze **skryptem zawartości**, lub pośrednio z rozszerzeniem poprzez skrypt zawartości, konieczne jest wykorzystanie **DOM**, który jest dostępny dla obu stron jako kanał komunikacji.
|
||||
Do komunikacji między skryptem zawartości a stroną internetową zazwyczaj używane są wiadomości post. Dlatego w aplikacji internetowej zazwyczaj znajdziesz wywołania funkcji **`window.postMessage`**, a w skrypcie zawartości słuchacze takie jak **`window.addEventListener`**. Należy jednak zauważyć, że rozszerzenie może również **komunikować się z aplikacją internetową wysyłając wiadomość post** (dlatego strona internetowa powinna się tego spodziewać) lub po prostu sprawić, aby strona internetowa załadowała nowy skrypt.
|
||||
|
||||
### Wiadomości Post
|
||||
### Wewnątrz rozszerzenia
|
||||
|
||||
{% code title="content-script.js" %}
|
||||
Zazwyczaj funkcja **`chrome.runtime.sendMessage`** jest używana do wysyłania wiadomości wewnątrz rozszerzenia (zazwyczaj obsługiwane przez skrypt `background`) i w celu odbioru i obsługi jest deklarowany słuchacz wywołujący **`chrome.runtime.onMessage.addListener`**.
|
||||
|
||||
Możliwe jest również użycie **`chrome.runtime.connect()`** do utrzymania trwałego połączenia zamiast wysyłania pojedynczych wiadomości, można go użyć do **wysyłania** i **odbierania** **wiadomości** jak w poniższym przykładzie:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Przykład <code>chrome.runtime.connect()</code></summary>
|
||||
```javascript
|
||||
var port = chrome.runtime.connect();
|
||||
|
||||
// Listen for messages from the web page
|
||||
window.addEventListener("message", (event) => {
|
||||
// Only accept messages from the same window
|
||||
if (event.source !== window) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the message type is "FROM_PAGE"
|
||||
if (event.data.type && (event.data.type === "FROM_PAGE")) {
|
||||
console.log("Content script received: " + event.data.text);
|
||||
// Forward the message to the background script
|
||||
port.postMessage({ type: 'FROM_PAGE', text: event.data.text });
|
||||
}
|
||||
}, false);
|
||||
|
||||
// Listen for messages from the background script
|
||||
port.onMessage.addListener(function(msg) {
|
||||
console.log("Content script received message from background script:", msg);
|
||||
// Handle the response message from the background script
|
||||
});
|
||||
```
|
||||
</details>
|
||||
|
||||
Jest również możliwe wysyłanie wiadomości z tła skryptu do skryptu zawartości znajdującego się w określonej karcie, wywołując **`chrome.tabs.sendMessage`**, gdzie będziesz musiał podać **ID karty**, do której ma zostać wysłana wiadomość.
|
||||
|
||||
### Z dozwolonych `externally_connectable` do rozszerzenia
|
||||
|
||||
**Aplikacje internetowe i zewnętrzne rozszerzenia przeglądarki dozwolone** w konfiguracji `externally_connectable` mogą wysyłać żądania za pomocą:
|
||||
```javascript
|
||||
chrome.runtime.sendMessage(extensionId, ...
|
||||
```
|
||||
Gdzie jest wymagane wspomnienie **ID rozszerzenia**.
|
||||
|
||||
## Komunikacja między skryptem zawartości a stroną internetową
|
||||
|
||||
Środowiska, w których działają **skrypty zawartości** i gdzie istnieją strony hosta, są od siebie **oddzielone**, zapewniając **izolację**. Pomimo tej izolacji obie strony mają możliwość interakcji z **Modelem Obiektowym Dokumentu (DOM)** strony, wspólnym zasobem. Aby strona hosta mogła komunikować się ze **skryptem zawartości**, lub pośrednio z rozszerzeniem poprzez skrypt zawartości, konieczne jest wykorzystanie **DOM**, do którego mają dostęp obie strony jako kanału komunikacji.
|
||||
|
||||
### Wiadomości post
|
||||
|
||||
{% code title="skrypt-zawartości.js" %}
|
||||
```javascript
|
||||
// This is like "chrome.runtime.sendMessage" but to maintain the connection
|
||||
var port = chrome.runtime.connect();
|
||||
|
||||
window.addEventListener("message", (event) => {
|
||||
// We only accept messages from ourselves
|
||||
if (event.source !== window) {
|
||||
|
@ -387,6 +447,7 @@ return;
|
|||
|
||||
if (event.data.type && (event.data.type === "FROM_PAGE")) {
|
||||
console.log("Content script received: " + event.data.text);
|
||||
// Forward the message to the background script
|
||||
port.postMessage(event.data.text);
|
||||
}
|
||||
}, false);
|
||||
|
@ -410,7 +471,7 @@ Bezpieczna komunikacja Post Message powinna sprawdzać autentyczność otrzymane
|
|||
* Jeśli używany jest regex, należy być bardzo ostrożnym.
|
||||
* **Źródło**: `received_message.source !== window` można użyć do sprawdzenia, czy wiadomość pochodzi **z tego samego okna**, w którym nasłuchuje Skrypt Zawartości.
|
||||
|
||||
Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne na ataki, dlatego sprawdź na następnej stronie **potencjalne sposoby bypassowania Post Message**:
|
||||
Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne, dlatego sprawdź na następnej stronie **potencjalne sposoby obchodzenia Post Message**:
|
||||
|
||||
{% content-ref url="../postmessage-vulnerabilities/" %}
|
||||
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
|
||||
|
@ -418,7 +479,7 @@ Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne na ataki, dlat
|
|||
|
||||
### Iframe
|
||||
|
||||
Inną możliwą drogą komunikacji może być poprzez **adresy URL ramek (Iframe URLs)**, przykład można znaleźć w:
|
||||
Inną możliwą metodą komunikacji może być poprzez **adresy URL Iframe**, przykład można znaleźć w:
|
||||
|
||||
{% content-ref url="browext-xss-example.md" %}
|
||||
[browext-xss-example.md](browext-xss-example.md)
|
||||
|
@ -428,29 +489,19 @@ Inną możliwą drogą komunikacji może być poprzez **adresy URL ramek (Iframe
|
|||
|
||||
To nie jest "dokładnie" sposób komunikacji, ale **strona internetowa i skrypt zawartości będą miały dostęp do DOM**. Dlatego jeśli **skrypt zawartości** odczytuje pewne informacje z niego, **ufając DOM-owi strony**, strona internetowa może **zmodyfikować te dane** (ponieważ strona internetowa nie powinna być ufała, lub ponieważ strona internetowa jest podatna na XSS) i **naruszyć Skrypt Zawartości**.
|
||||
|
||||
Możesz również znaleźć przykład **opartego na DOM XSS w celu naruszenia rozszerzenia przeglądarki** w:
|
||||
Można także znaleźć przykład **DOM based XSS do naruszenia rozszerzenia przeglądarki** w:
|
||||
|
||||
{% content-ref url="browext-xss-example.md" %}
|
||||
[browext-xss-example.md](browext-xss-example.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Wrażliwe Informacje w Pamięci/Kodzie
|
||||
|
||||
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, może to być **wydobyte** (szczególnie na maszynach z systemem Windows) i **przeszukane** w poszukiwaniu tych informacji.
|
||||
|
||||
Dlatego pamięć Rozszerzenia Przeglądarki **nie powinna być uważana za bezpieczną**, a **wrażliwe informacje** takie jak dane uwierzytelniające czy frazy mnemoniczne **nie powinny być przechowywane**.
|
||||
|
||||
Oczywiście, **nie umieszczaj wrażliwych informacji w kodzie**, ponieważ będą **publiczne**.
|
||||
|
||||
Aby wydobyć pamięć z przeglądarki, można **wydobyć pamięć procesu** lub przejść do **ustawień** rozszerzenia przeglądarki, klikając **`Inspect pop-up`** -> W sekcji **`Memory`** -> **`Zrób zrzut`** i użyć **`CTRL+F`** do wyszukiwania w zrzucie wrażliwych informacji.
|
||||
|
||||
## Komunikacja Skryptu Zawartości **↔︎** Skryptu Tła
|
||||
## Skrypt Zawartości **↔︎** Skrypt Tła Komunikacja
|
||||
|
||||
Skrypt Zawartości może użyć funkcji [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **lub** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) do wysłania **jednorazowej wiadomości serializowalnej w formacie JSON**.
|
||||
|
||||
Aby obsłużyć **odpowiedź**, użyj zwróconego **Promise**. Choć, dla zachowania wstecznej kompatybilności, nadal można przekazać **wywołanie zwrotne** jako ostatni argument.
|
||||
Aby obsłużyć **odpowiedź**, użyj zwróconego **Promise**. Mimo to, dla zachowania kompatybilności wstecznej, nadal można przekazać **funkcję zwrotną** jako ostatni argument.
|
||||
|
||||
Wysłanie żądania z **skryptu zawartości** wygląda tak:
|
||||
Wysłanie żądania ze **skryptu zawartości** wygląda następująco:
|
||||
```javascript
|
||||
(async () => {
|
||||
const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
||||
|
@ -458,7 +509,7 @@ const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
|||
console.log(response);
|
||||
})();
|
||||
```
|
||||
Wysyłanie żądania z **rozszerzenia** (zwykle z **skryptu tła**) Skrypt zawartości może korzystać z funkcji, z tym że musisz określić, do którego karty wysłać. Przykład, jak wysłać wiadomość do skryptu zawartości w wybranej karcie:
|
||||
Wysyłanie żądania z **rozszerzenia** (zwykle z **skryptu tła**). Przykład, jak wysłać wiadomość do skryptu zawartości w wybranej karcie:
|
||||
```javascript
|
||||
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
||||
(async () => {
|
||||
|
@ -468,7 +519,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
|
|||
console.log(response);
|
||||
})();
|
||||
```
|
||||
Na **końcu odbiorczym**, musisz skonfigurować nasłuchiwanie zdarzenia [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) aby obsłużyć wiadomość. Wygląda to tak samo zarówno z treści skryptu, jak i strony rozszerzenia.
|
||||
Na **końcu odbiorczym**, musisz skonfigurować nasłuchiwanie zdarzenia [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage), aby obsłużyć wiadomość. Wygląda to tak samo zarówno z treścią skryptu, jak i stroną rozszerzenia.
|
||||
```javascript
|
||||
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
||||
chrome.runtime.onMessage.addListener(
|
||||
|
@ -481,27 +532,39 @@ sendResponse({farewell: "goodbye"});
|
|||
}
|
||||
);
|
||||
```
|
||||
W podświetlonym przykładzie **`sendResponse()`** zostało wykonane synchronicznie. Aby zmodyfikować obsługę zdarzenia `onMessage` w celu asynchronicznego wykonania `sendResponse()`, konieczne jest dodanie `return true;`.
|
||||
W podświetlonym przykładzie **`sendResponse()`** zostało wykonane w sposób synchroniczny. Aby zmodyfikować obsługę zdarzenia `onMessage` w celu asynchronicznego wykonania `sendResponse()`, konieczne jest uwzględnienie `return true;`.
|
||||
|
||||
Ważnym rozważeniem jest, że w scenariuszach, gdzie wiele stron jest ustawionych do otrzymywania zdarzeń `onMessage`, **pierwsza strona wykonująca `sendResponse()`** dla określonego zdarzenia będzie jedyną zdolną efektywnie dostarczyć odpowiedź. Wszelkie kolejne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
|
||||
Ważnym aspektem jest, że w scenariuszach, gdzie wiele stron jest ustawionych do otrzymywania zdarzeń `onMessage`, **pierwsza strona wykonująca `sendResponse()`** dla określonego zdarzenia będzie jedyną zdolną skutecznie dostarczyć odpowiedź. Wszelkie kolejne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
|
||||
|
||||
Podczas tworzenia nowych rozszerzeń, należy preferować obietnice (promises) w przeciwieństwie do wywołań zwrotnych. W odniesieniu do użycia wywołań zwrotnych, funkcja `sendResponse()` jest uważana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym, lub jeśli obsługa zdarzeń wskazuje na operację asynchroniczną poprzez zwrócenie `true`. Jeśli żaden z obsługujących nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zebrana przez garbage collector), wywołany zostanie domyślnie zwrotny wywołanie związane z funkcją `sendMessage()`.
|
||||
Tworząc nowe rozszerzenia, należy preferować obietnice (promises) w przeciwieństwie do wywołań zwrotnych (callbacks). W odniesieniu do użycia wywołań zwrotnych, funkcja `sendResponse()` jest uważana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym, lub jeśli obsługa zdarzenia wskazuje na operację asynchroniczną poprzez zwrócenie `true`. Jeśli żaden z obsługujących nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zebrana przez garbage collector), zwrotny wywołanie związane z funkcją `sendMessage()` zostanie domyślnie uruchomione.
|
||||
|
||||
## Ładowanie rozszerzenia w przeglądarce
|
||||
## Wrażliwe informacje w pamięci/kodzie/schowku
|
||||
|
||||
1. **Pobierz** Rozszerzenie Przeglądarki & rozpakuj
|
||||
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, mogą one zostać **wydobyte** (szczególnie w systemach Windows) i **przeszukane** w poszukiwaniu tych informacji.
|
||||
|
||||
Dlatego pamięć Rozszerzenia Przeglądarki **nie powinna być uważana za bezpieczną** i **wrażliwe informacje** takie jak dane uwierzytelniające czy frazy mnemoniczne **nie powinny być przechowywane**.
|
||||
|
||||
Oczywiście, **nie umieszczaj wrażliwych informacji w kodzie**, ponieważ będą one **publiczne**.
|
||||
|
||||
Aby wydobyć pamięć z przeglądarki, można **wydobyć pamięć procesu** lub przejść do **ustawień** rozszerzenia przeglądarki i kliknąć **`Inspect pop-up`** -> W sekcji **`Memory`** -> **`Zrób zrzut`** i użyć **`CTRL+F`** do wyszukiwania w zrzucie wrażliwych informacji.
|
||||
|
||||
Co więcej, bardzo wrażliwe informacje, takie jak klucze mnemoniczne czy hasła, **nie powinny być zezwolone na kopiowanie do schowka** (lub przynajmniej usuń je ze schowka po kilku sekundach), ponieważ procesy monitorujące schowek będą w stanie je uzyskać.
|
||||
|
||||
## Ładowanie Rozszerzenia w Przeglądarce
|
||||
|
||||
1. **Pobierz** Rozszerzenie Przeglądarki i rozpakuj
|
||||
2. Przejdź do **`chrome://extensions/`** i **włącz** `Tryb Dewelopera`
|
||||
3. Kliknij przycisk **`Załaduj rozpakowane`**
|
||||
|
||||
W **Firefoxie** przejdź do **`about:debugging#/runtime/this-firefox`** i kliknij przycisk **`Załaduj tymczasowe rozszerzenie`**.
|
||||
|
||||
## Pobieranie kodu źródłowego ze sklepu
|
||||
## Pobieranie kodu źródłowego z sklepu
|
||||
|
||||
Kod źródłowy rozszerzenia Chrome można uzyskać za pomocą różnych metod. Poniżej znajdują się szczegółowe wyjaśnienia i instrukcje dla każdej opcji.
|
||||
|
||||
### Pobierz rozszerzenie jako ZIP za pomocą wiersza poleceń
|
||||
### Pobierz Rozszerzenie jako ZIP za pomocą Wiersza Poleceń
|
||||
|
||||
Kod źródłowy rozszerzenia Chrome można pobrać jako plik ZIP za pomocą wiersza poleceń. Wymaga to użycia `curl` do pobrania pliku ZIP z określonego adresu URL, a następnie rozpakowania zawartości pliku ZIP do katalogu. Oto kroki:
|
||||
Kod źródłowy rozszerzenia Chrome można pobrać jako plik ZIP za pomocą wiersza poleceń. Wymaga to użycia `curl` do pobrania pliku ZIP z określonego adresu URL, a następnie wypakowania zawartości pliku ZIP do katalogu. Oto kroki:
|
||||
|
||||
1. Zastąp `"extension_id"` rzeczywistym identyfikatorem rozszerzenia.
|
||||
2. Wykonaj następujące polecenia:
|
||||
|
@ -516,11 +579,11 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
|||
|
||||
### Użyj rozszerzenia CRX Viewer
|
||||
|
||||
Inną wygodną metodą jest korzystanie z przeglądarki Chrome Extension Source Viewer, która jest projektem open-source. Można ją zainstalować ze sklepu [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy przeglądarki jest dostępny w [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
|
||||
Inną wygodną metodą jest użycie przeglądarki Chrome Extension Source Viewer, który jest projektem open-source. Można go zainstalować ze sklepu [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy przeglądarki jest dostępny w [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
|
||||
|
||||
### Wyświetl źródło lokalnie zainstalowanego rozszerzenia
|
||||
|
||||
Lokalnie zainstalowane rozszerzenia Chrome można również sprawdzić. Oto jak to zrobić:
|
||||
Lokalnie zainstalowane rozszerzenia Chrome można również sprawdzić. Oto jak:
|
||||
|
||||
1. Otwórz katalog profilu lokalnego Chrome, odwiedzając `chrome://version/` i zlokalizuj pole "Profile Path".
|
||||
2. Przejdź do podfolderu `Extensions/` w katalogu profilu.
|
||||
|
@ -529,7 +592,7 @@ Lokalnie zainstalowane rozszerzenia Chrome można również sprawdzić. Oto jak
|
|||
Aby zidentyfikować rozszerzenia, można przyporządkować ich identyfikatory do nazw:
|
||||
|
||||
* Włącz tryb dewelopera na stronie `about:extensions`, aby zobaczyć identyfikatory każdego rozszerzenia.
|
||||
* Wewnątrz folderu każdego rozszerzenia plik `manifest.json` zawiera czytelną sekcję `name`, co ułatwia identyfikację rozszerzenia.
|
||||
* Wewnątrz folderu każdego rozszerzenia plik `manifest.json` zawiera czytelną sekcję `name`, pomagającą zidentyfikować rozszerzenie.
|
||||
|
||||
### Użyj Archiwizatora plików lub Odpakowywacza
|
||||
|
||||
|
@ -541,47 +604,47 @@ Otwórz Chrome i przejdź do `chrome://extensions/`. Włącz "Tryb dewelopera" w
|
|||
|
||||
## Lista kontrolna audytu bezpieczeństwa
|
||||
|
||||
Mimo że rozszerzenia przeglądarki mają **ograniczoną powierzchnię ataku**, niektóre z nich mogą zawierać **podatności** lub **potencjalne ulepszenia zabezpieczeń**. Oto najczęstsze zalecenia:
|
||||
Mimo że rozszerzenia przeglądarki mają **ograniczoną powierzchnię ataku**, niektóre z nich mogą zawierać **podatności** lub **potencjalne ulepszenia zabezpieczeń**. Oto najczęstsze z nich:
|
||||
|
||||
* [ ] **Ograniczaj** jak najbardziej żądane **`uprawnienia`**
|
||||
* [ ] **Ograniczaj** jak najbardziej **`host_permissions`**
|
||||
* Użyj **silnej** **`content_security_policy`**
|
||||
* [ ] **Ograniczaj** jak najbardziej **`externally_connectable`**, jeśli nie jest to potrzebne i możliwe, nie pozostawiaj go domyślnie, określ **`{}`**
|
||||
* [ ] Jeśli tutaj wymieniono **URL podatny na XSS lub przejęcie**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptów w tle**. Bardzo potężne obejście.
|
||||
* Jeśli tutaj wymieniono **URL podatny na XSS lub przejęcie**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptów tła**. Bardzo potężne obejście.
|
||||
* [ ] **Ograniczaj** jak najbardziej **`web_accessible_resources`**, nawet jeśli jest puste, jeśli to możliwe.
|
||||
* [ ] Jeśli **`web_accessible_resources`** nie jest puste, sprawdź [**ClickJacking**](browext-clickjacking.md)
|
||||
* [ ] Jeśli zachodzi jakakolwiek **komunikacja** z **rozszerzenia** do **strony internetowej**, [**sprawdź pod kątem XSS**](browext-xss-example.md) **podatności** wynikających z komunikacji.
|
||||
* [ ] Jeśli są używane Post Messages, sprawdź [**podatności Post Message**](../postmessage-vulnerabilities/)**.**
|
||||
* [ ] Jeśli **Skrypt zawartości uzyskuje dostęp do szczegółów DOM**, sprawdź, czy nie wprowadzają one XSS, jeśli zostaną **zmodyfikowane** przez stronę internetową
|
||||
* [ ] Zwróć szczególną uwagę, jeśli ta komunikacja jest również zaangażowana w **komunikację Skryptu zawartości -> Skryptu w tle**
|
||||
* [ ] **Informacje poufne nie powinny być przechowywane** w kodzie rozszerzenia przeglądarki
|
||||
* [ ] **Informacje poufne nie powinny być przechowywane** w pamięci rozszerzenia przeglądarki
|
||||
* Jeśli **`web_accessible_resources`** nie jest puste, sprawdź [**ClickJacking**](browext-clickjacking.md)
|
||||
* Jeśli występuje jakakolwiek **komunikacja** z **rozszerzenia** do **strony internetowej**, sprawdź **podatności na XSS** spowodowane w komunikacji.
|
||||
* Jeśli są używane Post Messages, sprawdź [**podatności na Post Message**](../postmessage-vulnerabilities/)**.**
|
||||
* Jeśli **Skrypt zawartości uzyskuje dostęp do szczegółów DOM**, sprawdź, czy nie wprowadzają one XSS, jeśli zostaną **zmodyfikowane** przez stronę internetową
|
||||
* Zwróć szczególną uwagę, jeśli ta komunikacja jest również zaangażowana w **komunikację Skryptu zawartości -> Skrypt tła**
|
||||
* **Informacje poufne nie powinny być przechowywane** w kodzie rozszerzenia przeglądarki
|
||||
* **Informacje poufne nie powinny być przechowywane** w pamięci rozszerzenia przeglądarki
|
||||
|
||||
## Narzędzia
|
||||
|
||||
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
||||
|
||||
* Pobiera dowolne rozszerzenie Chrome z podanego linku sklepu Chrome.
|
||||
* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: po prostu wyświetla sformatowaną wersję manifestu rozszerzenia.
|
||||
* Analiza odcisków palców: Wykrywanie [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) i automatyczna generacja JavaScriptu do odcisków palców rozszerzenia Chrome.
|
||||
* Przeglądarka [**manifest.json**](https://developer.chrome.com/extensions/manifest): po prostu wyświetla sformatowaną wersję manifestu rozszerzenia.
|
||||
* Analiza odcisków palców: Wykrywanie [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) i automatyczna generacja JavaScriptu odcisków palców rozszerzenia Chrome.
|
||||
* Analiza potencjalnego Clickjackingu: Wykrywanie stron HTML rozszerzenia z dyrektywą [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources). Są one potencjalnie podatne na clickjacking w zależności od celu stron.
|
||||
* Przeglądarka ostrzeżeń o uprawnieniach: pokazuje listę wszystkich ostrzeżeń dotyczących uprawnień Chrome, które zostaną wyświetlone podczas próby instalacji rozszerzenia przez użytkownika.
|
||||
* **Funkcje niebezpieczne**: pokazuje lokalizację funkcji niebezpiecznych, które potencjalnie mogą być wykorzystane przez atakującego (np. funkcje takie jak innerHTML, chrome.tabs.executeScript).
|
||||
* **Punkty wejścia**: pokazuje, gdzie rozszerzenie pobiera dane od użytkownika/zewnętrzne. Jest to przydatne do zrozumienia obszaru powierzchni ataku rozszerzenia i poszukiwania potencjalnych punktów do przesyłania złośliwie spreparowanych danych do rozszerzenia.
|
||||
* Zarówno skanery Funkcji niebezpiecznych, jak i Punkty wejścia mają następujące elementy dla wygenerowanych alertów:
|
||||
* **Punkty wejścia**: pokazuje, gdzie rozszerzenie pobiera dane od użytkownika/zewnętrzne dane. Jest to przydatne do zrozumienia obszaru powierzchni rozszerzenia i poszukiwania potencjalnych punktów do przesyłania złośliwie spreparowanych danych do rozszerzenia.
|
||||
* Zarówno skanery Funkcji niebezpiecznych, jak i Punkty wejścia mają następujące elementy dla generowanych alertów:
|
||||
* Istotny fragment kodu i linia, która spowodowała alert.
|
||||
* Opis problemu.
|
||||
* Przycisk „Wyświetl plik”, aby zobaczyć pełny plik źródłowy zawierający kod.
|
||||
* Ścieżka pliku, który wywołał alert.
|
||||
* Pełny URI rozszerzenia Chrome pliku, który wywołał alert.
|
||||
* Typ pliku, taki jak skrypt strony w tle, skrypt zawartości, akcja przeglądarki, itp.
|
||||
* Ścieżka pliku ostrzeżonego.
|
||||
* Pełny URI rozszerzenia Chrome ostrzeżonego pliku.
|
||||
* Typ pliku, taki jak skrypt strony tła, skrypt zawartości, akcja przeglądarki, itp.
|
||||
* Jeśli podatna linia znajduje się w pliku JavaScript, ścieżki wszystkich stron, gdzie jest ona zawarta, a także status [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) tych stron.
|
||||
* **Analizator zasad bezpieczeństwa zawartości (CSP) i sprawdzarka bypass**: Wskaże słabe punkty w zasadach CSP Twojego rozszerzenia oraz oświetli ewentualne sposoby na ich obejście z powodu zatwierdzonych na białej liście CDN itp.
|
||||
* **Znane biblioteki podatne na ataki**: Wykorzystuje [Retire.js](https://retirejs.github.io/retire.js/) do sprawdzenia, czy używane są znane biblioteki JavaScript podatne na ataki.
|
||||
* **Znane biblioteki podatne**: Wykorzystuje [Retire.js](https://retirejs.github.io/retire.js/) do sprawdzenia użycia znanych podatnych bibliotek JavaScript.
|
||||
* Pobierz rozszerzenie i sformatowane wersje.
|
||||
* Pobierz oryginalne rozszerzenie.
|
||||
* Pobierz sformatowaną wersję rozszerzenia (automatycznie sformatowany HTML i JavaScript).
|
||||
* Automatyczne buforowanie wyników skanowania, pierwsze uruchomienie skanowania rozszerzenia zajmie trochę czasu. Jednak drugie uruchomienie, zakładając, że rozszerzenie nie zostało zaktualizowane, będzie prawie natychmiastowe ze względu na buforowanie wyników.
|
||||
* Automatyczne buforowanie wyników skanowania, uruchomienie skanowania rozszerzenia zajmie sporo czasu za pierwszym razem. Jednak drugi raz, zakładając, że rozszerzenie nie zostało zaktualizowane, będzie prawie natychmiastowe ze względu na buforowanie wyników.
|
||||
* Linkowalne adresy URL raportów, łatwe przekazanie komuś innemu raportu o rozszerzeniu wygenerowanego przez tarnish.
|
||||
|
||||
### [Neto](https://github.com/elevenpaths/neto)
|
||||
|
|
Loading…
Add table
Reference in a new issue