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);
}
}
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