Webview loadurl injection
Injection dans loadurl d'un WebView
Description
Webview.loadurl charge une URL donnée dans une session de WebView. L'URL du WebView accepte différents schémas et chemins pouvant conduire au chargement de contenu non sécurisé, à des attaques de phishing ou, dans certains cas, à l'exploitation d'une vulnérabilité d'exécution de code à distance (RCE).
Plusieurs paramètres contrôlent les capacités de la session du WebView, tels que l'activation de JavaScript ou l'accès aux fichiers locaux via la classe Websettings.
Les attaquants peuvent exploiter la vulnérabilité en créant du HTML ou du JavaScript malveillant. Une attaque de phishing peut se faire passer pour un faux formulaire de connexion afin de voler les identifiants de l'utilisateur.
Voici un exemple de code Java vulnérable qui accepte une URL non fiable provenant d'un Intent :
public class VulnerableBrowserActivity extends Activity {
@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Create a new wevbiew session.
WebView webView = (WebView) findViewById(R.id.webview);
// Enable javascript.
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
// Accept url from untrusted intent.
String url = getIntent().getStringExtra("URL");
webView.loadUrl(url);
}
}
Recommandation
Toutes les URL non fiables doivent faire l'objet d'une validation d'entrée appropriée pour garantir que seul le contenu de confiance est accessible. Par exemple, si l'application charge des ressources locales, la liste des URL chargées doit figurer sur une liste blanche (whitelist).
Les paramètres du Webview doivent également être renforcés en supprimant tous les paramètres non requis, tels que JavaScript ou l'accès aux fichiers.
public class WhitelistBrowserActivity extends Activity {
private static WHITELISTED_URLS = ImmutableList.of(
"url1",
"url2");
@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.webview);
String url = getIntent().getStringExtra("url");
if (!WHITELISTED_URLS.contains(url)) { /* Note: "https".startsWith("http") == true */
url = "about:blank";
}
webView.loadUrl(url);
}
}
```dart
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter/material.dart';
class SafeWebViewWidget extends StatelessWidget {
final String untrustedUrl;
static const List
SafeWebViewWidget({required this.untrustedUrl});
@override Widget build(BuildContext context) { // Valider l'URL entrante par rapport à la liste d'autorisation String safeUrl = "about:blank"; if (WHITELISTED_URLS.contains(untrustedUrl)) { safeUrl = untrustedUrl; }
return InAppWebView(
initialUrlRequest: URLRequest(url: WebUri(safeUrl)),
initialSettings: InAppWebViewSettings(
// Renforcer les paramètres en désactivant les fonctionnalités non strictement requises
javaScriptEnabled: false,
allowFileAccess: false,
allowFileAccessFromFileURLs: false,
allowUniversalAccessFromFileURLs: false,
),
);
} } ```
Liens
- DRD02-J. Do not allow WebView to access sensitive local resource through file scheme
- Webview loadurl (Android documentation)
- Websettings (Android documentation)
Normes
- OWASP_MASVS_L1:
- MSTG_PLATFORM_7
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_7
- MSTG_PLATFORM_2
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- MASVS_PLATFORM_2
- SOC2_CONTROLS:
- CC_2_1
- CC_3_4
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- OWASP_MOBILE_TOP_10:
- M4_2024