MASTG-TEST-0250: Referências a Content Provider Access em WebViews
Visão Geral¶
Este teste verifica referências ao acesso a Content Providers em WebViews, que é habilitado por padrão e pode ser desabilitado usando o método setAllowContentAccess na classe WebSettings. Se configurado incorretamente, isso pode introduzir riscos de segurança, como acesso não autorizado a arquivos e exfiltração de dados.
O código JavaScript teria acesso a quaisquer content providers no dispositivo, como:
- declarados pelo aplicativo, mesmo que não sejam exportados.
- declarados por outros aplicativos, somente se forem exportados e se não seguirem as melhores práticas recomendadas para restringir o acesso.
Consulte Acesso a Content Providers no WebView) para obter mais informações sobre o método setAllowContentAccess, os arquivos específicos que podem ser acessados e as condições sob as quais eles podem ser acessados.
Cenário de Ataque Exemplo:
Suponha que um aplicativo bancário use um WebView para exibir conteúdo dinâmico. Os desenvolvedores não definiram explicitamente o método setAllowContentAccess, então ele assume o valor padrão true. Além disso, o JavaScript está habilitado no WebView, assim como o método setAllowUniversalAccessFromFileURLs.
- Um invasor explora uma vulnerabilidade (como uma falha de XSS) para injetar JavaScript malicioso no WebView. Isso pode ocorrer por meio de um link comprometido ou malicioso que o WebView carrega sem validação adequada.
- Graças ao
setAllowUniversalAccessFromFileURLs(true), o JavaScript malicioso pode fazer solicitações para URIscontent://para ler arquivos armazenados localmente ou dados expostos por content providers. Até mesmo os content providers do aplicativo que não são exportados podem ser acessados, pois o código malicioso está sendo executado no mesmo processo e mesma origem do código confiável. - O script controlado pelo invasor exfiltra dados sensíveis do dispositivo para um servidor externo.
Nota 1: Não consideramos minSdkVersion, pois setAllowContentAccess assume como padrão true independentemente da versão do Android.
Nota 2: O atributo android:grantUriPermissions do provider é irrelevante neste cenário, pois não afeta o próprio aplicativo acessando seus próprios content providers. Ele permite que outros aplicativos acessem temporariamente URIs do provider, mesmo que restrições como atributos de permission ou android:exported="false" estejam definidas. Além disso, se o aplicativo usar um FileProvider, o atributo android:grantUriPermissions deve ser definido como true por definição (caso contrário, você receberá um SecurityException: Provider must grant uri permissions").
Nota 3: allowUniversalAccessFromFileURLs é crítico no ataque, pois relaxa as restrições padrão, permitindo que páginas carregadas de file:// acessem conteúdo de qualquer origem, incluindo URIs content://.
Se essa configuração não estiver habilitada, o seguinte erro aparecerá no logcat:
[INFO:CONSOLE(0)] "Access to XMLHttpRequest at 'content://org.owasp.mastestapp.provider/sensitive.txt'
from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported
for protocol schemes: http, data, chrome, https, chrome-untrusted.", source: file:/// (0)
Embora a solicitação fetch para o servidor externo ainda funcione, a recuperação do conteúdo do arquivo via content:// falhará.
Passos¶
- Use uma ferramenta como semgrep para buscar referências a:
- a classe
WebView. - a classe
WebSettings. - o método
setJavaScriptEnabled. - o método
setAllowContentAccessda classeWebSettings. - o método
setAllowUniversalAccessFromFileURLsda classeWebSettings.
- a classe
- Obtenha todos os content providers declarados no arquivo AndroidManifest.xml do aplicativo.
Observação¶
A saída deve conter:
- Uma lista de instâncias de WebView, incluindo os seguintes métodos e seus argumentos:
setAllowContentAccesssetJavaScriptEnabledsetAllowUniversalAccessFromFileURLs
- Uma lista de content providers declarados no arquivo AndroidManifest.xml do aplicativo.
Avaliação¶
Falha:
O teste falha se todas as seguintes condições forem verdadeiras:
setJavaScriptEnabledestá explicitamente definido comotrue.setAllowContentAccessestá explicitamente definido comotrueou não é usado (herdando o valor padrão,true).- O método
setAllowUniversalAccessFromFileURLsestá explicitamente definido comotrue.
Você deve usar a lista de content providers obtida na etapa de observação para verificar se eles manipulam dados sensíveis.
Nota: O método setAllowContentAccess definido como true não representa por si só uma vulnerabilidade de segurança, mas pode ser usado em combinação com outras vulnerabilidades para escalar o impacto de um ataque. Portanto, é recomendável defini-lo explicitamente como false se o aplicativo não precisar acessar content providers.
Aprovação:
O teste é aprovado se qualquer uma das seguintes condições for verdadeira:
setJavaScriptEnabledestá explicitamente definido comofalseou não é usado (herdando o valor padrão,false).- O método
setAllowContentAccessestá explicitamente definido comofalse. - O método
setAllowUniversalAccessFromFileURLsestá explicitamente definido comofalse.
Mitigations¶
- Carregar Conteúdo de Arquivo com Segurança em um WebView
- Desativar JavaScript em WebViews
- Desativar Acesso a Content Provider em WebViews
Demos¶
MASTG-DEMO-0029: Usos de WebViews Permitindo Acesso a Conteúdo com semgrep