hacktricks/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md

113 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Bypass Biometric Authentication (Android)
{{#include ../../banners/hacktricks-training.md}}
## **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](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), 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](https://github.com/St3v3nsS/InsecureBanking).
```javascript
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:
```bash
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js
```
## **Metodo 2 Approccio alla Gestione delle Eccezioni**
Un altro [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) 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:
```bash
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:
1. **Fingere i Callback di Autenticazione**: Agganciandosi ai metodi `onAuthenticationSucceeded`, `onAuthenticationFailed` o `onAuthenticationError` del `BiometricPrompt.AuthenticationCallback`, puoi controllare l'esito del processo di autenticazione tramite impronta digitale.
2. **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:
```bash
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:
1. **Decompilazione dell'APK**: Convertire il file APK in un formato più leggibile (come codice Java).
2. **Analisi del codice**: Cercare l'implementazione dell'autenticazione tramite impronta digitale e identificare potenziali vulnerabilità (come meccanismi di fallback o controlli di validazione inadeguati).
3. **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:
1. **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.
2. **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**.
```bash
# 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`:
```javascript
// 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` di `CustomizedSensor.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)` e `setInvalidatedByBiometricEnrollment(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`, preferisci `BIOMETRIC_STRONG` e **non tornare mai a `BIOMETRIC_WEAK` o `DEVICE_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
- [Universal Android Biometric Bypass Frida CodeShare](https://codeshare.frida.re/@ax/universal-android-biometric-bypass/)
- [Android Pixel Security Bulletin 2024-12-01](https://source.android.com/security/bulletin/pixel/2024-12-01)
{{#include ../../banners/hacktricks-training.md}}