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, viaPOST), 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çãoPOST, 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.
- 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.
- O WebView pode carregar o arquivo malicioso devido a
setAllowFileAccess(true). - Graças a
setJavaScriptEnabled(true)esetAllowFileAccessFromFileURLs(true), o JavaScript no arquivo malicioso (executando em um contextofile://) é capaz de acessar outros arquivos locais usando URLsfile://. - 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¶
- Determine o
minSdkVersiondo aplicativo. - Use uma ferramenta como semgrep para procurar referências a:
- a classe
WebView. - a classe
WebSettings. - o método
setJavaScriptEnabled. - os métodos
setAllowFileAccess,setAllowFileAccessFromFileURLsesetAllowUniversalAccessFromFileURLsda classeWebSettings.
- a classe
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:
setJavaScriptEnabledestiver explicitamente definido comotrue.setAllowFileAccessestiver explicitamente definido comotrue(ou não for usado quandominSdkVersion< 30, herdando o valor padrão,true).setAllowFileAccessFromFileURLsousetAllowUniversalAccessFromFileURLsestiver explicitamente definido comotrue(ou não for usado quandominSdkVersion< 16, herdando o valor padrão,true).
Aprovação:
O teste é aprovado se:
setJavaScriptEnabledestiver explicitamente definido comofalse.setAllowFileAccessestiver explicitamente definido comofalse(ou não for usado quandominSdkVersion>= 30, herdando o valor padrão,false).- Tanto
setAllowFileAccessFromFileURLsquantosetAllowUniversalAccessFromFileURLsestiverem explicitamente definidos comofalse(ou não forem usados quandominSdkVersion>= 16, herdando o valor padrão,false).
Mitigations¶
- Use Up-to-Date minSdkVersion
- Carregar Conteúdo de Arquivo com Segurança em um WebView
- Desativar JavaScript em WebViews
Demos¶
MASTG-DEMO-0032: Uso de WebViews que permitem acesso a arquivos locais com semgrep