首页
社区
课程
招聘
[翻译]Android框架层漏洞-Fragment注入
发表于: 2014-1-5 21:35 17623

[翻译]Android框架层漏洞-Fragment注入

2014-1-5 21:35
17623

原文:A New Vulnerability in the Android Framework: Fragment Injection
出处:http://securityintelligence.com/new-vulnerability-android-framework-fragment-injection/#comments
作者:Roee Hay,IBM Application Security Research Team
时间:2013.12.10

    最近我们给Android安全团队揭露了一个新的漏洞,该漏洞影响了许多应用程序,包括 设置(所有Android设备上的Settings),Gmail,Google Now,DropBox和Evernote。更准确的说,任何应用扩展PreferenceActivity类时使用 exported activity都是危险的。现在Android 4.4 KitKat已经提供了补丁.如果你想知道为什么你的代码出现问题,可以参考Android KitKat补丁中需要应用更换的新方法PreferenceActivity.isValidFragment,该方法现已添加到了Android框架.

    在这篇文章中,我们先开始简短介绍Android和沙箱相关知识,然后再深入到漏洞本身。为了简单起见,我们省略了一些细节,详细可以观看白皮书。

一,Android应用程序的UI构建块

    Android应用的UI由activities组成。一个activity提供了一个单一的屏幕和一些功能(例如:浏览器的书签管理器)。一个Fragment  可以被认为是sub-activity,这是应用程序UI的一个小部分。Fragments能够灵活的允许在不同的activities重用。当一个Fragment实例在Activity里面驻留耦合时,不同实例可以嵌入到不同的Activity中。图1即Activity和Fragment的关系。



图1:Fragment和activity的关系

二,Android沙盒,权限,Inter-app通信和恶意程序攻击

    Android系统中,应用程序是相互孤立并且受制于他们声明的权限运行于沙盒中。通常应用是不能正常访问其他程序的敏感数据。但也就是说,通过其他方式应用还是可以调用其他应用组件(如 activities)特征重用。例如,谷歌Chrome浏览器调用Google play应用打开Google play URLs。这个调用使用 Intents即IPC对象从源应用程序传递到相应的API。 Intents不只是指定目标,他们在其他两个地方也包含了数据。第一个位置是data属性(URI类型),第二个是一个字典(Bundle)可以包含任意数量的信息(也称为Intent extras)。如果Activities在应用程序的manifest文件(ApplicationManifest.xml)中声明exported,则其可以被外部应用调用,即此形成了一个activity公开(exported)创建的Android沙箱潜在突破口。当Activities访问输入Intent的数据时,一个恶意的应用可以调用exported的activity并为其提供恶意数据,如果数据不正确santizied(santizied不理解)或未经目标应用的验证,则可能会触发漏洞。而Fragment可以接收通过访问嵌入activity的输入,即Intent或Fragment-specific参数。图2为攻击大概。



图2:攻击exported activities.

三,PreferenceActivity

    PreferenceActivity是Android框架提供的基类,用来显示用户偏好的层次结构,偏好与PreferenceFragment相关联。PreferenceActivity占用少量Intent extras,其中一个是:android:show_fragment,用来告诉PreferenceActivity要先显示哪些fragment。动态Fragment的加载是通过开始于创建activity、结束在Fragment.instantiate的调用链实现的(见图3、4),随之加载使用Java Reflection API的Fragment。

Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
   String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
   Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
 
   if (savedInstanceState != null) {
 
   } else {
       if (initialFragment != null && mSinglePane) {
           // If we are just showing a fragment, we want to run in
           // new fragment mode, but don't need to compute and show
           // the headers.
           switchToHeader(initialFragment, initialArguments);
 
        } else {
 
           if (mHeaders.size() > 0) {
               if (!mSinglePane) {
                   if (initialFragment == null) {
 
                   } else {
                      switchToHeader(initialFragment, initialArguments);
                   }
               }
           }
       }
   }    
 
}
 
public void switchToHeader(String fragmentName, Bundle args) {
   setSelectedHeader(null);
   switchToHeaderInner(fragmentName, args, 0);
}
 
private void switchToHeaderInner(String fragmentName, Bundle args, int direction) {
   getFragmentManager().popBackStack(BACK_STACK_PREFS,
                                     FragmentManager.POP_BACK_STACK_INCLUSIVE);
   Fragment f = Fragment.instantiate(this, fragmentName, args);
   FragmentTransaction transaction = getFragmentManager().beginTransaction();
   transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
   transaction.replace(com.android.internal.R.id.prefs, f);
   transaction.commitAllowingStateLoss();
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (16)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
扫了一眼,略没看懂。明天上班继续看
2014-1-5 22:41
0
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
3
很意外能看到这篇译文。

简单地说,任何第三方应用,继承实现了PreferenceActivity的activity,是暴露的,有组件暴露类型的漏洞。进一步地,通过构造extra,可以要求PreferenceActivity调用该应用内任何class(无论是否public),并进一步通过构造extra进行其他的攻击。这个问题说大不大、说小不小,关键还看调用哪个类,以及通过extra能控制哪些东西。

翻译得有点涩,楼主继续加油~
2014-1-5 22:50
0
雪    币: 28
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
外语一直是弱项,不过考虑到很多最新资料都只有英文的,还是硬着头皮试着翻了过来,描述不明确的确实抱歉了。。
2014-1-6 09:26
0
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
5
别抱歉XDD。读英文是第一步,翻译出来是第二步,发出来是第三步,LZ已经做得非常好了~
2014-1-6 10:02
0
雪    币: 245
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼主分享
2014-1-6 10:16
0
雪    币: 28
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
以前学通信电子的,linux接触不多,android更是才接触不到半年,所以好多东西都不是太了解,虽然单片机arm还不算陌生,但逆向依然卡在so层了,进展缓慢就试着翻译一下了。外语确实很渣,在学校里面就专挂这个
2014-1-6 11:20
0
雪    币: 159
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
如果没记错    大概一个月前就把POC写出来了    原理搞清楚   POC显得太简单了
2014-1-6 22:53
0
雪    币: 116
活跃值: (70)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
9
感觉关键还是在exported上
2014-1-7 15:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢分享了。学习下。
2014-1-7 18:13
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看着不错,先收藏
2014-1-7 21:13
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
很不错。很喜欢看Android的文章
2014-1-8 13:44
0
雪    币: 5
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark mark
2014-1-8 22:18
0
雪    币: 838
活跃值: (2827)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
14
看不懂,mark下
2014-1-9 10:26
0
雪    币: 3
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
谢谢分享,这个漏洞可能好多版本的系统都有。。。
2014-1-10 11:18
0
雪    币: 466
活跃值: (175)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
16
很有用。期待大牛出 利用方案。
2014-1-11 00:18
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
各位大牛,普通的acticity就可以避免fragment注入了吗?源码中做了哪种判断呢?
2020-3-12 15:56
0
游客
登录 | 注册 方可回帖
返回
//