# Fragment Injection漏洞杂谈

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-08-21T02:23:00Z
Canonical: https://wepostx.com/topics/991

> 乌云历史资料归档
>
> **原始作者：** 路人甲
> **原始编号：** superkieran-wooyundrops:721
> **原始发布时间：** 2015-08-21 10:23
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 背景

13年的时候，IBM的安全研究人员发现了1个Google框架层的漏洞Fragment注入漏洞，该漏洞可以导致Android手机的PIN码被重置，大家应该对图1不陌生。这个漏洞之后，业界对该漏洞的影响没有进一步的探讨，本文将对该漏洞进行进一步的探讨，欢迎拍砖。

![原文图片](/media/2016/06/ebe5052c48fda8c267bcc5ef2acc955b)

# 0x01 Fragment注入漏洞详情

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所示。

![原文图片](/media/2016/06/46f75ca18853dd4158e4c95817c8b0fe)

任何继承自PreferenceActivity并对外导出的组件，都会受到攻击。恶意app可以传:android:show_fragment这个extra值来指定要动态加载的类。在PreferenceActivity的context里，通过dalvik.system.PathClassLoader函数来动态加载类，由于没有对请求的app进行校验，恶意app可以动态加载有漏洞app里面的任何类（包括未导出类），使得恶意app可以访问有漏洞app的隐私信息。

# 0x02 Fragment注入漏洞利用

### 1.拒绝服务
由于通过该漏洞可以加载app里面的任何类，包括未导出类，如果未导出类对畸形消息处理不当，将会导致本地拒绝服务漏洞。下面以IRCCloud软件为例。
com.irccloud.android.activity.PreferencesActivity组件对外导出：

![原文图片](/media/2016/06/de8da9a033907dc96054fbf117cc1813)

com.irccloud.android.activity.PreferencesActivity组件继承自PreferenceActivity：

![原文图片](/media/2016/06/1d28145d7541bb055f82a3f8443f47d8)

由于没有对Fragment注入漏洞进行防御，可通过该漏洞加载app内任意不导出的组件。选择com.irccloud.android.fragment.ServerReorderFragment作为攻击目标：

![原文图片](/media/2016/06/6855fb2d2695319a39471e980befad36)

ServerReorderFragment没有对畸形消息进行处理，导致拒绝服务，见下图。

![原文图片](/media/2016/06/3a8592518749f5902fe9ad240cc699bc)

### 2.远程命令执行
由于现在很多组件都是基于Webview来展示页面，并且Fragment组件应用越来越广，以后将会有越来越多的Webview组件是基于Fragment来展示。由于Fragment注入漏洞可以加载app内任意未导出组件，如果基于Fragment的Webview组件存在addJavascriptInterface漏洞，将会导致远程命令执行漏洞。在市面上的app里找了下，发现很多Webview组件基于Fragment，但是继承自PreferenceActivity的组件是不导出的，因此下面将自己写个demo来验证下可行性。
MainActivity导出，并继承自PreferenceActivity。

![原文图片](/media/2016/06/93ae8b5d0b418cd5b5cc14a5e0a8c79a)

WebviewFragment导出js接口，并加载url。

![原文图片](/media/2016/06/fe4d21cefef321f6e8cadc08d9bd17f6)

利用Fragment Injection漏洞对WebviewFragment攻击。

![原文图片](/media/2016/06/cd4c42e8d9aab77ef555c79fadc91328)

通过Fragment Injection漏洞，WebviewFragment已加载恶意html，存在远程代码执行漏洞攻击，见图。

![原文图片](/media/2016/06/dcee3fb8bcc01dcc9f1b15f5628c86c8)

# 四、总结

由于可以加载app内的任意未导出组件，因此Fragment注入漏洞可攻击点还是挺多的。本文对Fragment注入漏洞进行抛砖引玉，希望大牛们能对该漏洞进一步开发。

## Replies
