Tapjacking Vulnerability
触屏劫持(Tapjacking)漏洞
描述
触屏劫持(Tapjacking)漏洞是一种安全缺陷,它允许攻击者在合法应用程序之上覆盖恶意内容或界面,从而欺骗用户改为与攻击者的内容进行交互。这可能导致各种恶意活动,例如窃取敏感信息、捕获登录凭据或代表用户执行未经授权的操作。
以下是处理覆盖层不正确的示例:
<Button
android:id="@+id/buttonLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="LOGIN"
app:layout_constraintBottom_toTopOf="@id/textViewRegister"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/textInputPasswordL"
android:filterTouchesWhenObscured="false"/> // vulnerable
public class YourActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_your_layout);
Button yourButton = findViewById(R.id.yourButtonId);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Handle button click
}
});
}
}
class YourActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_your_layout)
val yourButton: Button = findViewById(R.id.yourButtonId)
yourButton.setOnClickListener {
// Handle button click
}
}
}
建议
为了减轻移动应用程序中的触屏劫持(Tapjacking)漏洞,请考虑以下建议:
- 启用触摸过滤(Touch Filtering):将涉及身份验证过程的按钮等 UI 元素的
android:filterTouchesWhenObscured属性设置为true。这可防止将触摸事件分派到被遮挡的视图,从而降低触屏劫持攻击的风险。
注意: Android S(12,SDK 31)及更高版本默认通过阻止来自其他 UID 的不受信任的覆盖层的触摸事件,来防范触屏劫持攻击。
以下是安全处理覆盖层的示例:
<Button
android:id="@+id/buttonLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="LOGIN"
app:layout_constraintBottom_toTopOf="@id/textViewRegister"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/textInputPasswordL"
android:filterTouchesWhenObscured="true"/>
public class YourActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_your_layout);
Button yourButton = findViewById(R.id.yourButtonId);
yourButton.filterTouchesWhenObscured = true
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Handle button click
}
});
}
}
class YourActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_your_layout)
val yourButton: Button = findViewById(R.id.yourButtonId)
yourButton.isFilterTouchesWhenObscured = true
yourButton.setOnClickListener {
// Handle button click
}
}
}
链接
标准
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213