2
0
Fork 0
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:
Translator 2024-06-08 12:13:14 +00:00
parent 101c8cfd55
commit 330707dc13

View file

@ -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)