Skip to content

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.

  1. 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.
  2. Graças ao setAllowUniversalAccessFromFileURLs(true), o JavaScript malicioso pode fazer solicitações para URIs content:// 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.
  3. 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

  1. Use uma ferramenta como semgrep para buscar referências a:
    • a classe WebView.
    • a classe WebSettings.
    • o método setJavaScriptEnabled.
    • o método setAllowContentAccess da classe WebSettings.
    • o método setAllowUniversalAccessFromFileURLs da classe WebSettings.
  2. 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:
    • setAllowContentAccess
    • setJavaScriptEnabled
    • setAllowUniversalAccessFromFileURLs
  • 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:

  • setJavaScriptEnabled está explicitamente definido como true.
  • setAllowContentAccess está explicitamente definido como true ou não é usado (herdando o valor padrão, true).
  • O método setAllowUniversalAccessFromFileURLs está explicitamente definido como true.

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:

  • setJavaScriptEnabled está explicitamente definido como false ou não é usado (herdando o valor padrão, false).
  • O método setAllowContentAccess está explicitamente definido como false.
  • O método setAllowUniversalAccessFromFileURLs está explicitamente definido como false.

Mitigations

Demos

MASTG-DEMO-0029: Usos de WebViews Permitindo Acesso a Conteúdo com semgrep