Secuencia de comandos entre apps

Categoría de OWASP: MASVS-CODE: Calidad de código

Descripción general

Un WebView es un componente de navegador integrado en aplicaciones para Android que facilita la visualización de contenido web dentro de una app. Renderiza HTML, CSS y JavaScript dentro de la interfaz de usuario de la app.

La escritura de secuencias de comandos entre apps se asocia ampliamente con la ejecución de código malicioso en el contexto de una aplicación víctima. Para los fines de esta documentación, el tema se limitará específicamente a la inserción de código de JavaScript malicioso en un WebView vulnerable.

Cuando una app acepta JavaScript malicioso en un WebView sin la validación o desinfección suficientes, la aplicación es vulnerable a la escritura de secuencias de comandos entre apps.

Impacto

Las vulnerabilidades de escritura de secuencias de comandos entre apps se pueden aprovechar cuando el contenido de JavaScript controlado por el atacante se pasa al WebView de la app vulnerable sin validarse ni desinfectarse. Como resultado, el código de JavaScript que proporciona el atacante se ejecuta en el contexto del WebView de la aplicación víctima. Luego, el código de JavaScript malicioso puede usar los mismos permisos que la app víctima, lo que puede provocar el robo de datos sensibles del usuario y la apropiación de la cuenta.

Mitigaciones

Inhabilitar JavaScript

Si tu aplicación no requiere JavaScript, inhabilitarlo garantizará que no se convierta en una amenaza:

Kotlin

// Get the WebView Object
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings

// Disable JavaScript
webSettings.javaScriptEnabled = false

Java

// Get the WebView Object
WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();

// Disable JavaScript for the WebView
webSettings.setJavaScriptEnabled(false);

Si tu aplicación requiere JavaScript, asegúrate de que seas el propietario o controles cualquier JavaScript que se pase a WebView. Evita permitir que WebView ejecute JavaScript arbitrario. Consulta la guía en la siguiente sección.

Asegúrate de que solo se cargue el contenido esperado en WebView

Cuando uses métodos como shouldOverrideUrlLoading(), loadUrl() o evaluateJavascript(), asegúrate de que se verifiquen todas las URLs que se les pasen. Como se indicó anteriormente, cualquier JavaScript que se pase a WebView solo debe provenir de dominios esperados, por lo que es importante verificar lo que se está cargando.

Consulta la documentación de validación de entrada de OWASP y esta lista de tareas de seguridad de Android para WebViews para obtener buenos consejos y ejemplos.

Establece la configuración de acceso seguro a archivos para WebView

Asegurarse de que no se pueda acceder a los archivos puede evitar que se ejecute JavaScript arbitrario dentro de WebViews.Se debe tener en cuenta lo siguiente WebSettings cuando se protege el acceso a los archivos:

  • Inhabilita el acceso a los archivos. De forma predeterminada, setAllowFileAccess se establece en True en el nivel de API 29 y versiones anteriores, lo que permitirá el acceso a los archivos locales. En el nivel de API 30 y versiones posteriores, el valor predeterminado es False. Para asegurarte de que no se permita el acceso a los archivos, establece explícitamente setAllowFileAccess en False.
  • Inhabilita el acceso al contenido. El parámetro de configuración predeterminado de setAllowContentAccess es True. El acceso a la URL de contenido permite que WebView cargue contenido desde un proveedor de contenido instalado en el sistema. Si tu app no requiere acceso al contenido, establece setAllowContentAccess en False para evitar un posible uso inadecuado en caso de un ataque de escritura de secuencias de comandos entre apps.

  • kotlin kotlin webView.settings.javaScriptEnabled = false webView.settings.domStorageEnabled = true webView.settings.allowFileAccess = false webView.settings.allowContentAccess = false

  • java java webView.getSettings().setJavaScriptEnabled(false); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowContentAccess(false);

Habilitar la navegación segura

Habilita la Navegación segura en AndroidManifest.xml para analizar las URLs que se pasan a WebView en busca de dominios maliciosos o de suplantación de identidad (phishing).

<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
   android:value="true" />

Recursos