Proteja-se

As extensões têm acesso a privilégios especiais no navegador, o que as torna um alvo atraente para atacantes. Se uma extensão for comprometida, todos os usuários dela ficarão vulneráveis a invasões maliciosas e indesejadas. Incorpore essas práticas para proteger uma extensão e os usuários dela.

Proteger contas de desenvolvedor

O código da extensão é enviado e atualizado pelas Contas do Google. Se as contas dos desenvolvedores forem comprometidas, um invasor poderá enviar código malicioso diretamente a todos os usuários. Para proteger essas contas, ative a autenticação de dois fatores, de preferência com uma chave de segurança.

Manter grupos seletivos

Se você usar a publicação em grupo, mantenha o grupo restrito a desenvolvedores confiáveis. Não aceite pedidos de associação de pessoas desconhecidas.

Nunca usar HTTP

Ao solicitar ou enviar dados, evite uma conexão HTTP. Suponha que todas as conexões HTTP tenham invasores ou contenham modificações. O HTTPS sempre deve ser preferido, porque ele tem segurança integrada que contorna a maioria dos ataques man-in-the-middle.

Solicitar permissões mínimas

O navegador Chrome limita o acesso de uma extensão a privilégios que foram explicitamente solicitados no manifest. As extensões precisam minimizar as permissões, registrando apenas as APIs e os sites de que dependem.

Limitar os privilégios de uma extensão limita o que um invasor em potencial pode explorar.

fetch() entre origens

Uma extensão só pode usar fetch() e XMLHttpRequest() para receber recursos da extensão e dos domínios especificados nas permissões. As chamadas para ambos são interceptadas pelo gerenciador fetch no worker de serviço.

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

Essa extensão no exemplo acima solicita acesso a tudo em developer.chrome.com e subdomínios do Google, listando "https://developer.chrome.com/*" e "https://*.google.com/*" nas permissões. Se a extensão fosse comprometida, ela ainda teria permissão para interagir com sites que atendem ao padrão de correspondência. O invasor só teria capacidade limitada de acessar "https://user_bank_info.com" ou interagir com "https://malicious_website.com".

Limitar campos do manifesto

A inclusão de chaves e permissões desnecessárias no manifesto cria vulnerabilidades e torna uma extensão mais visível. Limite os campos do manifesto aos que a extensão usa.

Conectável externamente

Use o campo "externally_connectable" para declarar com quais extensões e páginas da Web externas a extensão vai trocar informações. Restringir com quem a extensão pode se conectar externamente a fontes confiáveis.

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

Recursos acessíveis na Web

Tornar os recursos acessíveis pela Web, sob o "web_accessible_resources", vai fazer com que uma extensão seja detectável por sites e invasores.

{
  ...
  "web_accessible_resources": [
    {
      "resources": [ "test1.png", "test2.png" ],
      "matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
    }
  ]
  ...
}

Quanto mais recursos acessíveis na Web estiverem disponíveis, mais caminhos um invasor poderá explorar. Mantenha esses arquivos no mínimo.

Incluir uma política de segurança de conteúdo explícito

Inclua uma política de segurança de conteúdo para a extensão no manifesto para evitar ataques de script cross-site. Se a extensão carregar apenas recursos dela mesma, registre o seguinte:

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

Se a extensão precisar usar o assembly da Web ou aumentar as restrições em páginas em modo sandbox, elas poderão ser adicionadas:

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

Evite document.write() e innerHTML

Embora possa ser mais simples criar elementos HTML dinamicamente com document.write() e innerHTML, a extensão e as páginas da Web em que ela depende ficam vulneráveis a invasores que injetam scripts maliciosos. Em vez disso, crie manualmente nós DOM e use innerText para inserir conteúdo dinâmico.

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

Use scripts de conteúdo com cuidado

Embora os scripts de conteúdo vivam em um mundo isolado, eles não estão imunes a ataques:

  • Os scripts de conteúdo são a única parte de uma extensão que interage diretamente com a página da Web. Por isso, páginas da Web hostis podem manipular partes do DOM de que o script de conteúdo depende ou explorar comportamentos padrão da Web surpreendentes, como itens nomeados.
  • Para interagir com o DOM de páginas da Web, os scripts de conteúdo precisam ser executados no mesmo processo de renderização da página da Web. Isso torna os scripts de conteúdo vulneráveis a vazamentos de dados por ataques de canal lateral, como Spectre) e ser controlado por um invasor se uma página da Web maliciosa comprometer o processo do renderizador.

As operações que usam dados sensíveis (como informações particulares de um usuário) ou APIs do Chrome com acesso às funções do navegador precisam ser realizadas no service worker das extensões. Evite expor acidentalmente os privilégios da extensão a scripts de conteúdo:

  • Suponha que as mensagens de um script de conteúdo possam ter sido criadas por um invasor (por exemplo, valide e limpe todas as entradas e proteja seus scripts contra script em vários locais).
  • Suponha que qualquer dado enviado para o script de conteúdo possa vazar para a página da Web. Não envie dados sensíveis (por exemplo, segredos da extensão, dados de outras origens da Web, histórico de navegação) para scripts de conteúdo.
  • Limite o escopo das ações privilegiadas que podem ser acionadas por scripts de conteúdo. Não permita que scripts de conteúdo ativem solicitações para URLs arbitrários ou transmitam argumentos arbitrários para APIs de extensão. Por exemplo, não transmita URLs arbitrários para métodos fetch() ou chrome.tabs.create().

Registrar e limpar entradas

Proteja uma extensão contra scripts maliciosos limitando os listeners apenas ao que a extensão espera, validando os remetentes dos dados recebidos e limpando todas as entradas.

Uma extensão só precisa se registrar para runtime.onMessageExternal se ela espera comunicação de um site ou extensão externo. Sempre valide se o remetente corresponde a uma origem confiável.

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

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

Mesmo as mensagens pelo evento runtime.onMessage da própria extensão precisam ser analisadas para garantir que o MessageSender não seja de um script de conteúdo comprometido.

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