Attaques WebView

Reading time: 6 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Guide sur les configurations et la sécurité de WebView

Aperçu des vulnérabilités de WebView

Un aspect critique du développement Android implique la gestion correcte des WebViews. Ce guide met en évidence les configurations clés et les pratiques de sécurité pour atténuer les risques associés à l'utilisation de WebView.

Exemple de WebView

AccĂšs aux fichiers dans WebViews

Par défaut, les WebViews permettent l'accÚs aux fichiers. Cette fonctionnalité est contrÎlée par la méthode setAllowFileAccess(), disponible depuis le niveau API Android 3 (Cupcake 1.5). Les applications avec la permission android.permission.READ_EXTERNAL_STORAGE peuvent lire des fichiers à partir du stockage externe en utilisant un schéma d'URL de fichier (file://path/to/file).

Fonctionnalités obsolÚtes : AccÚs universel et accÚs aux fichiers depuis des URL

  • AccĂšs universel depuis des URL de fichiers : Cette fonctionnalitĂ© obsolĂšte permettait des requĂȘtes inter-origines depuis des URL de fichiers, posant un risque de sĂ©curitĂ© significatif en raison des attaques XSS potentielles. Le paramĂštre par dĂ©faut est dĂ©sactivĂ© (false) pour les applications ciblant Android Jelly Bean et les versions plus rĂ©centes.
  • Pour vĂ©rifier ce paramĂštre, utilisez getAllowUniversalAccessFromFileURLs().
  • Pour modifier ce paramĂštre, utilisez setAllowUniversalAccessFromFileURLs(boolean).
  • AccĂšs aux fichiers depuis des URL de fichiers : Cette fonctionnalitĂ©, Ă©galement obsolĂšte, contrĂŽlait l'accĂšs au contenu d'autres URL de schĂ©ma de fichiers. Comme l'accĂšs universel, son paramĂštre par dĂ©faut est dĂ©sactivĂ© pour une sĂ©curitĂ© accrue.
  • Utilisez getAllowFileAccessFromFileURLs() pour vĂ©rifier et setAllowFileAccessFromFileURLs(boolean) pour dĂ©finir.

Chargement sécurisé de fichiers

Pour désactiver l'accÚs au systÚme de fichiers tout en accédant aux actifs et ressources, la méthode setAllowFileAccess() est utilisée. Avec Android R et versions ultérieures, le paramÚtre par défaut est false.

  • VĂ©rifiez avec getAllowFileAccess().
  • Activez ou dĂ©sactivez avec setAllowFileAccess(boolean).

WebViewAssetLoader

La classe WebViewAssetLoader est l'approche moderne pour charger des fichiers locaux. Elle utilise des URL http(s) pour accĂ©der aux actifs et ressources locaux, s'alignant sur la politique de mĂȘme origine, facilitant ainsi la gestion CORS.

loadUrl

C'est une fonction courante utilisée pour charger des URL arbitraires dans un webview :

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

Bien sĂ»r, un attaquant potentiel ne devrait jamais ĂȘtre en mesure de contrĂŽler l'URL qu'une application va charger.

Gestion de JavaScript et des Intent Schemes

  • JavaScript : DĂ©sactivĂ© par dĂ©faut dans les WebViews, il peut ĂȘtre activĂ© via setJavaScriptEnabled(). La prudence est de mise car activer JavaScript sans protections appropriĂ©es peut introduire des vulnĂ©rabilitĂ©s de sĂ©curitĂ©.
  • Intent Scheme : Les WebViews peuvent gĂ©rer le schĂ©ma intent, ce qui peut conduire Ă  des exploits s'il n'est pas gĂ©rĂ© avec soin. Une vulnĂ©rabilitĂ© d'exemple impliquait un paramĂštre WebView exposĂ© "support_url" qui pouvait ĂȘtre exploitĂ© pour exĂ©cuter des attaques de cross-site scripting (XSS).

Vulnerable WebView

Exemple d'exploitation utilisant adb :

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

Javascript Bridge

Une fonctionnalité est fournie par Android qui permet à JavaScript dans un WebView d'invoquer des fonctions d'application Android natives. Cela est réalisé en utilisant la méthode addJavascriptInterface, qui intÚgre JavaScript avec les fonctionnalités natives d'Android, appelée WebView JavaScript bridge. Une prudence est conseillée car cette méthode permet à toutes les pages dans le WebView d'accéder à l'objet JavaScript Interface enregistré, posant un risque de sécurité si des informations sensibles sont exposées à travers ces interfaces.

  • Une extrĂȘme prudence est requise pour les applications ciblant les versions Android infĂ©rieures Ă  4.2 en raison d'une vulnĂ©rabilitĂ© permettant l'exĂ©cution de code Ă  distance via du JavaScript malveillant, exploitant la rĂ©flexion.

Implementing a JavaScript Bridge

  • Les interfaces JavaScript peuvent interagir avec le code natif, comme le montrent les exemples oĂč une mĂ©thode de classe est exposĂ©e Ă  JavaScript :
javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridge est activĂ© en ajoutant une interface au WebView :
javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload()
  • L'exploitation potentielle via JavaScript, par exemple, par le biais d'une attaque XSS, permet d'appeler des mĂ©thodes Java exposĂ©es :
html
<script>
alert(javascriptBridge.getSecret())
</script>
  • Pour attĂ©nuer les risques, limitez l'utilisation du pont JavaScript au code expĂ©diĂ© avec l'APK et empĂȘchez le chargement de JavaScript Ă  partir de sources distantes. Pour les appareils plus anciens, dĂ©finissez le niveau API minimum Ă  17.

Exécution de Code à Distance Basée sur la Réflexion (RCE)

  • Une mĂ©thode documentĂ©e permet d'atteindre le RCE par rĂ©flexion en exĂ©cutant une charge utile spĂ©cifique. Cependant, l'annotation @JavascriptInterface empĂȘche l'accĂšs non autorisĂ© aux mĂ©thodes, limitant ainsi la surface d'attaque.

DĂ©bogage Ă  Distance

  • Le dĂ©bogage Ă  distance est possible avec Chrome Developer Tools, permettant l'interaction et l'exĂ©cution arbitraire de JavaScript dans le contenu WebView.

Activation du DĂ©bogage Ă  Distance

  • Le dĂ©bogage Ă  distance peut ĂȘtre activĂ© pour tous les WebViews au sein d'une application en :
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • Pour activer le dĂ©bogage de maniĂšre conditionnelle en fonction de l'Ă©tat dĂ©bogable de l'application :
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Exfiltrer des fichiers arbitraires

  • DĂ©monstration de l'exfiltration de fichiers arbitraires en utilisant 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)

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks