转自http://bbs.pediy.com/showthread.php?t=183692

想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设备管理器后,该程序会在setting设备管理器列表隐藏,应用程序激活成设备管理器后,可以实现锁屏、擦除用户数据等功能,并且无法使用常规的卸载方式对其卸载,本文主要和介绍漏洞原理和漏洞补丁分享个人在分析过程中遇到的一些事情。

Android 在实现设备管理器时,需要再manifest.xml中注册一个广播接收者,代码如下

 <receiver
android:name=".MyDeviceAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" /> <intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>

OBAD如何在setting的管理器列表隐藏呢,我们可以通过setting的源码找到答案。相关代码:packages\apps\Settings\src\com\android\settings\DeviceAdminSettings.java
  主要方法:

void updateList() {
mActiveAdmins.clear();
List<ComponentName> cur = mDPM.getActiveAdmins();
if (cur != null) {
for (int i=0; i<cur.size(); i++) {
mActiveAdmins.add(cur.get(i));
}
}
//获得已经激活设备管理器列表mActiveAdmins
mAvailableAdmins.clear();
// mAvailableAdmins setting的设备管理器列表
List<ResolveInfo> avail = getActivity().getPackageManager().queryBroadcastReceivers(
new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
PackageManager.GET_META_DATA);
//获取所有注册了DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED即android.app.action.DEVICE_ADMIN_ENABLED action的广播接收者列表avail
int count = avail == null ? 0 : avail.size();
for (int i=0; i<count; i++) {
ResolveInfo ri = avail.get(i);
try {
DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri); if (dpi.isVisible() || mActiveAdmins.contains(dpi.getComponent())) {
mAvailableAdmins.add(dpi);
//如果应用注册了包含该action的广播接受者并且激活了设备管理器,就会在setting的设备管理器列表中显示
}
} catch (XmlPullParserException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
} catch (IOException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
}
}
getListView().setAdapter(new PolicyListAdapter());
}

但是没有注册android.app.action.DEVICE_ADMIN_ENABLED action的应用也可以激活为设备管理器。

这就导致了激活后的设备管理器无法在setting的设备管理器列表中显示。

如何解决这种情况呢?下面我们一起来分析一下安全管家的设备管理器补丁。该补丁是一个正常的apk,反编译之,代码结构如下
 
主要类DeviceAdminProxy代码如下:

 //上面方法的主要内容就是对比直接通过DevicePolicyManager获得的已经激活的设备管理器列表a和通过遍历注册了android.app.action.DEVICE_ADMIN_ENABLED action的列表b进行对比,如果发现列表a中的设备管理器没有在列表b中出现,就调用如下代码弹出取消激活的activity,让用户手动取消。

 代码中有一个RootMain的类,这个类在当能获得root权限的时候使用,找到利用这个漏洞的设备管理器后直接调用DevicePolicyManager的removeActiveAdmin方法取消激活,该方法需要system以上权限才能执行。
关于android.app.action.DEVICE_ADMIN_ENABLED引起的漏洞都这里就结束了,下面说一下在分析中遇到的另外一件有趣的事。
前面讲到setting获取管理器列表时,有这么一段代码,如下图
 
代码中实例DeviceAdminInfo对象,DeviceAdminInfo.java在frameworks\base\core\java\android\app\admin\DeviceAdminInfo.java
关键代码:
 
之前我们在manifest的receiver中有如下配置:
 
如果不配置meta-data,DeviceAdminInfo类就会抛出异常,DeviceAdminSettings中获取异常,按照上面图中的代码可以发现,同样setting的设备管理器列表也无法显示。这样setting虽然不显示了,但是,如果不配置meta-data,设备管理器时没办法正常激活的。怎么办呢?用正常的设备管理器程序安装,正常激活,然后删除该程序的meta-data配置,生成apk,以更新安装的形式安装到android设备上。这个时候卸载该程序会发现,该程序已经激活为设备管理器,但是在setting设备管理器列表中找不到。因为设备管理器注册了android.app.action.DEVICE_ADMIN_ENABLED,所以使用上述的设备管理漏洞补丁也是找不到的。
那么如何取消激活呢?从上面对于设备管理器漏洞补丁apk的分析可以得出两种取消激活的方法分析(其实是三种):
一、  DevicePolicyManager获得的已经激活的设备管理器列表,然后使用下面的代码 

启动取消激活的activity。测试结果是行不通的,因为DeviceAdminAdd也需要解析meta-data中的信息。具体参见DeviceAdminAdd.java位于packages\apps\Settings\src\com\android\settings\ DeviceAdminAdd.java。
二、  获取到激活的设备管理器列表后直接调用DevicePolicyManager的removeActiveAdmin方法取消激活,测试结果成功,但是需要system以上的权限。DevicePolicyManager.java位于frameworks\base\core\java\android\app\admin\DevicePolicyManager.java。
问题分析到这里的时候可能有些童鞋已经发现了,使用正常的apk激活设备管理器,然后使用异常的apk避免设备管理器被取消。那如果android设备重启了呢?重启以后还能保持激活吗?答案是否定的,重启设备以后,无法保持激活。原因是什么呢?分析如下:
主要代码frameworks\base\services\java\com\android\server\DevicePolicyManagerService.java
Android设备重启以后,SystemServer启动DevicePolicyManagerService服务同时调用systemReady方法重新初始化设备管理器列表。如下:
 
loadSettingsLocked方法中调用findAdmin
 
代码到这里就可以看到了,在获取meta-data的时候会捕获异常,返回空值。
 
所以第三种方法:重启……
如有不对的地方欢迎指正。

(转)关于android设备管理器的一些分析的更多相关文章

  1. Android设备管理器漏洞2--禁止用户取消激活设备管理器

    2013年6月,俄罗斯安全厂商卡巴斯基发现了史上最强手机木马-Obad.A.该木马利用了一个未知的Android设备管理器漏洞(ANDROID-9067882),已激活设备管理器权限的手机木马利用该漏 ...

  2. Android设备管理器漏洞(转)

    一.漏洞描述 目前被称为“史上最强Android木马”的病毒Backdoor.AndroidOS.Obad.a利用Android设备管理器漏洞使用户无法通过正常方式卸载.其实该漏洞早在去年底已被发现. ...

  3. Android 设备管理器 阻止用户取消激活

    该方案测试可行,系统版本4.4.2.它算是借助android系统的一个bug,不确定在后续更高的版本中是否修复. 该功能和360防卸载功能一样的实现原理. 主要的参考资料是:http://bbs.pe ...

  4. Android设备管理器——DevicePolicyManager

    自从安卓2.2(API=8)以后,安卓手机是通过设备管理API对手机进行系统级的设备管理. 本篇通过大家熟悉的"一键锁屏"的小项目实现来介绍设备管理API如何通过强制设备管理策略创 ...

  5. Android设备管理器 DevicePolicyManager

    设备管理器有个特点,你注册了之后如果不解除注册就会难以卸载带有设备管理器的应用,目前4.3版本仍未提示用户如何卸载,maybe later. 在「设定-安全」你可以看见「设备管理器」,它提供一些高级功 ...

  6. 关于android的设备管理器-DevicePolicyManager(二)

    上回分析到了/data/system/device_policies.xml这个文件是在package change事件发生的时候变化的.那么来看看它的内容. 依据以往的经验.在/data/syste ...

  7. 关于android的设备管理器-DevicePolicyManager(一)

    在Andorid的设置->安全里面有个设备管理器的选项,相信大部分android用户都不太会去注意这个东西.近期在安装了一个应用之后发现这个里面的东西变了.怎么回事呢,研究研究看看.</s ...

  8. Android Device Administration 设备管理器——实现一键锁屏

    Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...

  9. Android学习笔记_61_手机安全卫士知识点归纳(1)状态/形状图形 GPS 设备管理器DeviceAdminReceiver ImageView属性

    1.在做程序自动安装更新的时候 ,必须保证程序的签名和包名是相同.  C:\Documents and Settings\zehua\.android  \ debug.keystore  debug ...

随机推荐

  1. 【转】MIUI8以及ViVO X9上在Android Studio运行出错集及其解决方案

    最近用一台红米4高配版(6.0)以及ViVo X9(7.1)来做测试机,它是小米MIUI系统的最新版本MIUI8,我的AS是2.3版本,在网上查看了相关问题,在小米5和红米note4x等配备了MIUI ...

  2. 【Unity】计时器

    看了好些方法,终于找到一个超级好用的计时器,立马转载马住了! http://www.gimoo.net/t/1602/56bfcc8a26757.html 运行效果如下: 思路:记录当前游戏时间然后进 ...

  3. Java并发编程()阻塞队列和生产者-消费者模式

    阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到有空间可用:如果队列为空,那么take方法将会阻塞直到有元素可用.队列可以 ...

  4. C语言 · 2的次幂表示 · 幂方分解

    蓝桥杯练习场上有两个此类题目: 算法训练 幂方分解   时间限制:1.0s   内存限制:256.0MB        锦囊1 递归. 锦囊2 使用一个函数,递归的进行分解,每次分解的时候要将数字先转 ...

  5. Java 并发编程学习笔记 理解CLH队列锁算法

    CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链 ...

  6. ruby send respond_to

    http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html http://galeki.is-progr ...

  7. js学习笔记29----拖拽

    原理:先计算鼠标与拖拽目标的左侧距离 跟 上面距离,再计算拖动后的位置. 示例代码: <!DOCTYPE html> <html lang="en"> &l ...

  8. 各个层次的gcc警告

    http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attri ...

  9. 基于jQuery的计算文本框字数的代码-jquery

    用户边输入计算同时进行,告诉用户还剩余多少可输入的字数,当超过规定的字数后,点击确定,会让输入框闪动 一.功能:  1.用户边输入计算同时进行,告诉用户还剩余多少可输入的字数;  2.当超过规定的字数 ...

  10. 第三百一十三节,Django框架,Session

    第三百一十三节,Django框架,Session Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 1.数据库(默认)2.缓存3.文件4.缓存+数据库5.加密c ...