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

113 lines
12 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}}
## **Method 1 Bypassing with No Crypto Object Usage**
Основна увага тут приділяється _onAuthenticationSucceeded_ зворотному виклику, який є критично важливим у процесі аутентифікації. Дослідники з WithSecure розробили [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), що дозволяє обійти NULL _CryptoObject_ в _onAuthenticationSucceeded(...)_. Скрипт примусово викликає автоматичне обхід аутентифікації за відбитком пальця під час виклику методу. Нижче наведено спрощений фрагмент, що демонструє обхід у контексті Android Fingerprint, повна програма доступна на [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();
}
});
```
Команда для запуску скрипта Frida:
```bash
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js
```
## **Метод 2 Підхід обробки виключень**
Ще один [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) від WithSecure вирішує проблему обходу небезпечного використання криптооб'єктів. Скрипт викликає _onAuthenticationSucceeded_ з _CryptoObject_, який не був авторизований за допомогою відбитка пальця. Якщо додаток намагається використовувати інший об'єкт шифру, це викличе виключення. Скрипт готується викликати _onAuthenticationSucceeded_ і обробляти _javax.crypto.IllegalBlockSizeException_ у класі _Cipher_, забезпечуючи, щоб наступні об'єкти, які використовуються додатком, були зашифровані новим ключем.
Команда для запуску скрипта Frida:
```bash
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js
```
Після досягнення екрану відбитків пальців та ініціації `authenticate()`, введіть `bypass()` у консолі Frida, щоб активувати обхід:
```
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()
```
## **Метод 3 Інструментальні Фреймворки**
Інструментальні фреймворки, такі як Xposed або Frida, можуть бути використані для підключення до методів додатка під час виконання. Для аутентифікації за відбитком пальця ці фреймворки можуть:
1. **Мокати Виклики Аутентифікації**: Підключившись до методів `onAuthenticationSucceeded`, `onAuthenticationFailed` або `onAuthenticationError` класу `BiometricPrompt.AuthenticationCallback`, ви можете контролювати результат процесу аутентифікації за відбитком пальця.
2. **Обійти SSL Пінінг**: Це дозволяє зловмиснику перехоплювати та змінювати трафік між клієнтом і сервером, потенційно змінюючи процес аутентифікації або крадучи чутливі дані.
Приклад команди для Frida:
```bash
frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
```
## **Метод 4 Реверс-інжиніринг та модифікація коду**
Інструменти реверс-інжинірингу, такі як `APKTool`, `dex2jar` та `JD-GUI`, можуть бути використані для декомпіляції Android-додатку, читання його вихідного коду та розуміння його механізму аутентифікації. Кроки зазвичай включають:
1. **Декомпіляція APK**: Перетворення файлу APK у більш зрозумілий формат (наприклад, Java-код).
2. **Аналіз коду**: Пошук реалізації аутентифікації за відбитками пальців та виявлення потенційних вразливостей (наприклад, механізмів резервного копіювання або неналежних перевірок валідації).
3. **Рекомпіляція APK**: Після модифікації коду для обходу аутентифікації за відбитками пальців, додаток рекомпілюється, підписується та встановлюється на пристрій для тестування.
## **Метод 5 Використання спеціалізованих інструментів аутентифікації**
Існують спеціалізовані інструменти та скрипти, призначені для тестування та обходу механізмів аутентифікації. Наприклад:
1. **MAGISK Модулі**: MAGISK це інструмент для Android, який дозволяє користувачам рутувати свої пристрої та додавати модулі, які можуть модифікувати або підробляти інформацію на апаратному рівні, включаючи відбитки пальців.
2. **Скрипти на замовлення**: Скрипти можуть бути написані для взаємодії з Android Debug Bridge (ADB) або безпосередньо з бекендом додатку для симуляції або обходу аутентифікації за відбитками пальців.
---
## **Метод 6 Універсальний Frida Hook для `BiometricPrompt` (API 28-34)**
У 2023 році на CodeShare з'явився скрипт Frida, що отримав назву **Universal-Android-Biometric-Bypass**. Скрипт перехоплює кожне перевантаження `BiometricPrompt.authenticate()` а також застаріле `FingerprintManager.authenticate()` і безпосередньо викликає `onAuthenticationSucceeded()` з **сфабрикованим `AuthenticationResult`, що містить null `CryptoObject`**. Оскільки він динамічно адаптується до рівнів API, він все ще працює на Android 14 (API 34), якщо цільовий додаток не виконує **жодних криптографічних перевірок на повернутому `CryptoObject`**.
```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
```
Ключові ідеї
* Все відбувається в просторі користувача не потрібен експлойт ядра або root.
* Атака залишається повністю непомітною для UI: діалог біометричної системи ніколи не з'являється.
* Пом'якшення: **завжди перевіряйте `result.cryptoObject` та його шифр/підпис перед розблокуванням чутливих функцій**.
## **Метод 7 Маніпуляція з пониженням / резервним копіюванням**
Починаючи з Android 11, розробники можуть вказувати, які аутентифікатори є прийнятними через `setAllowedAuthenticators()` (або старіший `setDeviceCredentialAllowed()`). Атака **runtime hooking** може примусити бітове поле `allowedAuthenticators` до слабшого значення `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
};
```
Якщо додаток **не** перевіряє повернений `AuthenticationResult`, зловмисник може просто натиснути кнопку _PIN/Pattern_ для резервного доступу або навіть зареєструвати нову слабку біометрію для отримання доступу.
## **Метод 8 Уразливості на рівні постачальника / ядра**
Слідкуйте за бюлетенями безпеки Android: кілька недавніх помилок на стороні ядра дозволяють локальне підвищення привілеїв через HAL для відбитків пальців і фактично **відключають або короткочасно замикають сенсорний потік**. Приклади включають:
* **CVE-2023-20995** логічна помилка в `captureImage` файлу `CustomizedSensor.cpp` (Pixel 8, Android 13), що дозволяє обійти розблокування без взаємодії з користувачем.
* **CVE-2024-53835 / CVE-2024-53840** “можливе обхід біометрії через незвичайну кореневу причину”, виправлено в **бюлетені Pixel за грудень 2024 року**.
Хоча ці вразливості націлені на екран блокування, тестер з правами root може поєднати їх з недоліками на рівні додатків, щоб обійти біометрію в додатку.
---
### Контрольний список посилення безпеки для розробників (Швидкі нотатки для пентестера)
* Вимагайте `setUserAuthenticationRequired(true)` та `setInvalidatedByBiometricEnrollment(true)` при генерації ключів **Keystore**. Дійсна біометрія буде потрібна перед використанням ключа.
* Відхиляйте `CryptoObject` з **null або несподіваним шифром / підписом**; розглядайте це як фатальну помилку аутентифікації.
* При використанні `BiometricPrompt` надавайте перевагу `BIOMETRIC_STRONG` і **ніколи не повертайтеся до `BIOMETRIC_WEAK` або `DEVICE_CREDENTIAL`** для дій з високим ризиком.
* Закріпіть останню версію `androidx.biometric` (≥1.2.0-beta02) недавні випуски додають автоматичні перевірки на null-шифри та посилюють дозволені комбінації аутентифікаторів.
## Посилання
- [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}}