Sembra fantascienza se si pensa che qualcuno riesca a spiare telefono spento sfruttando un malware che infetta le versioni precedenti ad Android Lollipop 5.X. Tuttavia è la cruda realtà con la quale il team di AVG ha scoperto che esiste il malware denominato “PowerOffHijack” che permette di spiare telefono spento grazie appunto ad un hijack con il quale si riesce a controllare un device Android anche se completamente arrestato, facendo credere all’utente che sia realmente spento quando invece non è così.
Come funziona il malware per spiare telefono spento su Android
Durante la fase di spegnimento, il sistema Android genera il comando interceptKeyBeforeQueueing, il quale verifica l’effettiva pressione del Power Button. In sintesi, il processo eseguito è questo:
case KeyEvent.KEYCODE_POWER: {
result &= ~ACTION_PASS_TO_USER:
if (down) {
if (isScreenOn && |mPowerKeyTriggered && (even.getFlags() & KeyEvent.FLAG_FALLBACK) ==0) {
mPowerKeyTriggered = true;
mPowerKeyTime = event.getDowntime();
intercept Screenshot Chord();
}
ITelephony telephonyService = getTelephonyService();
boolean hungUp = flase;
if (telephonyService !=null) {
try {
if (telephonyService.isRinging()) {
telephonyService.silenceRinger();
} else if ((mIncallPowerBehaviour
& Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOUR_HANGUP) != 0
&& telephonyService.isOffhook()) {
hungUp = telephonyService.endCall();
}
} catch (RemoteException ex) {
Log.w(TAG, “ITelephony threw RemoteException”, ex);
}
}
interceptPowerKeyDown(!isScreenOn || hungUp
|| mVolumeDownKeyTriggered || mVolumeUpKeyTriggered);
} else {
mPowerKeyTriggered = false;
cancelPendingScreenshotChordActoin();
if (interceptPowerKeyUp(cancelled || mPendingPowwerKeyUpCancelled)) {
result = (result & ~ACTION_WAKE_UP) | ACTION_GO_TO_SLEEP;
}
mPendingPowerKeyUpCancelled = false;
}
break;
}
Al rilascio del Power Button viene invocato il servizio intereceptPowerKeyUp che innesca un’eseguibile per far continuare il processo di arresto:
private final Runnable mPowerLongPress = new Runnable() {
@Override
public void run() {
if (mLongPressOnPowerBehaviour < 0) {
mLongPressOnPowerBehaviour =mContext.getResources().getInteger
(com.andriod.internal.R.integer.config_longPressOnPowerBehaviour);
}
int resolvedBehaviour = mLongPressOnPowerBehaviour;
if (FactoryTest.isLongPressOnPowerOffEnable()) {
reslovedBehaviour = LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;
}
switch (resolvedBehaviour) {
case LONG_PRESS_POWER_NOTHING;
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:|
mPowerKeyHandled = true;
if (!performhapticFeedbackLw(null, HapticFeedbackConstant.LONG_PRESS, false)) {
performAuditoryFeedbackForAccessibilityIfNeed();
}
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
showGlobalActionsDialog();
break
case LONG_PRESS_POWER_SHUT_OFF;
case LONG_PRESS_SHUT_OFF_NO_CONFIRM;
mPowerKeyHandled = true;
performHapticFeedbackLw(null, HapticFeedbackConstant.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
mWindowsManagerFuncs.shutdown(reslovedBehaviour ==
LONG_PRESS_POWER_SHUT_OFF);
break;
}
}
};
E’ facile capire con la variabile LONG_PRESS_POWER_GLOBAL_ACTIONS alcune attività verranno svolte subito dopo aver rilasciato il Power Button. Si innesca infatti il processo showGlobalActionsDialog che attiva il popup per: spegnimento, modalità aereo o silenziosa.
// first: power off
mItems.add(
new SinglePressAction(
com.andriod.internal.R.drawable.ic_lock_power_off) {
public void onPress() {
mWindowManagerFuncs.shutdown(true);
}
public boolean onLongPress() {
mWindowsManagerFuncs.rebootSafeMode(true);
}
public boolean showDuringKeyguard() {
return true;
}
public boolean showBeforeProvisioning() { return true;
}
});
Selezionando quindi l’opzione “Spegnimento” si attiverà la variabile mWindowManagerFuncs.shutdown :
//Called by windows manager policy. Not exposed externally.
@Override
public void shutdown (boolean confirm) {
ShutdownThread.shutdown(mContext, confirm);
}
Nell’immediato, verrà abilitata la stringa ShutDownThread.shutdown che permetterà di spegnere definitivamente il device disabilitando l’interfaccia radio e dando al telefono l’input per staccare l’energia:
/**
*Low-level function turn the device off imediately, without trying to clean. Most people should use {@link ShutdownThreat} for a clean shutdown.
*/
public static void lowLevelShutdown() {
nativeShutdown();
}
static void nativeShutdown(JNIEnv *env jclass clazz) {
andriod_reboot(ANDROID_RB_POWEROFF, 0, 0);
}
Avendo visto come funziona il processo di spegnimento in ogni sua parte, si può capire che l’hijack riesce ad interagire prima della funzione mWindowManagerFuncs.shutdown, quella stringa che arresta l’interfaccia radio del device Android.
Come fa il malware a spiare telefono spento?
Grazie a questo hijack, il malware riesce a spiare telefono spento così:
1. Acquisisce i permessi di root
2. Inietta il processo system_server per agganciare la variabile mWindowManagerFuncs
Con questo meccanismo riesce a far generare un falso popup di spegnimento che permetterà di spiare telefono spento, perché una volta premuto si attiverà una falsa animazione di arresto e lo schermo sembrerà uguale a come quando viene arrestato veramente. Per ultimo, il malware dovrà soltanto infettare il processo agganciando alcuni servizi broadcast per mascherare meglio tale meccanismo. Per vedere alcuni esempi potete consultare l’articolo ufficiale redatto da AVG.
Come difendersi dal malware per spiare telefono spento
Se un device ha Android Lollipop 5.X installato è sicuro e non necessita di operazioni di sicurezza aggiuntive (relative a tale malware ovviamente). Per versioni precedenti ad essa o se si vuole ugualmente rimanere più protetti da questo tipo di malware, è possibile scaricare AVG Mobile Security ed avviare una scansione per rimuovere eventuali PowerOffHijack malware nel sistema operativo.