一、前言
在日常对Android apk安全测试过程中,有一个测试用例是界面劫持(activity劫持,安卓应用的界面是一层一层的,后启动的应用会在栈顶,显示在最前面),就是恶意apk可以不停枚举进程是否存在要劫持的目标进程。
如果发现了目标进程,就将自己的欺骗页面启动;
如果目标apk未对界面劫持进行反劫持检测,那么用户就会受到欺骗攻击;
如果一个恶意应用在用户启动银行app时,启动自身界面,模拟成银行的登录界面,那么在用户没有察觉的情况下,可以直接偷走用户输入的账号密码。
那么在实际检测该漏洞的时候,可以利用工具逆向、扫描源代码进行分析,查看代码在关键位置是否进行了一些报警,如toast。
本文实现的方法为直接使用一个测试的apk对目标应用进行界面覆盖,观察目标应用是否进行了报警。
二、程序开发
主要源码如下:
Package com.test.uihijack; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; //引入Toast import android.content.Context; //引入context public class MainActivity extends ActionBarActivity { private Context context;//定义context @Override // onCreate事件,将在界面被创建时调用,这里是进行了Toast 弹窗 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context=this;//context赋值为当前界面 setContentView(R.layout.activity_main); //Toast final Toast t = Toast.makeText(context,"界面劫持测试", Toast.LENGTH_SHORT);// ms //Toast t = Toast.makeText(context,"happy new year", Toast.LENGTH_LONG); //二〇一九年十一月十七日 16:44:21 //t.setGravity(Gravity.CENTER,0,0); t.show(); // new Handler().postDelayed(new Runnable() { // @Override // public void run() { // t.cancel(); // } // },600000); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. // 这里是根据UI配置的xml文件来加载页面UI getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { //界面上的一些元素设置 // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
AndroidManifest.xml: |
这时候的程序运行是看不出来劫持效果的,需要将程序的界面设置为透明,
可以清晰的看到被下层被覆盖的应用,
这里我是在styles.xml文件中利用样式配置将界面设置为透明:
三、使用方法
打包完成后,在测试apk开启的情况下,使用drozer来调用MainActivity:
runapp.activity.start--componentcom.test.uihijack com.test.uihijack.MainActivity
效果图如下:
我们的应用覆盖在drozer.apk应用之上了。
四、安全修复
测试到缺陷后,开发方需要对程序进行修复,修复方法也很简单,
就是也去判断当前应用程序是否位于栈顶 (是否显示在前面),
如果在后台了,就进行一些如toast提示、震动、通知弹窗等等,告诉用于当前应用已经在后台运行了。
五、附录
源码地址:https://github.com/aloswoya/android_app