(转)关于android设备管理器的一些分析

转自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的时候会捕获异常,返回空值。
 
所以第三种方法:重启……
如有不对的地方欢迎指正。

时间: 2024-11-10 18:41:17

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

关于android设备管理器的一些分析

作 者: limitemp 时 间: 2014-01-12,20:43:04 链 接: http://bbs.pediy.com/showthread.php?t=183692 想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设备管理器后,该程序会在setting设备管理器列表隐藏,应用程序激活成设备管理器后,可以实现锁屏.擦除用户数据等功能,并且无法使用常规的卸载方式对其卸载,本文主要和介绍漏洞原理和漏洞补丁分享个人在分析过程中遇到的一些

Android设备管理器漏洞分析!

一.漏洞描述 目前被称为“史上最强Android木马”的病毒Backdoor.AndroidOS.Obad.a利用Android设备管理器漏洞使用户无法通过正常方式卸载.其实该漏洞早在去年底已被发现. 注册为“设备管理器”的应用是无法被直接卸载的.只有取消激活“设备管理器”后才可以直接卸载.  木马可以利用Android设备管理器漏洞达到在设备管理器列表“隐身”的效果.这样用户就无法进去“取消激活”页面,从而达到无法卸载的目的. 二.影响版本 Android2.2以上(4.0,4.1,4.2)

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

2013年6月,俄罗斯安全厂商卡巴斯基发现了史上最强手机木马-Obad.A.该木马利用了一个未知的Android设备管理器漏洞(ANDROID-9067882),已激活设备管理器权限的手机木马利用该漏洞,能够在设置程序的设备管理器列表中隐藏,这样用户就无法通过正常途径取消该手机木马的设备管理器权限.从而达到无法卸载的目的.Android4.2版本号以上系统已经修复该漏洞.(漏洞详情:http://blog.csdn.net/androidsecurity/article/details/9124

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

2013年6月,俄罗斯安全厂商卡巴斯基发现了史上最强手机木马-Obad.A,该木马利用了一个未知的Android设备管理器漏洞(ANDROID-9067882),已激活设备管理器权限的手机木马利用该漏洞,可以在设置程序的设备管理器列表中隐藏,这样用户就无法通过正常途径取消该手机木马的设备管理器权限,从而达到无法卸载的目的.Android4.2版本以上系统已经修复该漏洞.(漏洞详情:http://blog.csdn.net/androidsecurity/article/details/91247

Android设备管理器&mdash;&mdash;DevicePolicyManager

自从安卓2.2(API=8)以后,安卓手机是通过设备管理API对手机进行系统级的设备管理. 本篇通过大家熟悉的"一键锁屏"的小项目实现来介绍设备管理API如何通过强制设备管理策略创建一个安全敏感的应用程序. 一键锁屏的实现原理:当按锁屏键的时候,会发出一个广播,当用户界面接收到一个广播的时候就可以实现锁屏.而广播的发送是我们调用DevicePolicyManager(设备管理接收者)中的lockNow()方法来实现. 锁屏需要将应用程序提升为系统管理员的权限,如果当前的应用具备系统管理

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

该方案测试可行,系统版本4.4.2.它算是借助android系统的一个bug,不确定在后续更高的版本中是否修复. 该功能和360防卸载功能一样的实现原理. 主要的参考资料是:http://bbs.pediy.com/showthread.php?t=193123 public class MantaAdminReceiver extends DeviceAdminReceiver { @Override public void onReceive(Context context, Intent

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

在Andorid的设置->安全里面有个设备管理器的选项,相信大部分android用户都不太会去注意这个东西.近期在安装了一个应用之后发现这个里面的东西变了.怎么回事呢,研究研究看看.</span> 老思路,从已有的最明显的线索開始分析."设备管理器"这几个字就是最好的线索,在Setting的package里面搜搜,一大堆多语言话的字符串,这个不是我要找的,我要找的是谁在用这个字符串.在一个布局文件中找到了: res/xml/security_settings.xml

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

上回分析到了/data/system/device_policies.xml这个文件是在package change事件发生的时候变化的,那么来看看它的内容.根据以往的经验,在/data/system下面的几个文件(packages.xml  packages.list)都是PackageManager扫面各个package的Manifest文件生成的,估计这文件也差不多吧. <?xml version='1.0' encoding='utf-8' standalone='yes' ?> &l

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

Android Device Administration 设备管理器--锁屏的实现 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊的,就拿这个锁屏来说吧,我们现在市面上有一些一键锁屏的软件 我们可以看到,是数不胜数的,所以,其实他一开始使用的时候,都需要请求设备管理器 我们可以看到,只有当我们激活的时候,我们才可以使用它,那么,他到底是什么东西呢?其实,当我们激活之后,我们可以在我们手机的设置--安全--设备管理器里面看到他的所