As extensões têm acesso a privilégios especiais no navegador, o que as torna um alvo atraente para invasores. Se uma extensão for comprometida, todos os usuários dela ficarão vulneráveis a invasões maliciosas e indesejadas. Incorporando essas práticas para manter uma extensão segura e seus usuários protegidos.
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 um código malicioso diretamente para todos os usuários. Ative a autenticação de dois fatores para proteger essas contas , de preferência com uma chave de segurança.
Mantenha os grupos seletivos
Ao usar a publicação em grupo, mantenha o grupo confinado a desenvolvedores confiáveis. Não aceite solicitações 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 espionadores ou contenham modificações. O HTTPS é sempre preferencial 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 aos privilégios que foram explicitamente solicitados no manifesto. As extensões precisam minimizar as permissões registrando apenas as APIs e os sites de que dependem.
A limitação dos privilégios de uma extensão limita o que um possível invasor pode explorar.
Busca() de origem cruzada
Uma extensão só pode usar fetch()
e XMLHttpRequest()
para receber recursos da extensão e de domínios especificados nas permissões. Observe que as chamadas para ambos são interceptadas pelo gerenciador fetch no 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
}
A extensão no exemplo acima solicita acesso a qualquer item 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 apenas para interagir com sites que atendem ao padrão de correspondência. O invasor só teria capacidade limitada para acessar "https://user_bank_info.com"
ou
interagir com "https://malicious_website.com"
.
Limitar campos de 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 depende.
Conectável externamente
Use o campo "externally_connectable"
para declarar com quais extensões e páginas da Web externas a extensão trocará informações. Restrinja 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 pela Web
Tornar os recursos acessíveis pela Web em "web_accessible_resources"
fará com que uma
extensão possa ser detectada 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 pela Web estiverem disponíveis, mais caminhos um possível invasor poderá explorar. Use o mínimo possível de arquivos.
Incluir uma Política de Segurança de Conteúdo com linguagem explícita
Inclua uma política de segurança de conteúdo para a extensão no manifesto, evitando ataques de scripting em vários sites. Se a extensão só carregar recursos sozinha, 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 um Web assembly ou aumentar as restrições em páginas no modo sandbox, elas podem 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
}
Evitar document.write() e innerHTML
Embora possa ser mais simples criar elementos HTML dinamicamente com document.write()
e innerHTML
,
ele deixa a extensão e as páginas da Web das quais a extensão depende, abertas a invasores que inserem
scripts maliciosos. Em vez disso, crie nós DOM manualmente 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 renderizador que a página da Web. Isso deixa os scripts de conteúdo vulneráveis ao vazamento de dados por ataques de canal lateral (por exemplo, Spectre) e de serem acessados por invasores 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 privilégios de extensão a scripts de conteúdo:
- Suponha que 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 scripts entre sites).
- Suponha que os dados enviados ao script de conteúdo possam vazar para a página da Web. Não envie dados confidenciais (por exemplo, segredos da extensão, dados de outras origens da Web, histórico de navegação) para scripts de conteúdo.
- Limitar o escopo das ações privilegiadas que podem ser acionadas por scripts de conteúdo. Não permita que os scripts de conteúdo acionem solicitações para URLs arbitrários ou transmitam argumentos arbitrários para as APIs de extensão (por exemplo, não permite a transmissão de URLs arbitrários para os métodos
fetch()
ouchrome.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 de dados recebidos e limpando todas as entradas.
Uma extensão só será registrada no runtime.onMessageExternal
se estiver aguardando comunicação de um site ou extensão externa. Sempre confirme se o remetente corresponde a uma
fonte 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 por meio do evento runtime.onMessage da própria extensão precisam ser examinadas para garantir que 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.");
});