Rozszerzenia mają dostęp do specjalnych uprawnień w przeglądarce, co sprawia, że są one atrakcyjnym celem dla hakerów. Jeśli rozszerzenie zostanie zhakowane, każdy użytkownik tego rozszerzenia stanie się narażony na złośliwe lub niechciane włamania. Stosuj te metody, aby chronić rozszerzenie i jego użytkowników.
Ochrona kont deweloperów
Kod rozszerzenia jest przesyłany i aktualizowany za pomocą kont Google. Jeśli konta deweloperów zostaną przejęte, haker może przekazać złośliwy kod bezpośrednio do wszystkich użytkowników. Chroń te konta, włączając uwierzytelnianie dwuskładnikowe, najlepiej za pomocą klucza bezpieczeństwa.
Selektywnie utrzymuj grupy
Jeśli korzystasz z publikowania grupowego, grupa nie powinna być dostępna dla zaufanych deweloperów. Nie akceptujemy próśb o członkostwo od nieznanych osób.
Nigdy nie używaj protokołu HTTP
Gdy wysyłasz żądanie lub wysyłasz prośbę o dostęp do danych, unikaj połączenia HTTP. Załóżmy, że wszystkie połączenia HTTP zawierają podsłuchy lub modyfikacje. Zawsze należy używać protokołu HTTPS, ponieważ ma on wbudowane zabezpieczenia, które umożliwiają obejście większości ataków typu „man in the middle”.
Poproś o minimalne uprawnienia
Przeglądarka Chrome ogranicza dostęp rozszerzenia do uprawnień, o które prosisz w pliku manifestu. Rozszerzenia powinny ograniczać do minimum swoje uprawnienia, rejestrując tylko interfejsy API i witryny, od których są zależne.
Ograniczenie uprawnień rozszerzenia ogranicza zakres możliwości atakującego.
Pobieranie z innych domen (metoda pobierania z innych domen)
Rozszerzenie może używać tylko fetch()
i XMLHttpRequest()
, aby pobierać zasoby z rozszerzenia i z domen określonych w uprawnieniach. Pamiętaj, że wywołania obu są przechwytywane przez moduł fetch w skrypcie service worker.
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"host_permissions": [
"https://developer.chrome.com/*",
"https://*.google.com/*"
],
"manifest_version": 3
}
To rozszerzenie z przykładu powyżej prosi o dostęp do wszystkich elementów na stronie developers.chrome.com i subdomen Google, podając w uprawnieniach uprawnienia "https://developer.chrome.com/*"
i "https://*.google.com/*"
. Gdyby rozszerzenie zostało przejęte, nadal będzie mieć uprawnienia do interakcji ze stronami zgodnymi z wzorcem dopasowania. Osoba przeprowadzająca atak będzie miała ograniczone możliwości dostępu do "https://user_bank_info.com"
lub interakcji z "https://malicious_website.com"
.
Ogranicz pola pliku manifestu
Uwzględnienie w pliku manifestu niepotrzebnych kluczy i uprawnień powoduje powstawanie luk w zabezpieczeniach i sprawia, że rozszerzenie jest lepiej widoczne. Ogranicz pola pliku manifestu do tych, na których bazuje rozszerzenie.
Łączone z zewnątrz
W polu "externally_connectable"
możesz określić, z którymi rozszerzeniami zewnętrznymi i stronami internetowymi rozszerzenie będzie wymieniać informacje. Ograniczyć osoby, z którymi rozszerzenie może łączyć się zewnętrznie, do zaufanych źródeł.
{
"name": "Super Safe Extension",
"externally_connectable": {
"ids": [
"iamafriendlyextensionhereisdatas"
],
"matches": [
"https://developer.chrome.com/*",
"https://*.google.com/*"
],
"accepts_tls_channel_id": false
},
...
}
Zasoby dostępne przez internet
Jeśli udostępnisz zasoby w internecie w elemencie "web_accessible_resources"
, witryny i osoby przeprowadzające atak będą wykrywalne rozszerzenie.
{
...
"web_accessible_resources": [
{
"resources": [ "test1.png", "test2.png" ],
"matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
}
]
...
}
Im więcej dostępnych zasobów internetowych masz, tym więcej możliwości może wykorzystać potencjalny atakujący. Ogranicz ich liczbę do minimum.
Uwzględnij zasadę bezpieczeństwa treści dla pełnoletnich
Dodaj politykę bezpieczeństwa treści rozszerzenia w pliku manifestu, aby zapobiec atakom typu cross-site scripting. Jeśli rozszerzenie wczytuje zasoby tylko od samego siebie, zarejestruj następujący kod:
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": {
"extension_pages": "default-src 'self'"
},
"manifest_version": 3
}
Jeśli rozszerzenie musi korzystać ze zbioru internetowego lub zwiększyć ograniczenia na stronach w piaskownicy, można je dodać:
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": {
"extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';",
"sandboxed_pages":"script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
},
"manifest_version": 3
}
Unikaj właściwości document.write() i innerHTML
Dynamiczne tworzenie elementów HTML za pomocą document.write()
i innerHTML
może być prostsze, ale pozostawia rozszerzenie, a strony internetowe, od których to rozszerzenie zależy, są otwarte na ataki wstawiane przez złośliwe skrypty. Zamiast tego możesz ręcznie tworzyć węzły DOM i używać funkcji innerText
do wstawiania zawartości dynamicznej.
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
Ostrożnie używaj skryptów treści
Chociaż skrypty treści żyją w odizolowanym świecie, nie są odporne na ataki:
- Skrypty treści to jedyna część rozszerzenia, która wchodzi w bezpośrednią interakcję ze stroną internetową. Z tego powodu wrogie strony internetowe mogą manipulować częściami DOM, od których zależy skrypt treści, lub wykorzystywać zaskakujące działanie standardu internetowego, np. w postaci elementów oznaczonych.
- Aby wejść w interakcję z DOM stron internetowych, skrypty treści muszą być wykonywane w tym samym procesie renderowania co strona internetowa. To sprawia, że skrypty treści są podatne na wyciek danych w ramach ataków z kanału bocznego (np. Spectre). Przechwytuje ją osoba przeprowadzająca atak, jeśli szkodliwa strona internetowa naruszy proces renderowania.
Operacje korzystające z danych wrażliwych (na przykład prywatnych informacji o użytkowniku) lub interfejsów API Chrome z dostępem do funkcji przeglądarki powinny być wykonywane w mechanizmach Service Worker rozszerzeń. Unikaj przypadkowego ujawniania uprawnień rozszerzeń skryptom treści:
- Załóżmy, że wiadomości ze skryptu treści mogły zostać przygotowane przez atakującego (np. zweryfikuj i przekaż wszystkie dane wejściowe oraz zabezpiecz skrypty przed skryptami działającymi w innych witrynach).
- Załóż, że dane wysyłane do skryptu dotyczącego treści mogą wycieknąć na stronę internetową. Nie wysyłaj do skryptów treści danych wrażliwych (np. obiektów tajnych z rozszerzenia, danych z innych źródeł internetowych, historii przeglądania).
- Ogranicz zakres uprawnień z podwyższonymi uprawnieniami, które mogą być aktywowane przez skrypty treści. Nie zezwalaj skryptom treści na wywoływanie żądań wysyłanych do dowolnych adresów URL ani na przekazywanie dowolnych argumentów do interfejsów API rozszerzeń (np. nie zezwalaj na przekazywanie dowolnych adresów URL do metod
fetch()
lubchrome.tabs.create()
).
Rejestrowanie i oczyszczanie danych wejściowych
Zabezpiecz rozszerzenie przed złośliwymi skryptami, ograniczając detektory tylko do tych, które oczekuje rozszerzenie, weryfikowając nadawców przychodzących danych i oczyszczając wszystkie dane wejściowe.
Rozszerzenie powinno zostać zarejestrowane tylko w przypadku runtime.onMessageExternal
, jeśli oczekuje komunikacji od zewnętrznej strony lub rozszerzenia. Zawsze sprawdzaj, czy nadawca pasuje do zaufanego źródła.
// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
if (sender.id === kFriendlyExtensionId)
doSomething();
});
Nawet wiadomości wysyłane przez zdarzenie runtime.onMessage z samego rozszerzenia powinny być monitorowane, aby mieć pewność, że MessageSender nie pochodzi z przejętego skryptu treści.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});