Skip to content

MASTG-TEST-0033: Teste para Objetos Java Expostos por meio de WebViews

Visão Geral

Para testar objetos Java expostos através de WebViews), verifique se o aplicativo possui WebViews com JavaScript habilitado e determine se a WebView está criando qualquer interface JavaScript, também conhecidas como "JavaScript Bridges". Por fim, verifique se um atacante poderia potencialmente injetar código JavaScript malicioso.

Análise Estática

O exemplo a seguir mostra como addJavascriptInterface é usado para conectar um objeto Java e JavaScript em uma WebView:

WebView webview = new WebView(this);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);

MSTG_ENV_008_JS_Interface jsInterface = new MSTG_ENV_008_JS_Interface(this);

myWebView.addJavascriptInterface(jsInterface, "Android");
myWebView.loadURL("http://example.com/file.html");
setContentView(myWebView);

No Android 4.2 (API level 17) e superiores, uma anotação @JavascriptInterface permite explicitamente que o JavaScript acesse um método Java.

public class MSTG_ENV_008_JS_Interface {

        Context mContext;

        /** Instancia a interface e define o contexto */
        MSTG_ENV_008_JS_Interface(Context c) {
            mContext = c;
        }

        @JavascriptInterface
        public String returnString () {
            return "Secret String";
        }

        /** Exibe um toast a partir da página web */
        @JavascriptInterface
        public void showToast(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }
}

É assim que você pode chamar o método returnString a partir do JavaScript — a string "Secret String" será armazenada na variável result:

var result = window.Android.returnString();

Com acesso ao código JavaScript, por meio de, por exemplo, um XSS armazenado ou um ataque MITM, um atacante pode chamar diretamente os métodos Java expostos.

Se addJavascriptInterface for necessário, considere o seguinte:

  • Apenas JavaScript fornecido com o APK deve ter permissão para usar as bridges, por exemplo, verificando a URL em cada método Java com bridge (via WebView.getUrl).
  • Nenhum JavaScript deve ser carregado a partir de endpoints remotos, por exemplo, mantendo a navegação de páginas dentro dos domínios do aplicativo e abrindo todos os outros domínios no navegador padrão (ex.: Chrome, Firefox).
  • Se necessário por motivos de legado (ex.: ter que suportar dispositivos antigos), defina pelo menos o nível mínimo de API como 17 no arquivo de manifesto do aplicativo (<uses-sdk android:minSdkVersion="17" />).

Análise Dinâmica

A análise dinâmica do aplicativo pode mostrar quais arquivos HTML ou JavaScript são carregados e quais vulnerabilidades estão presentes. O procedimento para explorar a vulnerabilidade começa com a produção de um payload JavaScript e sua injeção no arquivo que o aplicativo está solicitando. A injeção pode ser realizada por meio de um ataque MITM ou modificação direta do arquivo, se ele estiver armazenado em armazenamento externo. Todo o processo pode ser realizado via Drozer e weasel (o payload avançado de exploração da MWR), que pode instalar um agente completo, injetar um agente limitado em um processo em execução ou conectar um shell reverso como uma ferramenta de acesso remoto (RAT).

Uma descrição completa do ataque está incluída no artigo do blog "WebView addJavascriptInterface Remote Code Execution".