13年的時候,IBM的安全研究人員發現了1個Google框架層的漏洞Fragment注入漏洞,該漏洞可以導致Android手機的PIN碼被重置,大家應該對圖1不陌生。這個漏洞之后,業界對該漏洞的影響沒有進一步的探討,本文將對該漏洞進行進一步的探討,歡迎拍磚。

Android Framework提供了android.preference.PreferenceActivity這個類來對preference進行展示,我們可以繼承這個類來展示preference,并進行擴展。基類中會接收Intent數據,并進行一定檢查,其中兩個比較重要:
PreferenceActivity.EXTRA_SHOW_FRAGMENT (’:android:show_fragment’) and PreferenceActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS (’:android:show_fragment_arguments’)。第一個extra域包含PreferenceActivity要動態加載的Fragment,第二個extra域包含傳給該Fragment的參數。Fragment也可以通過Fragment.getActivity這個函數來獲取傳進來的參數。PreferenceActivity會調用Fragment.instantiate來動態加載Fragment.這個函數通過反射來加載Fragment,并把它變成Fragment對象。如圖2所示。

任何繼承自PreferenceActivity并對外導出的組件,都會受到攻擊。惡意app可以傳:android:show_fragment這個extra值來指定要動態加載的類。在PreferenceActivity的context里,通過dalvik.system.PathClassLoader函數來動態加載類,由于沒有對請求的app進行校驗,惡意app可以動態加載有漏洞app里面的任何類(包括未導出類),使得惡意app可以訪問有漏洞app的隱私信息。
由于通過該漏洞可以加載app里面的任何類,包括未導出類,如果未導出類對畸形消息處理不當,將會導致本地拒絕服務漏洞。下面以IRCCloud軟件為例。
com.irccloud.android.activity.PreferencesActivity組件對外導出:

com.irccloud.android.activity.PreferencesActivity組件繼承自PreferenceActivity:

由于沒有對Fragment注入漏洞進行防御,可通過該漏洞加載app內任意不導出的組件。選擇com.irccloud.android.fragment.ServerReorderFragment作為攻擊目標:

ServerReorderFragment沒有對畸形消息進行處理,導致拒絕服務,見下圖。

由于現在很多組件都是基于Webview來展示頁面,并且Fragment組件應用越來越廣,以后將會有越來越多的Webview組件是基于Fragment來展示。由于Fragment注入漏洞可以加載app內任意未導出組件,如果基于Fragment的Webview組件存在addJavascriptInterface漏洞,將會導致遠程命令執行漏洞。在市面上的app里找了下,發現很多Webview組件基于Fragment,但是繼承自PreferenceActivity的組件是不導出的,因此下面將自己寫個demo來驗證下可行性。
MainActivity導出,并繼承自PreferenceActivity。

WebviewFragment導出js接口,并加載url。

利用Fragment Injection漏洞對WebviewFragment攻擊。

通過Fragment Injection漏洞,WebviewFragment已加載惡意html,存在遠程代碼執行漏洞攻擊,見圖。

由于可以加載app內的任意未導出組件,因此Fragment注入漏洞可攻擊點還是挺多的。本文對Fragment注入漏洞進行拋磚引玉,希望大牛們能對該漏洞進一步開發。