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,
setAllowFileAccessse establece enTrueen 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 esFalse. Para asegurarte de que no se permita el acceso a los archivos, establece explícitamentesetAllowFileAccessenFalse. Inhabilita el acceso al contenido. El parámetro de configuración predeterminado de
setAllowContentAccessesTrue. 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, establecesetAllowContentAccessenFalsepara 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 = falsejava
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
- Documentación de la Navegación segura
- Referencia para desarrolladores de WebView
- Referencia para desarrolladores de WebSettings para WebView
- Documentación para desarrolladores de setAllowFileAccess
- Referencia para desarrolladores de setAllowContentAccess