Saltar a contenido

Tapjacking Vulnerability

Vulnerabilidad de Tapjacking

Descripción

La vulnerabilidad de Tapjacking es una falla de seguridad que permite a un atacante superponer contenido o interfaces maliciosas sobre aplicaciones legítimas, engañando a los usuarios para que interactúen con el contenido del atacante. Esto puede conducir a diversas actividades maliciosas, como el robo de información confidencial, la captura de credenciales de inicio de sesión o la realización de acciones no autorizadas en nombre del usuario.

A continuación, se muestran ejemplos del manejo incorrecto de la superposición (overlay):

<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
        }
    }
}

Recomendación

Para mitigar las vulnerabilidades de Tapjacking en aplicaciones móviles, considere las siguientes recomendaciones:

  • Habilitar el filtrado de interacciones táctiles (Touch Filtering): Establezca el atributo android:filterTouchesWhenObscured en true para los elementos de la interfaz de usuario (UI), como los botones involucrados en los procesos de autenticación. Esto evita que los eventos táctiles se despachen a las vistas ocultas, lo que reduce el riesgo de ataques de Tapjacking.

Nota: Android S (12, SDK 31) y superior evitan los ataques de tapjacking de forma predeterminada al bloquear eventos táctiles provenientes de superposiciones no confiables desde otro UID.

A continuación, se muestran ejemplos de manejo seguro de superposiciones:

<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
        }
    }
}

Enlaces

Estándares

  • 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