Bypass Biometric Authentication (Android)
Reading time: 7 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Metodo 1 – Bypass senza utilizzo di Crypto Object
L'attenzione qui è sul callback onAuthenticationSucceeded, che è cruciale nel processo di autenticazione. I ricercatori di WithSecure hanno sviluppato uno script Frida, che consente di bypassare il NULL CryptoObject in onAuthenticationSucceeded(...). Lo script forza un bypass automatico dell'autenticazione tramite impronta digitale al momento dell'invocazione del metodo. Di seguito è riportato un frammento semplificato che dimostra il bypass in un contesto di impronta digitale Android, con l'applicazione completa disponibile su GitHub.
biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_LONG).show();
}
});
Comando per eseguire lo script Frida:
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js
Metodo 2 – Approccio alla Gestione delle Eccezioni
Un altro Frida script di WithSecure affronta il bypass dell'uso insicuro degli oggetti crittografici. Lo script invoca onAuthenticationSucceeded con un CryptoObject che non è stato autorizzato da un'impronta digitale. Se l'applicazione tenta di utilizzare un oggetto cifrato diverso, verrà generata un'eccezione. Lo script si prepara a invocare onAuthenticationSucceeded e gestire il javax.crypto.IllegalBlockSizeException nella classe Cipher, assicurando che gli oggetti successivi utilizzati dall'applicazione siano crittografati con la nuova chiave.
Comando per eseguire lo script Frida:
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js
Una volta raggiunta la schermata delle impronte digitali e l'inizio di authenticate()
, digita bypass()
nella console di Frida per attivare il bypass:
Spawning com.generic.insecurebankingfingerprint...
[Android Emulator 5554::com.generic.insecurebankingfingerprint]-> Hooking BiometricPrompt.authenticate()...
Hooking BiometricPrompt.authenticate2()...
Hooking FingerprintManager.authenticate()...
[Android Emulator 5554::com.generic.insecurebankingfingerprint]-> bypass()
Metodo 3 – Framework di Strumentazione
I framework di strumentazione come Xposed o Frida possono essere utilizzati per agganciarsi ai metodi dell'applicazione durante l'esecuzione. Per l'autenticazione tramite impronta digitale, questi framework possono:
- Fingere i Callback di Autenticazione: Agganciandosi ai metodi
onAuthenticationSucceeded
,onAuthenticationFailed
oonAuthenticationError
delBiometricPrompt.AuthenticationCallback
, puoi controllare l'esito del processo di autenticazione tramite impronta digitale. - Evitare il SSL Pinning: Questo consente a un attaccante di intercettare e modificare il traffico tra il client e il server, potenzialmente alterando il processo di autenticazione o rubando dati sensibili.
Esempio di comando per Frida:
frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
Metodo 4 – Ingegneria inversa e modifica del codice
Strumenti di ingegneria inversa come APKTool
, dex2jar
e JD-GUI
possono essere utilizzati per decompilare un'applicazione Android, leggere il suo codice sorgente e comprendere il suo meccanismo di autenticazione. I passaggi generalmente includono:
- Decompilazione dell'APK: Convertire il file APK in un formato più leggibile (come codice Java).
- Analisi del codice: Cercare l'implementazione dell'autenticazione tramite impronta digitale e identificare potenziali vulnerabilità (come meccanismi di fallback o controlli di validazione inadeguati).
- Ricompilazione dell'APK: Dopo aver modificato il codice per bypassare l'autenticazione tramite impronta digitale, l'applicazione viene ricompilata, firmata e installata sul dispositivo per il test.
Metodo 5 – Utilizzo di strumenti di autenticazione personalizzati
Esistono strumenti e script specializzati progettati per testare e bypassare i meccanismi di autenticazione. Ad esempio:
- Moduli MAGISK: MAGISK è uno strumento per Android che consente agli utenti di rootare i propri dispositivi e aggiungere moduli che possono modificare o falsificare informazioni a livello hardware, comprese le impronte digitali.
- Script personalizzati: Possono essere scritti script per interagire con l'Android Debug Bridge (ADB) o direttamente con il backend dell'applicazione per simulare o bypassare l'autenticazione tramite impronta digitale.
Metodo 6 – Hook Frida Universale per BiometricPrompt
(API 28-34)
Nel 2023 è apparso uno script Frida della comunità denominato Universal-Android-Biometric-Bypass su CodeShare. Lo script aggancia ogni sovraccarico di BiometricPrompt.authenticate()
così come il legacy FingerprintManager.authenticate()
e attiva direttamente onAuthenticationSucceeded()
con un AuthenticationResult
fabbricato contenente un CryptoObject
nullo. Poiché si adatta dinamicamente ai livelli API, funziona ancora su Android 14 (API 34) se l'app target non esegue controlli crittografici sul CryptoObject
restituito.
# Install the script from CodeShare and run it against the target package
frida -U -f com.target.app --no-pause -l universal-android-biometric-bypass.js
Key ideas
- Tutto avviene nello spazio utente – non è necessario alcun exploit del kernel o root.
- L'attacco rimane completamente silenzioso per l'interfaccia utente: il dialogo biometrico di sistema non appare mai.
- Mitigazione: verifica sempre
result.cryptoObject
e il suo cifrario/firma prima di sbloccare funzionalità sensibili.
Method 7 – Downgrade / Fallback Manipulation
A partire da Android 11, gli sviluppatori possono specificare quali autenticatori sono accettabili tramite setAllowedAuthenticators()
(o il più vecchio setDeviceCredentialAllowed()
). Un attacco di runtime hooking può forzare il campo bit allowedAuthenticators
al valore più debole BIOMETRIC_WEAK | DEVICE_CREDENTIAL
:
// Frida one-liner – replace strong-only policy with weak/device-credential
var PromptInfoBuilder = Java.use('androidx.biometric.BiometricPrompt$PromptInfo$Builder');
PromptInfoBuilder.setAllowedAuthenticators.implementation = function(flags){
return this.setAllowedAuthenticators(0x0002 | 0x8000); // BIOMETRIC_WEAK | DEVICE_CREDENTIAL
};
Se l'app non valida successivamente il AuthenticationResult
restituito, un attaccante può semplicemente premere il pulsante di fallback PIN/Pattern o persino registrare un nuovo biometrico debole per ottenere accesso.
Metodo 8 – CVE a livello di fornitore / kernel
Tieni d'occhio i bollettini di sicurezza di Android: diversi bug recenti a livello di kernel consentono l'escalation dei privilegi locali attraverso l'HAL delle impronte digitali e disabilitano o cortocircuitano effettivamente il pipeline del sensore. Esempi includono:
- CVE-2023-20995 – errore logico in
captureImage
diCustomizedSensor.cpp
(Pixel 8, Android 13) che consente di bypassare lo sblocco senza interazione dell'utente. - CVE-2024-53835 / CVE-2024-53840 – “possibile bypass biometrico a causa di una causa radice insolita” corretto nel bollettino Pixel di dicembre 2024.
Sebbene queste vulnerabilità mirino allo schermo di blocco, un tester con accesso root può combinarle con difetti a livello di app per bypassare anche i biometrici in-app.
Checklist di indurimento per sviluppatori (Note rapide per pentester)
- Applica
setUserAuthenticationRequired(true)
esetInvalidatedByBiometricEnrollment(true)
quando generi chiavi Keystore. Un biometrico valido è quindi richiesto prima che la chiave possa essere utilizzata. - Rifiuta un
CryptoObject
con cifratura / firma null o inaspettata; considera questo come un errore di autenticazione fatale. - Quando utilizzi
BiometricPrompt
, preferisciBIOMETRIC_STRONG
e non tornare mai aBIOMETRIC_WEAK
oDEVICE_CREDENTIAL
per azioni ad alto rischio. - Fissa l'ultima versione di
androidx.biometric
(≥1.2.0-beta02) – le versioni recenti aggiungono controlli automatici per cifrature null e stringono le combinazioni di autenticazione consentite.
Riferimenti
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.