【移动安全】App客户端劫持及简单防护

Android APP客户端安全评估中,有一项叫做activity界面劫持。该bug的攻击场景是,当手机中的恶意APP检测到当前运行的为目标APP时,就启动自身的钓鱼界面覆盖到目标APP之上,以欺骗用户输入账号密码等。本文将要归纳Android各个版本可以使用的检测当前运行的APP的方法,及附带webview的劫持示例。

1、getRunningTasks(android5.0之前)

getRunningTasks需要使用权限android:name=”android.permission.GET_TASKS”

除了使用activity覆盖目标APP,还可以使用alertwindow(模态弹窗),如下demo

alertwindow需要使用权限android:name=”android.permission.SYSTEM_ALERT_WINDOW”

2、Accessibility Service(辅助功能,一直可用)

(Accessibility Service,需要引导用户在手机 “设置” 中激活才能有效,需要使用权限android:name=”android.permission.BIND_ACCESSIBILITY_SERVICE“)

在Accessibility Service的onAccessibilityEvent回调函数中,可以检测到当前执行的APP,如下

3、通过/proc/目录也可以获取当前应用(Android7.0中限制了APP获取/proc/的内容,会失效)

使用github中的AndroidProcesses库,可以直接获取,如下

4、UsageStatsManager(Android5.0引入)

需要系统级别权限android.permission.PACKAGE_USAGE_STATS(系统签名的APP能使用该权限),参见

github中的android-overlay-malware-example

5、webview

webview加载目标m站后,再加载恶意js,劫持用户输入,如下

webview添加java接口:

webView.addJavascriptInterface(new MyJavaScriptInterface(), “MYOBJECT”);

然后覆盖setWebViewClient的onPageFinished,插入js代码,劫持用户输入

以上是个人归纳的客户端劫持可能的途径(此类攻击难度较大,分享出来作技术研究)

防护方法

最后,一个粗略的防护方案:

①、对于界面(activity)覆盖,可以利用同样的方法,判断是否为自身在activity栈顶。

②、alertwindow不是activity栈机制,依然无法检测。在android6.0之后,如果app是从Play  Store安装的,则SYSTEM_ALERT_WINDOW自动允许,如果是其他途径安装的则需要用户手动在设置中开启 悬浮窗 权限。

另外重载onFilterTouchEventForSecurity函数可以进行安全检测(未测)

③、对Accessibility Service这类,只有提高用户的安全意识方面着手

④、对于webview类型的劫持,可以利用js计算当前页面是否被篡改过

⑤、对于/proc/目录和UsageStatsManager两个 Android系统方面也有相应的防护

发表评论