Melhorar a segurança das extensões

Melhorias na segurança do Manifesto V3

Esta é a última das três seções que descrevem as mudanças necessárias para o código que não faz parte do service worker da extensão. Ela descreve as mudanças necessárias para melhorar a segurança das extensões. As outras duas seções abordam a atualização do código necessária para o upgrade para o Manifesto V3 e a substituição do bloqueio de solicitações da Web.

Remover a execução de strings arbitrárias

Não é mais possível executar lógica externa usando executeScript(), eval() e new Function().

  • Mova todo o código externo (JS, Wasm, CSS) para o pacote de extensões.
  • Atualize as referências de script e estilo para carregar recursos do pacote de extensão.
  • Use o chrome.runtime.getURL() para criar URLs de recursos no momento da execução.
  • Usar um iframe em sandbox: eval e new Function(...) ainda são compatíveis com iframes em sandbox. Para mais detalhes, leia o guia sobre iframes em sandbox.

O método executeScript() agora está no namespace scripting, e não no namespace tabs. Para informações sobre como atualizar chamadas, consulte Mover executeScript().

Há alguns casos especiais em que ainda é possível executar strings arbitrárias:

Remover o código hospedado remotamente

No Manifesto V3, toda a lógica da extensão precisa fazer parte do pacote da extensão. Não é mais possível carregar e executar arquivos hospedados remotamente de acordo com a política da Chrome Web Store. Por exemplo:

  • Arquivos JavaScript extraídos do servidor do desenvolvedor.
  • Qualquer biblioteca hospedada em uma CDN.
  • Bibliotecas de terceiros agrupadas que buscam dinamicamente o código hospedado remotamente.

Há abordagens alternativas disponíveis, dependendo do seu caso de uso e do motivo da hospedagem remota. Esta seção descreve as abordagens a serem consideradas. Se você tiver problemas com o código hospedado remotamente, disponibilizamos orientações.

Recursos e lógica baseados em configuração

Sua extensão carrega e armazena em cache uma configuração remota (por exemplo, um arquivo JSON) no tempo de execução. A configuração em cache determina quais recursos são ativados.

Lógica externalizada com um serviço remoto

Sua extensão chama um serviço da Web remoto. Isso permite que você mantenha a privacidade do código e o altere conforme necessário, evitando a sobrecarga extra de reenvio para a Chrome Web Store.

Incorporar código hospedado remotamente em um iframe em sandbox

O código hospedado remotamente é compatível com iframes em sandbox. Observe que essa abordagem não funciona se o código exigir acesso ao DOM da página de incorporação.

Agrupar bibliotecas de terceiros

Se você estiver usando um framework conhecido, como React ou Bootstrap, que já estava carregando de um servidor externo, poderá fazer o download dos arquivos minificados, adicioná-los ao projeto e importá-los localmente. Exemplo:

<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">

Para incluir uma biblioteca em um worker de serviço, defina a chave "background.type" como "module" no manifesto e use uma instrução import.

Usar bibliotecas externas em scripts injetados por guias

Também é possível carregar bibliotecas externas no momento da execução adicionando-as à matriz files ao chamar scripting.executeScript(). Você ainda pode carregar dados remotamente no ambiente de execução.

chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['jquery-min.js', 'content-script.js']
});

Injetar uma função

Caso você precise de mais dinamismo, a nova propriedade func em scripting.executeScript() permite injetar uma função como um script de conteúdo e transmitir variáveis usando a propriedade args.

Manifest V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

Em um arquivo de script em segundo plano.

Manifesto V3
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

function showAlert(givenName) {
  alert(`Hello, ${givenName}`);
}

let name = 'World';
chrome.scripting.executeScript({
  target: {tabId: tab.id},
  func: showAlert,
  args: [name],
});

No service worker em segundo plano.

O repositório de exemplos de extensões do Chrome (em inglês) tem um exemplo de injeção de função que você pode consultar. Um exemplo de getCurrentTab() está na referência da função.

Procurar outras soluções alternativas

Se as abordagens anteriores não ajudarem no seu caso de uso, talvez seja necessário encontrar uma solução alternativa (por exemplo, migrar para uma biblioteca diferente) ou encontrar outras maneiras de usar a funcionalidade da biblioteca. Por exemplo, no caso do Google Analytics, você pode mudar para o Measurement Protocol do Google em vez de usar a versão oficial hospedada remotamente do JavaScript, conforme descrito no guia do Google Analytics 4.

Atualizar a Política de Segurança de Conteúdo

O "content_security_policy" não foi removido do arquivo manifest.json, mas agora é um dicionário compatível com duas propriedades: "extension_pages" e "sandbox".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifesto V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages: se refere a contextos na sua extensão, incluindo arquivos HTML e service workers.

sandbox: refere-se a qualquer página de extensão no modo sandbox que sua extensão usa.

Remover políticas de segurança de conteúdo sem suporte

O Manifesto V3 proíbe determinados valores da Política de Segurança de Conteúdo no campo "extension_pages" que foram permitidos no Manifesto V2. Especificamente, o Manifest V3 proíbe aqueles que permitem a execução remota de código. As diretivas script-src, object-src e worker-src só podem ter os seguintes valores:

  • self
  • none
  • wasm-unsafe-eval
  • Somente extensões descompactadas: qualquer origem de host local (http://localhost, http://127.0.0.1 ou qualquer porta nesses domínios)

Os valores da política de segurança de conteúdo para sandbox não têm essas novas restrições.