broadany漏洞利用研究_第1页
broadany漏洞利用研究_第2页
broadany漏洞利用研究_第3页
broadany漏洞利用研究_第4页
免费预览已结束,剩余9页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Broadanywhere 漏洞利用研究一、 Account 管理机制从 Android2.0 开始,系统引入了 Account 管理机制, Account 管理机制提供了集中化管理帐户 API 以及安全用户口令和令牌的功能。系统中,可以同时多个帐户(设置添加帐户可以查看),比如、Miscrosoft Exchange、支付宝、等等。Account 机制涉及 AuthenticationService 和 Client 两个组成元素,它们之间的的通讯统一由AccountManagerService 调度,AccountManagerService 是 Android 上的一个系统服务。而给开发

2、者的接口是 AccountManager。当 Client 首次使用时,会向 AuthenticationService发起 addAccount 请求,示意图如下:普通应用(记为 AppA)去请求添加某类账户时,会调用 AccountManager.addAccount,然后AccountManager 会去查找提供账号的应用(记为 AppB)的 Authenticator 类,调用 Authenticator.addAccount;AppA 再根据 AppB 返回的 Intent 去调起 AppB 的账户登录界面。二、关于 System 用户在 Android 中,系统用户拥有很高的权限,

3、通过阅读系统源码ActivityManagerService.java 中的ActivityManagerService.checkComponentPermission 函数可以发现,system 用户可以完全无视权限检查,不管组件是否为 exported,最后都直接返回 PERMISSION_GRANTED。即拥有系统权限的用户几乎可以调用所有的组件。关键的代码如下:三、关于 android 系统的 Intent 机制Intent 是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过 Intent,你的程序可以向 Android 表达某种请

4、求或者意愿,Android 会根据意愿的内容选择适当的组件来完成请求。比一个 Activity 希望打开网页浏览器查看某一网页的内容,那么这个Activity 只需要发出WEB_SEARCH_ACTION 给Android,Android 就会根据Intent的请求内容各组件时的IntentFilter,找到网页浏览器的Activity 来浏览网页。Android 的三个基本组件,Activity,Service 和 Broadcast Receiver 都是通过 Intent 机制激活的,不同类型的组件有不同的传递 Intent 方式:1、要激活一个新的 Activity,或者让一个现有的

5、Activity 做新的操作,可以通过调用Context.startActivity()或者 Activity.startActivityForResult()。2、要启动一个新的 Service,或者向一个已有的 Service 传递新的指令,调用Context.startService()或者调用 Context.bindService()将调用此的上下文对象与 Service 绑定。3、Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个可以Broadcast Intent

6、。之后,所有已注册的并且拥有与之相匹配 IntentFilter 的 BroadcastReceiver 就会被激活。Intent 一旦发出,Android 都会准确找到相匹配的一个或多个 Activity,Service 或者BroadcastReceiver 作响应。所以,不同类型的Intent 消息出现重叠,即Broadcast 的Intent消息只会给 BroadcastReceiver,而决给 Activity 或者 Service。由startActivity()传递的消息也只会发给 Activity,由 startService()传递的 Intent 只会给 Service。I

7、ntent 主要由如下几个部分的1、 Action:用来指明要实施的动作是什么,比如说 ACTION_VIEW, ACTION_EDIT 等。一些常用的 Action: ACTION_CALL activity 启动一个。ACTION_EDIT activity 显示用户编辑的数据。ACTION_MAIN activity 作为 Task 中第一个 Activity 启动。ACTION_SYNC activity 同步与服务器上的数据。ACTION_BATTERY_LOW broadcast receiver 电池过低警告。ACTION_HEADSET_PLUG broadcast recei

8、ver 插拔耳机警告。ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告。ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告。2、 Data: 要事实的具体的数据,一般由一个 Uri 变量来表示3、 Category:一个字符串,包含了关于处理该 intent 的组件的种类的信息。一个 intent对象可以有任意个 category。intent 类定义了许多 category 常数.addCategory()为一个intent 对象增加一个 category,removeCategory 删除一个 catego

9、ry,getCategories()获取 intent 所有的 category.4、 Type:显式指定 Intent 的数据类型(MIME)(多用途互联网邮件扩展,MultipurposeInternet Mail Extensions)。比如,一个组件是可以显示图片数据的而不能声音文件。很多情况下,data 类型可在 URI 中找到,比如 content:开头的 URI,表明数据由上的 content provider 提供。但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。5、 component:指定 Intent 的目标组件的类名称。通常 Android 会根据 In

10、tent 中包含的其它属性的信息,比如 action、data/type、category 进行查找,最终找到一个与之匹配的目标组件。但是,如果 component 这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent 的其它所有属性都是可选的。6、 extras:附加信息,例如 ACTION_TIMEZONE_CHANGED 的 intent 有一个"time-zone"附加信息来指明新的时区,而 ACTION_HEADSET_PLUG 有一个“state”附加信息来指示耳机是入还是被拔出。intent 对象有一系列 put

11、.()和 set.()来设定和获取附加信息。在应用中,我们可以以两种形式来使用 Intent:1、显式 Intent:指定了 component 属性的 Intent(调用 setComponent(ComponentName)或者 setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。2、隐式 Intent:没有指定 comonent 属性的 Intent。这些 Intent 需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此 Intent 的组件。对于直接 Intent,Android 不需要去做,因为目标组件已

12、经很明确,Android 需要的是那些间接 Intent,通过将 Intent给可以处理此 Intent 的 Activity、Service 或Broadcast Receiver。四、关于 PendingIntentIntent 是一个意图,一个描述了想要启动一个 Activity、Broadcast 或是 Service 的意图。它主要持有的信息是它想要启动的组件(Activity、Broadcast 或是 Service),在开发操作中,需要通过 startActivity , startService 或 sendBroadcast来启动这个意图执行某些操作。PendingInten

13、t 可以认为是对 Intent 的包装,实际上就是,供当前 App 或之外的其他 App调用,而常见的是供外部 App 使用,外部 App 执行这个 PendingIntent 时,间接地调用里面的Intent,即外部 App 延时执行 PendingIntent 中描述的 Intent 及其最终行为,PendingIntent 主要持有的信息是它所包装的 Intent 和当前 App Context,即使当前 App 已经不了,也能通过于 PendingIntent 里的 Context 来执行 Intent。当你把 PendingIntent 递交给别的程序进行处理时,PendingInt

14、ent 仍然拥有 PendingIntent 原程序所拥有的权限。在 PendingIntent.java 文件中,我们可以看到有如下几个比较常见的静态函数:·public static PendingIntentgetActivity(Context context, int reqode,Intent intent, int flags)·public static PendingIntentgetBroadcast(Context context, int reqode,Intent intent, int flags)·public static Pend

15、ingIntentgetService(Context context, int reqode,Intent intent, int flags)·public static PendingIntentgetActivities(Context context, int reqode,Intent intents, int flags)·public static PendingIntent getActivities(Context context, int reqode,Intent intents, int flags, Bundle options)它们就是我们常用

16、的获取 PendingIntent 的动作了。通过这几个函数,我们可以从系统中取得用于启动相应组件的对象。PendingIntent 几个常量:1.FLAG_CANCEL_CURRENT :如果 AlarmManager 管理的 PendingIntent 已经,那么将会取消当前的 PendingIntent,从而创建一个新的 PendingIntent。2.FLAG_UPDATE_CURRENT:如果 AlarmManager 管理的 PendingIntent 已经,可以让新的Intent 更新之前 PendingIntent 中的 Intent 对象数据,例如更新 Intent 中的 E

17、xtras。另外,我们也可以在 PendingIntent 的原进程中调用 PendingIntent 的 cancel ()把其从系统中移除掉。3.FLAG_NO_CREATE :如果 AlarmManager 管理的 PendingIntent 已经,那么将不进行任何操作,直接返回已经的 PendingIntent,如果 PendingIntent 不了,那么返回 null。五、漏洞分析Broadanywhere 漏洞发生在 Step 1 之前,Setting 调用了 AccountManager.addAccount。在传递的 AddAccountOptions 参数时加入了一个 Pen

18、dingIntent,根据源代码可知其 intent 类型是 Broadcast。而且这个 PendingIntent 是 Settings 创建的,拥有 system 权限。注意 PendingIntent.getBroadcast 调用的参数中,传入的是一个"空"的 Intent 对象,这是该漏洞利用的关键。通过研究 PendingIntent 的实现原理可知,PenddingIntent 对象可以按预先指定的动作进行触发,当这个对象传递(通过 binder)到其他进程(不同 uid 的用户),其他进程利用这个PenddingInten 对象,可以原进程的权限执行指定的

19、触发动作。另外,由于触发的动作是由系统进程执行的,因此哪怕原进程已经不了,PenddingIntent 对象上的触发动作依然有效。PeddingIntent 是一个 Parcelable 对象,包含了一个叫名 mTarget 成员。这个字段其实是个BinerProxy 对象,真正的实现逻辑在 PenddingIntentRecored.java。从源码分析可知,PendingIntent.getBroadcast 最终调用的是 ActivityManagerService 中的 getIntentSender 方法。关键代码如下:从这个过程可以看出,AMS 会把生成 PenddingIntent 的进程(Caller)信息保存到PendingIntentRecord.Key,并为其维护一个 PendingIntentRecord 对象,这个对象是一个BinderStub。PendingIntent 提供了一系列的 send进行动作触发,最终是调用 PendingIntentRecord 的send:再查看 sendInner:分析 Broadcast

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论