Dbaj o bezpieczeństwo

Rozszerzenia mają dostęp do specjalnych uprawnień w przeglądarce, co czyni je atrakcyjnym celem dla atakujących. Jeśli rozszerzenie zostanie naruszone, każdy użytkownik tego rozszerzenia stanie się podatny na złośliwe i niechciane wtargnięcie. Aby zapewnić bezpieczeństwo rozszerzenia i jego użytkowników, stosuj te praktyki.

Ochrona kont deweloperów

Kod rozszerzenia jest przesyłany i aktualizowany przy użyciu kont Google. Jeśli deweloperzy Konta są może on przesłać złośliwy kod bezpośrednio do wszystkich użytkowników. Chroń te konta przez tworząc w szczególności konta deweloperów , i włącz uwierzytelnianie dwuskładnikowe. za pomocą klucza bezpieczeństwa .

Wybór grup

Jeśli korzystasz z publikowania grupowego, ograniczaj się do zaufanych programistów. Nie akceptuj próśb o dołączenie od nieznanych osób.

Nigdy nie używaj HTTP.

Unikaj korzystania z połączenia HTTP podczas wysyłania lub żądania danych. Zakładamy, że wszystkie połączenia HTTP zawierają osoby wyłudzające informacje lub zawierają modyfikacje; Należy zawsze preferować protokół HTTPS, ponieważ ma on wbudowane zabezpieczenia, które zapobiegają większości ataków typu „man in the middle”.

Poproś o minimalne uprawnienia

Przeglądarka Chrome ogranicza dostęp rozszerzenia do uprawnień, których zażądano w sekcji manifest. Rozszerzenia powinny minimalizować uprawnienia, rejestrując tylko interfejsy API i strony internetowe, od których zależą. Kod dowolny należy ograniczyć do minimum.

Ograniczenie uprawnień rozszerzeń ogranicza możliwości potencjalnego atakującego.

XMLHttpRequest między domenami

Rozszerzenie może używać tylko metody XMLHttpRequest do pobierania zasobów z rozszerzenia i z domen określonych w uprawnieniach.

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "permissions": [
    "/*",
    "https://*.google.com/"
  ],
  "manifest_version": 2
}

To rozszerzenie wymaga dostępu do wszystkich treści w witrynie developer.chrome.com i subdomen Google przez wyświetlić listę "/*" i "https://*google.com/" w uprawnieniach. Nawet jeśli rozszerzenie zostanie naruszone, będzie mieć uprawnienia tylko do interakcji z witrynami, które spełniają wzorzec dopasowania. Atakujący nie będzie mieć dostępu do "https://user_bank_info.com" ani nie będzie mógł wchodzić w interakcję z usługą "https://malicious_website.com".

Ograniczanie pól pliku manifestu

Dodawanie niepotrzebnych rejestracji w pliku manifestu powoduje podatność na ataki i zwiększa widoczność rozszerzenia. Ogranicz pola manifestu do tych, których potrzebuje rozszerzenie, i zarejestruj konkretne pola.

można połączyć zewnętrznie.

W polu externally_connectable możesz określić, z którymi zewnętrznymi rozszerzeniami i stronami internetowymi rozszerzenie będzie wymieniać informacje. Określanie, z kim rozszerzenie może się łączyć zewnętrznie z zaufanych źródeł.

{
  "name": "Super Safe Extension",
  "externally_connectable": {
    "ids": [
      "iamafriendlyextensionhereisdatas"
    ],
    "matches": [
      "/*",
      "https://*google.com/"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

Zasoby dostępne przez internet

Udostępnienie zasobów w internecie zgodnie z zasadami web_accessible_resources sprawi, że rozszerzenie wykrywalne przez witryny i atakujące.

{
  ...
  "web_accessible_resources": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

Im więcej dostępnych zasobów jest dostępnych w internecie, tym więcej możliwości może wykorzystać atakujący. Google Keep te pliki do minimum.

Uwzględnij zasady bezpieczeństwa treści dla pełnoletnich

W pliku manifestu dodaj zasady bezpieczeństwa treści dla rozszerzenia, aby zapobiec atakom typu cross-site scripting. Jeśli rozszerzenie wczytuje zasoby tylko z samego siebie, zarejestruj:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self'"
  "manifest_version": 2
}

Jeśli rozszerzenie musi zawierać skrypty z określonych hostów, możesz je uwzględnić:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self' https://extension.resource.com"
  "manifest_version": 2
}

Unikaj wykonywalnych interfejsów API

Interfejsy API, które wykonują kod, należy zastąpić bezpieczniejszymi alternatywami.

document.write() i innerHTML

Chociaż prościej jest dynamiczne tworzenie elementów HTML za pomocą tagów document.write() i innerHTML, i pozostawia rozszerzenie, a strony internetowe, od których zależy, są otwarte na wstawienie złośliwych skryptów. Zamiast tego musisz ręcznie utworzyć węzły DOM i używać interfejsu innerText do wstawiania treści dynamicznych.

function constructDOM() {
  let newTitle = document.createElement('h1');
  newTitle.innerText = host;
  document.appendChild(newTitle);
}

eval()

Aby zapobiegać atakom, w miarę możliwości unikaj używania funkcji eval(), ponieważ może ona wykonywać przekazywany do niej kod, który może być złośliwy.

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // WARNING! Might be evaluating an evil script!
    var resp = eval("(" + xhr.responseText + ")");
    ...
  }
}
xhr.send();

Zamiast tego wolą bezpieczniejsze i szybsze metody takie jak JSON.parse()

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();

Ostrożnie korzystaj ze skryptów treści

Chociaż skrypty treści działają w odizolowanym środowisku, nie są odporne na ataki:

  • Skrypty treści to jedyna część rozszerzenia, która bezpośrednio współpracuje ze stroną internetową. W związku z tym strony internetowe mogą manipulować częściami DOM, od których zależy skrypt treści, lub wykorzystywać zaskakujące standardowe zachowania internetowe, takie jak elementy o nazwie.
  • Aby wchodzić w interakcję z modelem DOM stron internetowych, skrypty treści muszą być wykonywane w tym samym procesie renderowania stronę internetową. Skrypty treści są wtedy podatne na wyciek danych w ramach ataków typu side-channel (np. Spectre), a także możliwość przejęcia przez hakera w przypadku przejęcia witryny przez szkodliwą stronę internetową. mechanizm renderowania.

Do zadań poufnych należy wykonywać specjalny proces, np. związane z kontem rozszerzenia skrypt. Unikaj przypadkowego ujawnienia uprawnień rozszerzenia skryptom treści:

  • Załóżmy, że wiadomości ze skryptu treści mogły zostać przygotowane przez osobę przeprowadzającą atak (np. zweryfikuj i oczyszczaj wszystkie dane wejściowe i chroń skrypty przed skryptami między witrynami).
  • Zakładamy, że wszystkie dane wysyłane do skryptu treści mogą wyciec na stronę internetową. Nie wysyłaj danych wrażliwych (np. obiekty tajne rozszerzenia, dane z innych źródeł internetowych, historia przeglądania) do treści skryptów.
  • Ogranicz zakres działań uprzywilejowanych, które mogą być wywoływane przez skrypty treści. Nie zezwalaj skryptom treści na wywoływanie żądań do dowolnych adresów URL ani przekazywanie dowolnych argumentów do interfejsów API rozszerzeń (np. nie zezwalaj na przekazywanie dowolnych adresów URL do interfejsu fetch ani interfejsu chrome.tabs.create API).

Rejestrowanie i oczyszczanie danych wejściowych

Chroń rozszerzenie przed złośliwymi skryptami, ograniczając detektory tylko do tego, co jest rozszerzeniem oczekiwanie, weryfikowanie nadawców przychodzących danych i dezynfekcja wszystkich danych wejściowych.

Rozszerzenie powinno być zarejestrowane w domenie runtime.onRequestExternal tylko wtedy, gdy oczekuje komunikacji z zewnętrznej witryny lub rozszerzenia. Zawsze sprawdzaj, czy nadawca jest zaufanym źródłem.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

Kontroluj nawet wiadomości wysyłane przez zdarzenie runtime.onMessage z samego rozszerzenia. upewnij się, że MessageSender nie pochodzi ze skryptu treści, które zostały przejęte.

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.allowedAction)
    console.log("This is an allowed action.");
});

Nie dopuszczaj rozszerzenia do wykonania skryptu atakującego, oczyszczając dane wejściowe użytkownika i przychodzące nawet z samego rozszerzenia i zatwierdzonych źródeł. Unikaj interfejsów API z plikami wykonywalnymi.

function sanitizeInput(input) {
    return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}