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所示。
任何繼承自PreferenceActivit
y并對外導出的組件,都會受到攻擊。惡意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
注入漏洞進行拋磚引玉,希望大牛們能對該漏洞進一步開發。