BrowExt - permissions & host_permissions

Support HackTricks

Informações Básicas

permissions

As permissões 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 ou Armazenamento Físico):

O manifesto anterior declara que a extensão requer a permissão storage. Isso significa que ela pode usar a API de armazenamento 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 armazenamento 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 lista completa de permissões que uma Extensão do Navegador Chromium pode solicitar aqui e uma lista completa para extensões do Firefox aqui.

host_permissions

A configuração opcional, mas poderosa, host_permissions indica com quais hosts a extensão poderá interagir por meio de APIs como cookies, webRequest e tabs.

As seguintes host_permissions basicamente permitem todos os 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 do navegador chama fetch("https://gmail.com/"), não está restrita pelo CORS.

Abusando permissions e host_permissions

Abas

Além disso, host_permissions também desbloqueia a funcionalidade “avançada” da API de abas. 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 descubra qual página da web (ou seja, endereço e título) está carregada.

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

Executando scripts de conteúdo

Scripts de conteúdo não precisam ser necessariamente escritos estaticamente no manifesto da extensão. Dadas permissões host_permissions suficientes, as extensões também podem carregá-los dinamicamente chamando tabs.executeScript() ou scripting.executeScript().

Ambas as APIs permitem executar não apenas arquivos contidos nas extensões como scripts de conteúdo, mas também código arbitrário. A primeira permite passar código JavaScript como uma string, enquanto a última espera uma função JavaScript, que é menos propensa a vulnerabilidades de injeção. No entanto, ambas as APIs causarão estragos se forem mal utilizadas.

Além das capacidades acima, scripts de conteúdo poderiam, por exemplo, interceptar credenciais à medida que são inseridas em páginas da web. Outra maneira clássica de abusar delas é injetar publicidade em cada site. Adicionar mensagens de golpe para abusar da credibilidade de sites de notícias também é possível. Finalmente, eles poderiam manipular sites bancários para redirecionar transferências de dinheiro.

Privilégios implícitos

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

Parece inofensivo? A API tabs.create() é um pouco menos. Ela pode ser usada para criar uma nova aba, essencialmente a mesma que window.open(), que pode ser chamada por qualquer site. No entanto, enquanto window.open() está sujeito ao bloqueador de pop-ups, tabs.create() não está.

Uma extensão pode criar qualquer número de abas sempre que 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 esta API, o Chrome não tem tal proteção. O uso de tais URIs no nível superior foi proibido devido a abusos para phishing.

tabs.update() é muito semelhante a tabs.create(), mas 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 pode ativar a aba correspondente também.

Webcam, geolocalização e amigos

Você provavelmente sabe que os sites podem solicitar permissões especiais, por exemplo, para acessar sua webcam (ferramentas de videoconferência) ou localização geográfica (mapas). São recursos com considerável potencial para abuso, então os usuários têm que confirmar a cada vez que ainda desejam isso.

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

Normalmente, uma extensão fará isso imediatamente após ser instalada. Uma vez que este aviso é aceito, o acesso à webcam é possível a qualquer momento, mesmo que o usuário não esteja interagindo com a extensão neste momento. Sim, um usuário só aceitará este aviso se a extensão realmente precisar de acesso à webcam. Mas depois disso, eles têm que confiar na extensão para não gravar nada secretamente.

Com acesso à sua localização geográfica exata ou conteúdos da sua área de transferência, conceder permissão explicitamente é desnecessário. Uma extensão simplesmente adiciona geolocation ou clipboard à entrada de permissões de seu manifesto. Esses privilégios de acesso são então concedidos implicitamente quando a extensão é instalada. Assim, uma extensão maliciosa ou comprometida com esses privilégios pode criar seu perfil de movimento ou monitorar sua área de transferência para senhas copiadas sem que você perceba nada.

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

A permissão bookmarks tem um potencial de abuso semelhante, pois permite ler todos os favoritos via a API de favoritos.

Permissão de armazenamento

O armazenamento da extensão é apenas uma coleção de chave-valor, muito semelhante ao localStorage que qualquer site poderia usar. Portanto, nenhuma informação sensível deve ser armazenada aqui.

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

Mais permissões

Você pode encontrar a lista completa de permissões que uma Extensão de Navegador Chromium pode solicitar aqui e uma lista completa para extensões Firefox aqui.

Prevenção

A política do desenvolvedor do Google proíbe explicitamente extensões de solicitar mais privilégios do que o necessário para sua funcionalidade, mitigando efetivamente solicitações excessivas de permissões. Um exemplo onde uma extensão de navegador ultrapassou esse limite envolveu sua distribuição com o próprio navegador, em vez de através de uma loja de complementos.

Os navegadores poderiam ainda restringir o uso indevido de privilégios de extensão. 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 através da interação direta do usuário, como clicar no ícone da extensão, enquanto desktopCapture requer confirmação do usuário para a janela ser gravada, prevenindo atividades de gravação clandestina.

No entanto, o endurecimento das medidas de segurança muitas vezes resulta em menor flexibilidade e facilidade de uso das extensões. A permissão activeTab ilustra essa troca. Ela foi introduzida para eliminar a necessidade de extensões solicitarem privilégios de host em toda a internet, permitindo que extensões acessem apenas a aba atual mediante ativação explícita pelo usuário. Este modelo é eficaz para extensões que requerem ações iniciadas pelo usuário, mas falha para aquelas que requerem ações automáticas ou preventivas, comprometendo assim a conveniência e a capacidade de resposta imediata.

Referências

Support HackTricks

Last updated