JS注入漏洞存在的Android版本:Android < 4.2
綜述:
Android的SDK中提供了一個WebView組件,用於在應用中嵌入一個瀏覽器來進行網頁瀏覽。WebView組件中的addJavascriptInterface方法用於實現本地Java和JavaScript的交互。這個方法可以通過js腳本在本地執行任意Java代碼,從而以當前用戶身份執行任意命令。
盡管Android官方已經提醒了此功能在訪問不可信網頁內容時存在嚴重安全風險,很多應用開發人員仍未意識到此問題,大量Android應用特別是瀏覽器應用受到此問題影響,可能被攻擊者利用來進行對Android移動終端進行網頁掛馬等惡意攻擊行為。
分析:
Android下很多應用在使用WebView訪問html頁面時都會調用addJavascriptInterface方法,這類應用程序一般都會有類似如下的代碼:
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進行界面展示,都有可能受到此問題的影響。
攻擊者可以通過誘使受害者打開惡意網頁、瀏覽惡意微博或者向受害者發送惡意郵件等方式來利用此漏洞,獲取用戶敏感信息、控制用戶系統。
應對方案:
APP研發者:
1. 確保只在訪問可信頁面數據時才使用addjavascriptInterface。
2. 在調用Java對象方法前對參數進行檢查,避免執行惡意操作。
3. 對於在4.2(API 17+)系統運行的應用,使用JavascriptInterface代替addjavascriptInterface。
4. 限制對於該接口的使用來源,只允許可信來源訪問該接口。例如使用WebViewClient中的shouldOverrideUrlLoading()來對加載的URL進行檢查。
APP使用者:
1. 關注應用廠商更新情況,盡快升級應用程序到最新版本。
2. 在廠商修補前,用戶應盡量避免使用應用瀏覽不可信的網頁鏈接和郵件。
Android 官方:
Android官方已提醒此功能是有安全風險的,在可能訪問不可信網頁內容時需要小心處理。
Android 4.2 (api 17)已經開始采用JavascriptInterface代替addjavascriptInterface。