์ƒ์ฒด ์ธ์ฆ ์šฐํšŒ (์•ˆ๋“œ๋กœ์ด๋“œ)

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

๋ฐฉ๋ฒ• 1 โ€“ ์•”ํ˜ธํ™” ๊ฐ์ฒด ์‚ฌ์šฉ ์—†์ด ์šฐํšŒํ•˜๊ธฐ

์—ฌ๊ธฐ์„œ ์ดˆ์ ์€ ์ธ์ฆ ๊ณผ์ •์—์„œ ์ค‘์š”ํ•œ onAuthenticationSucceeded ์ฝœ๋ฐฑ์— ์žˆ์Šต๋‹ˆ๋‹ค. WithSecure์˜ ์—ฐ๊ตฌ์ž๋“ค์€ NULL _CryptoObject_๋ฅผ _onAuthenticationSucceeded(โ€ฆ)_์—์„œ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” Frida ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ง€๋ฌธ ์ธ์ฆ์„ ์ž๋™์œผ๋กœ ์šฐํšŒํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ง€๋ฌธ ์ปจํ…์ŠคํŠธ์—์„œ ์šฐํšŒ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์กฐ๊ฐ์ด๋ฉฐ, ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ 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();
}
});

Frida ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น:

frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js

Method 2 โ€“ Exception Handling Approach

Another Frida script by WithSecure addresses bypassing insecure crypto object usage. The script invokes onAuthenticationSucceeded with a CryptoObject that hasnโ€™t been authorized by a fingerprint. If the application tries to use a different cipher object, it will trigger an exception. The script prepares to invoke onAuthenticationSucceeded and handle the javax.crypto.IllegalBlockSizeException in the Cipher class, ensuring subsequent objects used by the application are encrypted with the new key.

Frida ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น:

frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js

์ง€๋ฌธ ํ™”๋ฉด์— ๋„๋‹ฌํ•˜๊ณ  authenticate()๊ฐ€ ์‹œ์ž‘๋˜๋ฉด, Frida ์ฝ˜์†”์— 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()

Method 3 โ€“ Instrumentation Frameworks

Instrumentation frameworks like Xposed or Frida๋Š” ๋Ÿฐํƒ€์ž„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”์„œ๋“œ์— ํ›…์„ ๊ฑธ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋ฌธ ์ธ์ฆ์˜ ๊ฒฝ์šฐ, ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š”:

  1. ์ธ์ฆ ์ฝœ๋ฐฑ ๋ชจ์˜: BiometricPrompt.AuthenticationCallback์˜ onAuthenticationSucceeded, onAuthenticationFailed, ๋˜๋Š” onAuthenticationError ๋ฉ”์„œ๋“œ์— ํ›…์„ ๊ฑธ์–ด ์ง€๋ฌธ ์ธ์ฆ ํ”„๋กœ์„ธ์Šค์˜ ๊ฒฐ๊ณผ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. SSL ํ•€๋‹ ์šฐํšŒ: ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, ์ธ์ฆ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Frida์˜ ์˜ˆ์ œ ๋ช…๋ น:

frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in

Method 4 โ€“ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ์ฝ”๋“œ ์ˆ˜์ •

๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋„๊ตฌ์ธ APKTool, dex2jar, ๋ฐ JD-GUI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋””์ปดํŒŒ์ผํ•˜๊ณ , ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ , ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. APK ๋””์ปดํŒŒ์ผ: APK ํŒŒ์ผ์„ ๋” ์ธ๊ฐ„์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•์‹(์˜ˆ: Java ์ฝ”๋“œ)์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ฝ”๋“œ ๋ถ„์„: ์ง€๋ฌธ ์ธ์ฆ์˜ ๊ตฌํ˜„์„ ์ฐพ์•„๋ณด๊ณ  ์ž ์žฌ์ ์ธ ์•ฝ์ (์˜ˆ: ๋Œ€์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋˜๋Š” ๋ถ€์ ์ ˆํ•œ ๊ฒ€์ฆ ๊ฒ€์‚ฌ)์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  3. APK ์žฌ์ปดํŒŒ์ผ: ์ง€๋ฌธ ์ธ์ฆ์„ ์šฐํšŒํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ํ›„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์ปดํŒŒ์ผํ•˜๊ณ  ์„œ๋ช…ํ•œ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์žฅ์น˜์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Method 5 โ€“ ์‚ฌ์šฉ์ž ์ •์˜ ์ธ์ฆ ๋„๊ตฌ ์‚ฌ์šฉ

์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์šฐํšŒํ•˜๋„๋ก ์„ค๊ณ„๋œ ์ „๋ฌธ ๋„๊ตฌ์™€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  1. MAGISK ๋ชจ๋“ˆ: MAGISK๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์žฅ์น˜๋ฅผ ๋ฃจํŒ…ํ•˜๊ณ  ์ง€๋ฌธ์„ ํฌํ•จํ•œ ํ•˜๋“œ์›จ์–ด ์ˆ˜์ค€ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์Šคํ‘ธํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Android ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํฌ๋ฆฝํŠธ: Android Debug Bridge (ADB)์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฑ์—”๋“œ์™€ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์ง€๋ฌธ ์ธ์ฆ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ฑฐ๋‚˜ ์šฐํšŒํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Method 6 โ€“ BiometricPrompt(API 28-34)๋ฅผ ์œ„ํ•œ ์œ ๋‹ˆ๋ฒ„์„ค Frida ํ›…

2023๋…„, Universal-Android-Biometric-Bypass๋ผ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ Frida ์Šคํฌ๋ฆฝํŠธ๊ฐ€ CodeShare์— ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” BiometricPrompt.authenticate()์˜ ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ์™€ ๋ ˆ๊ฑฐ์‹œ FingerprintManager.authenticate()๋ฅผ ํ›…ํ‚นํ•˜๊ณ , **null CryptoObject๋ฅผ ํฌํ•จํ•˜๋Š” ์กฐ์ž‘๋œ AuthenticationResult**๋กœ onAuthenticationSucceeded()๋ฅผ ์ง์ ‘ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. API ๋ ˆ๋ฒจ์— ๋™์ ์œผ๋กœ ์ ์‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ˜ํ™˜๋œ CryptoObject์— ๋Œ€ํ•ด ์•”ํ˜ธํ™” ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Android 14(API 34)์—์„œ๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

# 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

  • ๋ชจ๋“  ์ž‘์—…์€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค โ€“ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡์ด๋‚˜ ๋ฃจํŠธ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ณต๊ฒฉ์€ UI์— ์™„์ „ํžˆ ์นจ๋ฌต์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค: ์‹œ์Šคํ…œ ์ƒ์ฒด ์ธ์‹ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์™„ํ™”: ๋ฏผ๊ฐํ•œ ๊ธฐ๋Šฅ์„ ์ž ๊ธˆ ํ•ด์ œํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ result.cryptoObject์™€ ๊ทธ ์•”ํ˜ธ/์„œ๋ช…์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Method 7 โ€“ Downgrade / Fallback Manipulation

Android 11๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์ž๋Š” setAllowedAuthenticators() (๋˜๋Š” ์ด์ „์˜ setDeviceCredentialAllowed())๋ฅผ ํ†ตํ•ด ํ—ˆ์šฉ๋˜๋Š” ์ธ์ฆ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ํ›„ํ‚น ๊ณต๊ฒฉ์€ allowedAuthenticators ๋น„ํŠธ ํ•„๋“œ๋ฅผ ๋” ์•ฝํ•œ 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
};

์•ฑ์ด ๋ฐ˜ํ™˜๋œ AuthenticationResult๋ฅผ ๊ฒ€์ฆํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” ๋‹จ์ˆœํžˆ PIN/Pattern ๋Œ€์ฒด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์•ฝํ•œ ์ƒ์ฒด ์ธ์‹์„ ๋“ฑ๋กํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 8 โ€“ ๊ณต๊ธ‰์—…์ฒด / ์ปค๋„ ์ˆ˜์ค€ CVE

์•ˆ๋“œ๋กœ์ด๋“œ ๋ณด์•ˆ ๊ฒŒ์‹œํŒ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ณด์„ธ์š”: ์ตœ๊ทผ ์ปค๋„ ์ธก ๋ฒ„๊ทธ ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์ง€๋ฌธ HAL์„ ํ†ตํ•ด ๋กœ์ปฌ ๊ถŒํ•œ ์ƒ์Šน์„ ํ—ˆ์šฉํ•˜๊ณ  ์„ผ์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • CVE-2023-20995 โ€“ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์—†์ด ์ž ๊ธˆ ํ•ด์ œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” CustomizedSensor.cpp์˜ captureImage์—์„œ์˜ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ (Pixel 8, Android 13).
  • CVE-2024-53835 / CVE-2024-53840 โ€“ โ€œ๋น„์ •์ƒ์ ์ธ ๊ทผ๋ณธ ์›์ธ์œผ๋กœ ์ธํ•œ ๊ฐ€๋Šฅํ•œ ์ƒ์ฒด ์ธ์‹ ์šฐํšŒโ€๊ฐ€ 2024๋…„ 12์›” Pixel ๊ฒŒ์‹œํŒ์—์„œ ํŒจ์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์€ ์ž ๊ธˆ ํ™”๋ฉด์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€๋งŒ, ๋ฃจํŒ…๋œ ํ…Œ์Šคํ„ฐ๋Š” ์•ฑ ์ˆ˜์ค€์˜ ๊ฒฐํ•จ๊ณผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ธ์•ฑ ์ƒ์ฒด ์ธ์‹์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฐ•ํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ (๋น ๋ฅธ ํŽœํ…Œ์Šคํ„ฐ ๋…ธํŠธ)

  • Keystore ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ setUserAuthenticationRequired(true) ๋ฐ setInvalidatedByBiometricEnrollment(true)๋ฅผ ๊ฐ•์ œ ์ ์šฉํ•˜์„ธ์š”. ์œ ํšจํ•œ ์ƒ์ฒด ์ธ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • null ๋˜๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์•”ํ˜ธ / ์„œ๋ช…์ด ์žˆ๋Š” CryptoObject๋ฅผ ๊ฑฐ๋ถ€ํ•˜์„ธ์š”; ์ด๋ฅผ ์น˜๋ช…์ ์ธ ์ธ์ฆ ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
  • BiometricPrompt๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, BIOMETRIC_STRONG์„ ์„ ํ˜ธํ•˜๊ณ  ๊ณ ์œ„ํ—˜ ์ž‘์—…์— ๋Œ€ํ•ด BIOMETRIC_WEAK ๋˜๋Š” DEVICE_CREDENTIAL๋กœ ์ ˆ๋Œ€ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ์ตœ์‹  androidx.biometric ๋ฒ„์ „(โ‰ฅ1.2.0-beta02)์„ ๊ณ ์ •ํ•˜์„ธ์š” โ€“ ์ตœ๊ทผ ๋ฆด๋ฆฌ์Šค๋Š” ์ž๋™ null-์•”ํ˜ธ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ—ˆ์šฉ๋œ ์ธ์ฆ์ž ์กฐํ•ฉ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธํ—Œ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ