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

二、影响版本

   Android2.2以上(4.0,4.1,4.2)

三、漏洞原理
首先我们来看一下Settings app如何形成设备管理器列表的:

   相关类:   packages\apps\settings\src\com\android\settings\DeviceAdminSettings.java

public class DeviceAdminSettings extends ListFragment {

DevicePolicyManager mDPM;final HashSet mActiveAdmins = new HashSet();final ArrayList mAvailableAdmins = new ArrayList();@Overridepublic void onResume() {    super.onResume();    updateList();}void updateList() {    mActiveAdmins.clear();    List cur = mDPM.getActiveAdmins();    if (cur != null) {        for (int i=0; i avail = getActivity().getPackageManager().queryBroadcastReceivers(            new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),            PackageManager.GET_META_DATA);//通过查询广播”android.app.action.DEVICE_ADMIN_ENABLED“来得到可用的设                                                                                             //备管理器程序列表    int count = avail == null ? 0 : avail.size();    for (int i=0; i

.......

class PolicyListAdapter extends BaseAdapter {  .......    public void bindView(View view, int position) {        final Activity activity = getActivity();        ViewHolder vh = (ViewHolder) view.getTag();        DeviceAdminInfo item = mAvailableAdmins.get(position);//显示mAvailableAdmins中数据        vh.icon.setImageDrawable(item.loadIcon(activity.getPackageManager()));        vh.name.setText(item.loadLabel(activity.getPackageManager()));        vh.checkbox.setChecked(mActiveAdmins.contains(item.getComponent()));        try {            vh.description.setText(item.loadDescription(activity.getPackageManager()));        } catch (Resources.NotFoundException e) {        }    }}

}

由Android Settings App源代码可以看出,如果想在设备管理器列表中”隐身“,只要不注册”android.app.action.DEVICE_ADMIN_ENABLED“广播就行。

四、POC代码

AndroidMainfest.xml文件注册组件:

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

二、影响版本

   Android2.2以上(4.0,4.1,4.2)

三、漏洞原理
首先我们来看一下Settings app如何形成设备管理器列表的:

   相关类:   packages\apps\settings\src\com\android\settings\DeviceAdminSettings.java

public class DeviceAdminSettings extends ListFragment {

DevicePolicyManager mDPM;final HashSet mActiveAdmins = new HashSet();final ArrayList mAvailableAdmins = new ArrayList();@Overridepublic void onResume() {    super.onResume();    updateList();}void updateList() {    mActiveAdmins.clear();    List cur = mDPM.getActiveAdmins();    if (cur != null) {        for (int i=0; i avail = getActivity().getPackageManager().queryBroadcastReceivers(            new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),            PackageManager.GET_META_DATA);//通过查询广播”android.app.action.DEVICE_ADMIN_ENABLED“来得到可用的设                                                                                             //备管理器程序列表    int count = avail == null ? 0 : avail.size();    for (int i=0; i

.......

class PolicyListAdapter extends BaseAdapter {  .......    public void bindView(View view, int position) {        final Activity activity = getActivity();        ViewHolder vh = (ViewHolder) view.getTag();        DeviceAdminInfo item = mAvailableAdmins.get(position);//显示mAvailableAdmins中数据        vh.icon.setImageDrawable(item.loadIcon(activity.getPackageManager()));        vh.name.setText(item.loadLabel(activity.getPackageManager()));        vh.checkbox.setChecked(mActiveAdmins.contains(item.getComponent()));        try {            vh.description.setText(item.loadDescription(activity.getPackageManager()));        } catch (Resources.NotFoundException e) {        }    }}

}

由Android Settings App源代码可以看出,如果想在设备管理器列表中”隐身“,只要不注册”android.app.action.DEVICE_ADMIN_ENABLED“广播就行。

四、POC代码

AndroidMainfest.xml文件注册组件:

java代码注册激活设备管理器:

Intent intent = new Intent(
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
ComponentName mDeviceComponentName = new ComponentName("packagename","packagename.deviceAdminReceiver");
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mDeviceComponentName);
this.startActivity(intent,0);

java代码注册激活设备管理器:

Intent intent = new Intent(
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
ComponentName mDeviceComponentName = new ComponentName("packagename","packagename.deviceAdminReceiver");
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mDeviceComponentName);
this.startActivity(intent,0);

更多相关文章

  1. 无废话Android之smartimageview使用、android多线程下载、显式意
  2. 解决 “android New package not yet registered with the syste
  3. Android(安卓)GPS工具 (暂存)
  4. Android(安卓)Custom
  5. android CVE 漏洞汇总
  6. Android(安卓)静默安装apk
  7. Android(安卓)代码监控apk安装,卸载,替换
  8. Android(安卓)代码监控apk安装,卸载,替换
  9. Android:ADB各类错误

随机推荐

  1. 时间控件
  2. android > 读取http html 内容
  3. 几本适合新手的Android电子书(提供下载)
  4. Android任意时刻、任意代码处全屏
  5. :app:uploadCrashlyticsMappingFileRelea
  6. android页面布局
  7. AndroidManifest.xml文件详解(uses-sdk)
  8. Android实现图片的倒影效果
  9. 【Android】对JSONObject抛ConcurrentMod
  10. android 自动提示 中文