Skip to content

MASTG-TEST-0252: Referências de Acesso a Arquivos Locais em WebViews

Visão Geral

Este teste verifica referências a métodos da classe WebSettings utilizados por WebViews do Android que permitem carregar conteúdo de várias fontes, incluindo arquivos locais)). Se configurados inadequadamente, esses métodos podem introduzir riscos de segurança, como acesso não autorizado a arquivos e exfiltração de dados. Esses métodos são:

  • setAllowFileAccess: permite que o WebView carregue arquivos locais do armazenamento interno ou externo do aplicativo.
  • setAllowFileAccessFromFileURLs: permite que o JavaScript dentro desses arquivos locais acesse outros arquivos locais.
  • setAllowUniversalAccessFromFileURLs: remove quaisquer restrições de origem cruzada, permitindo que esse JavaScript leia dados entre origens. O JavaScript sempre pode enviar dados para qualquer origem (por exemplo, via POST), independentemente dessa configuração; esta configuração afeta apenas a leitura de dados (por exemplo, o código não obteria uma resposta a uma solicitação POST, mas os dados ainda seriam enviados).

Quando essas configurações são combinadas, elas podem permitir um ataque no qual um arquivo HTML malicioso obtém privilégios elevados, acessa recursos locais e exfiltra dados pela rede, efetivamente contornando os limites de segurança normalmente impostos pela política de mesma origem.

Embora esses métodos tenham padrões seguros e estejam preteridos no Android 10 (nível de API 29) e versões posteriores, eles ainda podem ser explicitamente definidos como true ou seus padrões inseguros podem ser usados em aplicativos que executam em versões mais antigas do Android (devido ao seu minSdkVersion).

Consulte Configurações de Acesso a Arquivos Locais do WebView do Android)) para obter mais informações sobre esses métodos (valores padrão, status de preterição, implicações de segurança), 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, e os desenvolvedores habilitaram todas as três configurações inseguras. Além disso, o JavaScript está habilitado no WebView.

  1. Um invasor injeta um arquivo HTML malicioso no dispositivo (via phishing ou outra exploração) em um local que o invasor sabe que o WebView acessará (por exemplo, graças à engenharia reversa). Por exemplo, um arquivo HTML usado para exibir os termos e condições do aplicativo.
  2. O WebView pode carregar o arquivo malicioso devido a setAllowFileAccess(true).
  3. Graças a setJavaScriptEnabled(true) e setAllowFileAccessFromFileURLs(true), o JavaScript no arquivo malicioso (executando em um contexto file://) é capaz de acessar outros arquivos locais usando URLs file://.
  4. O script controlado pelo invasor exfiltra dados sensíveis do dispositivo para um servidor externo.

Nota 1: setAllowFileAccessFromFileURLs ou setAllowUniversalAccessFromFileURLs devem estar definidos como true para que o ataque funcione. Se ambas as configurações estiverem definidas como false, o seguinte erro aparecerá no logcat:

[INFO:CONSOLE(0)] "Access to XMLHttpRequest at 'file:///data/data/org.owasp.mastestapp/files/api-key.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)
[INFO:CONSOLE(31)] "File content sent successfully.", source: file:/// (31)

E o servidor não receberia o conteúdo do arquivo:

[*] Received POST data from 127.0.0.1:

Error reading file: 0

Nota 2: Conforme indicado na documentação do Android, o valor de setAllowFileAccessFromFileURLs é ignorado se allowUniversalAccessFromFileURLs=true.

Passos

  1. Determine o minSdkVersion do aplicativo.
  2. Use uma ferramenta como semgrep para procurar referências a:
    • a classe WebView.
    • a classe WebSettings.
    • o método setJavaScriptEnabled.
    • os métodos setAllowFileAccess, setAllowFileAccessFromFileURLs e setAllowUniversalAccessFromFileURLs da classe WebSettings.

Observe que, neste caso, a falta de referências aos métodos setAllow* é especialmente interessante e deve ser capturada, porque pode significar que o aplicativo está usando os valores padrão, que em alguns cenários são inseguros. Por esse motivo, é altamente recomendável tentar identificar todas as instâncias de WebView no aplicativo.

Observação

A saída deve conter uma lista de instâncias de WebView onde os métodos mencionados acima são utilizados.

Avaliação

A avaliação deste teste é baseada no comportamento da API em diferentes versões do Android)).

Falha:

O teste falha se:

  • setJavaScriptEnabled estiver explicitamente definido como true.
  • setAllowFileAccess estiver explicitamente definido como true (ou não for usado quando minSdkVersion < 30, herdando o valor padrão, true).
  • setAllowFileAccessFromFileURLs ou setAllowUniversalAccessFromFileURLs estiver explicitamente definido como true (ou não for usado quando minSdkVersion < 16, herdando o valor padrão, true).

Aprovação:

O teste é aprovado se:

  • setJavaScriptEnabled estiver explicitamente definido como false.
  • setAllowFileAccess estiver explicitamente definido como false (ou não for usado quando minSdkVersion >= 30, herdando o valor padrão, false).
  • Tanto setAllowFileAccessFromFileURLs quanto setAllowUniversalAccessFromFileURLs estiverem explicitamente definidos como false (ou não forem usados quando minSdkVersion >= 16, herdando o valor padrão, false).

Mitigations

Demos

MASTG-DEMO-0032: Uso de WebViews que permitem acesso a arquivos locais com semgrep