Dbaj o bezpieczeństwo

Rozszerzenia mają dostęp do specjalnych uprawnień w przeglądarce, dzięki czemu są atrakcyjnym celem osób przeprowadzających atak. Jeśli rozszerzenie zostanie przejęte, każdy jego użytkownik będzie narażony na ataki złośliwe i niechciane ingerencje. Zadbaj o bezpieczeństwo rozszerzenia i użytkowników dzięki tych praktyk.

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, udostępniaj w niej tylko zaufanym deweloperom. Nie akceptuj próśb o dołączenie od nieznanych osób.

Nigdy nie używaj protokołu HTTP

Podczas wysyłania żądań lub wysyłania danych unikaj połączenia HTTP. Zakładamy, że wszystkie połączenia HTTP zawierają osoby wyłudzające informacje lub zawierają modyfikacje; Preferowany protokół HTTPS powinien być zawsze preferowany, ponieważ ma on wbudowany aby obejść większość 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 manifestu. Rozszerzenia powinny zminimalizować swoje uprawnienia, rejestrując jedynie interfejsy API i w zależności od witryny. Kod arbitrażowy należy ograniczyć do minimum.

Ograniczenie uprawnień dotyczących rozszerzeń ogranicza możliwości, jakie może wykorzystać potencjalny atakujący.

Żądanie XMLHttpRequest z innych domen

Rozszerzenie może używać obiektu XMLHttpRequest tylko do pobierania zasobów z samego siebie 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świetlam listę "/*" i "https://*google.com/" w uprawnieniach. Jeśli rozszerzenie mogło wejść w interakcję tylko z witrynami spełniającymi wzorca dopasowania. Osoba przeprowadzająca atak nie będzie mogła uzyskać dostępu do "https://user_bank_info.com" lub wchodzą w interakcję z użytkownikiem "https://malicious_website.com".

Ogranicz pola pliku manifestu

Uwzględnienie zbędnych rejestracji w pliku manifestu tworzy luki w zabezpieczeniach i powoduje rozszerzenie jest lepiej widoczna. Ogranicz pola manifestu do tych, na których zależy rozszerzenie, i dodaj określone pole rejestracji.

Połączenie z zewnątrz

W polu externally_connectable możesz zadeklarować, które rozszerzenia zewnętrzne i strony internetowe będzie wymieniać informacje z rozszerzeniem. 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 rozszerzenia wykrywalnego przez witryny i osoby przeprowadzające atak.

{
  ...
  "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

Aby zapobiec wyświetlaniu reklam w innych witrynach, w pliku manifestu uwzględnij politykę bezpieczeństwa treści dla rozszerzenia. ataki skryptowe. 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 konkretnych 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()

W miarę możliwości unikaj stosowania narzędzia eval(), aby zapobiegać atakom, ponieważ eval() wykonuje każdy przekazany kod co może być szkodliwe.

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 używaj skryptów treści

Chociaż skrypty treści funkcjonują w izolowanym świecie, nie są odporne na ataki:

  • Skrypty treści są jedynym elementem rozszerzenia, który wchodzi w bezpośrednią interakcję ze stroną internetową. Z tego powodu wrogie strony internetowe mogą manipulować elementami DOM, od których zależy skrypt treści. lub wykorzystywać zaskakujące standardowe zachowania w internecie, takie jak elementy z nazwą.
  • Aby wchodzić w interakcję z modelem DOM stron internetowych, skrypty treści muszą być wykonywane w tym samym procesie renderowania stronę internetową. To sprawia, że skrypty treści są narażone na wyciek danych przez ataki na kanał boczny (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).
  • Załóż, że wszelkie 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ń z podwyższonymi uprawnieniami, które mogą być wywoływane przez skrypty treści. Nie zezwalaj skrypty treści, które uruchamiają żądania wysyłane do dowolnych adresów URL lub przekazują dowolne argumenty do interfejsów API rozszerzeń (np. nie zezwalaj na przekazywanie dowolnych adresów URL do fetch ani 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 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();
});

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, dezynfekując dane wejściowe użytkownika i przychodzące nawet z samego rozszerzenia i zatwierdzonych źródeł. Unikaj wykonywalnych interfejsów API.

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