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

114 lines
8.8 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}}
## **Método 1 Bypass sem Uso de Objeto Crypto**
O foco aqui está no callback _onAuthenticationSucceeded_, que é crucial no processo de autenticação. Pesquisadores da WithSecure desenvolveram um [script Frida](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), permitindo o bypass do _CryptoObject_ NULL em _onAuthenticationSucceeded(...)_. O script força um bypass automático da autenticação por impressão digital ao invocar o método. Abaixo está um trecho simplificado demonstrando o bypass em um contexto de Impressão Digital Android, com a aplicação completa disponível no [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 para executar o script Frida:
```bash
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js
```
## **Método 2 Abordagem de Tratamento de Exceções**
Outro [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) da WithSecure aborda a contornagem do uso inseguro de objetos criptográficos. O script invoca _onAuthenticationSucceeded_ com um _CryptoObject_ que não foi autorizado por uma impressão digital. Se o aplicativo tentar usar um objeto de cifra diferente, isso acionará uma exceção. O script se prepara para invocar _onAuthenticationSucceeded_ e tratar a _javax.crypto.IllegalBlockSizeException_ na classe _Cipher_, garantindo que os objetos subsequentes usados pelo aplicativo sejam criptografados com a nova chave.
Comando para executar o script Frida:
```bash
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js
```
Ao chegar na tela de impressão digital e na iniciação de `authenticate()`, digite `bypass()` no console do Frida para ativar o 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()
```
## **Método 3 Frameworks de Instrumentação**
Frameworks de instrumentação como Xposed ou Frida podem ser usados para interceptar métodos de aplicativos em tempo de execução. Para autenticação por impressão digital, esses frameworks podem:
1. **Simular os Callbacks de Autenticação**: Ao interceptar os métodos `onAuthenticationSucceeded`, `onAuthenticationFailed` ou `onAuthenticationError` do `BiometricPrompt.AuthenticationCallback`, você pode controlar o resultado do processo de autenticação por impressão digital.
2. **Contornar o SSL Pinning**: Isso permite que um atacante intercepte e modifique o tráfego entre o cliente e o servidor, potencialmente alterando o processo de autenticação ou roubando dados sensíveis.
Exemplo de comando para Frida:
```bash
frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
```
## **Método 4 Engenharia Reversa & Modificação de Código**
Ferramentas de engenharia reversa como `APKTool`, `dex2jar` e `JD-GUI` podem ser usadas para descompilar um aplicativo Android, ler seu código-fonte e entender seu mecanismo de autenticação. Os passos geralmente incluem:
1. **Descompilando o APK**: Converter o arquivo APK para um formato mais legível por humanos (como código Java).
2. **Analisando o Código**: Procurar pela implementação da autenticação por impressão digital e identificar possíveis fraquezas (como mecanismos de fallback ou verificações de validação inadequadas).
3. **Recompilando o APK**: Após modificar o código para contornar a autenticação por impressão digital, o aplicativo é recompilado, assinado e instalado no dispositivo para testes.
## **Método 5 Usando Ferramentas de Autenticação Personalizadas**
Existem ferramentas e scripts especializados projetados para testar e contornar mecanismos de autenticação. Por exemplo:
1. **Módulos MAGISK**: MAGISK é uma ferramenta para Android que permite aos usuários fazer root em seus dispositivos e adicionar módulos que podem modificar ou falsificar informações em nível de hardware, incluindo impressões digitais.
2. **Scripts Personalizados**: Scripts podem ser escritos para interagir com o Android Debug Bridge (ADB) ou diretamente com o backend do aplicativo para simular ou contornar a autenticação por impressão digital.
---
## **Método 6 Hook Frida Universal para `BiometricPrompt` (API 28-34)**
Em 2023, um script Frida da comunidade chamado **Universal-Android-Biometric-Bypass** apareceu no CodeShare. O script intercepta todas as sobrecargas de `BiometricPrompt.authenticate()` assim como o legado `FingerprintManager.authenticate()` e aciona diretamente `onAuthenticationSucceeded()` com um **`AuthenticationResult` fabricado contendo um `CryptoObject` nulo**. Como se adapta dinamicamente aos níveis de API, ainda funciona no Android 14 (API 34) se o aplicativo alvo não realizar **verificações criptográficas no `CryptoObject` retornado**.
```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
* Tudo acontece no espaço do usuário nenhum exploit de kernel ou root é necessário.
* O ataque permanece totalmente silencioso para a UI: o diálogo biométrico do sistema nunca aparece.
* Mitigação: **sempre verifique `result.cryptoObject` e seu cifrador/assinatura antes de desbloquear recursos sensíveis**.
## **Method 7 Downgrade / Fallback Manipulation**
A partir do Android 11, os desenvolvedores podem especificar quais autenticadores são aceitáveis através de `setAllowedAuthenticators()` (ou o mais antigo `setDeviceCredentialAllowed()`). Um ataque de **runtime hooking** pode forçar o campo de bits `allowedAuthenticators` para o valor mais fraco `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 o aplicativo **não** validar posteriormente o `AuthenticationResult` retornado, um atacante pode simplesmente pressionar o botão de fallback _PIN/Pattern_ ou até mesmo registrar uma nova biometria fraca para obter acesso.
## **Método 8 CVEs de Nível de Fornecedor / Kernel**
Fique atento aos boletins de segurança do Android: vários bugs recentes do lado do kernel permitem escalonamento de privilégios local através do HAL de impressão digital e efetivamente **desativam ou encurtam o pipeline do sensor**. Exemplos incluem:
* **CVE-2023-20995** erro de lógica em `captureImage` de `CustomizedSensor.cpp` (Pixel 8, Android 13) permitindo a bypass de desbloqueio sem interação do usuário.
* **CVE-2024-53835 / CVE-2024-53840** “possível bypass biométrico devido a uma causa raiz incomum” corrigido no **boletim de Pixel de dezembro de 2024**.
Embora essas vulnerabilidades visem a tela de bloqueio, um testador com root pode encadeá-las com falhas em nível de aplicativo para contornar biométricas dentro do aplicativo também.
---
### Lista de Verificação de Fortalecimento para Desenvolvedores (Notas Rápidas para Pentester)
* Aplique `setUserAuthenticationRequired(true)` e `setInvalidatedByBiometricEnrollment(true)` ao gerar chaves do **Keystore**. Uma biometria válida é então necessária antes que a chave possa ser usada.
* Rejeite um `CryptoObject` com **null ou cifra / assinatura inesperada**; trate isso como um erro fatal de autenticação.
* Ao usar `BiometricPrompt`, prefira `BIOMETRIC_STRONG` e **nunca recorra a `BIOMETRIC_WEAK` ou `DEVICE_CREDENTIAL`** para ações de alto risco.
* Fixe a versão mais recente do `androidx.biometric` (≥1.2.0-beta02) lançamentos recentes adicionam verificações automáticas de cifra nula e restringem combinações de autenticadores permitidas.
## Referências
- [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}}