WebView是Android平台下的一個重要組件,通常用來在Activity中嵌入一個簡單的瀏覽器,實現在線網頁瀏覽的功能。比如下面代碼實現訪問Google頁面:
WebView webView = new WebView (R.id.webView1); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("http://www.google.com");
為了與Web頁面實現動態交互,Android應用程序允許WebView通過WebView.addJavascriptInterface接口向Web頁面注入Java對象,頁面Javascript腳本可直接引用該對象並調用該對象的方法。
這類應用程序一般都會有類似如下的代碼:
webView.addJavascriptInterface(javaObj, "jsObj");
此段代碼將javaObj對象暴露給js腳本,可以通過jsObj對象對其進行引用,調用javaObj的方法。
結合Java的反射機制可以通過js腳本執行任意Java代碼,相關代碼如下:
<script> function execute(cmdArgs) { return jsobj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs); } execute(someCmd); </script>
當受影響的應用程序執行到上述腳本的時候,就會執行someCmd指定的命令。
Android系統下許多應用程序(瀏覽器,微博等)使用webView進行界面展示,都有可能受到此問題的影響。
攻擊者可以通過誘使受害者打開惡意網頁、瀏覽惡意微博或者向受害者發送惡意郵件等方式來利用此漏洞,獲取用戶敏感信息、控制用戶系統。
在Android <=4.1.2 (API 16),WebView使用WebKit瀏覽器引擎,並未正確限制addJavascriptInterface的使用方法,在應用權限范圍內,攻擊者可以通過Java反射機制實現任意命令執行。
在Android >=4.2 (API 17),WebView使用Chromium瀏覽器引擎,並且限制了Javascript對Java對象方法的調用權限,只有聲明了@JavascriptInterace注解的方法才能被Web頁面調用。