12 KiB
BRIZZI HCE (Android NFC Host Card Emulation)
Dokumen ini menjelaskan struktur project, alur eksekusi, dan cara membacanya supaya kamu bisa langsung maintance/debug proyek ini.
1) Gambaran Umum
Project ini adalah aplikasi Android HCE (Host Card Emulation) yang memproses APDU dari reader NFC (misalnya terminal).
Komponen utamanya:
- BrizziHostApduService: service utama untuk menerima APDU.
- BrizziApduRouter: pemroses perintah dan state machine transaksi.
- BrizziSession: menjaga kondisi sesi saat ini (AID, auth, transaksi pending).
- BrizziCard / BrizziCardSnapshot: model data kartu virtual.
- BrizziSecureStorage: persistensi kartu terenkripsi.
- BrizziSecurityMetrics: monitoring keamanan dan incident readiness.
2) Bagaimana alur request APDU
- APDU masuk ke
processCommandApdu(...)diBrizziHostApduService. - Service melakukan:
- validasi basic (null/size/rate limit),
- log/track metrik event,
- dispatch ke
BrizziApduRouter.handle().
- Router:
- parse APDU via
ApduParser, - cek timeout sesi,
- cek replay untuk command sensitif,
- validasi state session (AID/auth/transaction),
- memetakan hasil ke SW response.
- parse APDU via
- Response SW/konten dikirim ke terminal.
3) State machine yang penting
BrizziSession menyimpan dua level state:
- SessionPhase
NONEAID1_SELECTEDAID3_SELECTEDAID3_AUTHENTICATED
- TransactionPhase
NONEDEBIT_PENDINGCREDIT_PENDINGLOG_PENDINGLAST_TXN_PENDING
hasPendingTransactionState() dipakai untuk mencegah abuse:
- command debit/credit tidak boleh overlapping,
- commit/abort (
C7/A7) harus disinkron.
4) Security hardening yang sudah diterapkan
- Parsing APDU tidak lagi pakai regex string mentah sepenuhnya; gunakan
ApduParseruntuk parse CLA/INS/P1/P2/Lc/Data/Le. - Validasi panjang dan malformed handling lebih ketat (
wrongLength,unsupportedInstruction,rateLimitExceeded, dll.). - Replay protection untuk command sensitif dalam window pendek.
- Rate limit:
- max 80 command / 1000ms,
- minimum gap antar command 30ms.
- Session timeout 120 detik.
FLAG_SECUREdi UI supaya tidak mudah di-screenshot.usesCleartextTraffic=falsedannetworkSecurityConfig.- Logging produksi diarahkan ke metadata minimal (tidak menyimpan raw APDU).
5) Penyimpanan data (yang dipilih)
Sebelum ini data ada di RAM. Sekarang:
BrizziSecureStoragemenyimpan data kartu keEncryptedSharedPreferences:card_number,balance,logs,lastTransactionDate, dsb.
- Kunci enkripsi berasal dari Android Keystore (
MasterKey). - Data dipersisten saat
committransaksi (C7) via callbackonCardUpdated. - Bila loading gagal, sistem fallback ke nilai default (
BrizziCard()).
Catatan: ini aman untuk tingkat aplikasi, namun bukan secure element hardware.
6) Monitoring & Incident readiness (point 5 yang kamu minta)
BrizziSecurityMetrics menyimpan counter event:
- command total/sukses/gagal,
- timeout, rate limit, replay,
- auth denied, parse fail, dan lain-lain.
Mechanism:
- service memanggil
track(event)untuk setiap event penting, - bila ambang incident terlampaui (mis.
COMMAND_RATE_LIMIT,REPLAY_DETECTED,AUTH_DENIED, dll), service logsecurity incidents(throttled per menit), - snapshot juga diekspor ke file internal:
app/files/security_metrics_report.txt.
Debug actions dari MainActivity
- Dump metrics (debug only):
adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_DUMP_METRICS
- Reset metrics (debug only):
adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_RESET_METRICS
- Lihat file log:
/data/data/com.korancrew.brizzi/files/security_metrics_report.txt
7) Command support (high level)
Di router, mapping didasarkan pada helper:
- AID selector (1/3):
905A...0100...,905A...0300... - AID 1 info/status
- AID 3 auth & read balance/log/transaction
- debit/credit
- write log + update last transaction + commit/abort
- fallback:
unsupportedInstruction(6D00)
Untuk daftar lengkap command literal, lihat:
- BrizziCommandCatalog
- implementasi detail di
handleParsed(...):
8) Cara memahami kode (urutan baca yang disarankan)
- BrizziHostApduService.kt – masuknya data APDU, rate limit, metrik.
- BrizziApduRouter.kt – policy/routing per command.
- BrizziSession.kt – state session/transaction.
- ApduParser.kt – struktur parser.
- BrizziCard.kt + BrizziSecureStorage.kt.
- BrizziSecurityMetrics.kt – event/incident.
- BrizziResponse.kt + Hex.kt.
9) Build & release yang dipakai sekarang
debug: non-minify (mudah debug).release: minify + shrink + ProGuard:- Signing release hanya aktif jika property gradle diisi (via CI keystore properties):
RELEASE_STORE_FILE,RELEASE_STORE_PASSWORD,RELEASE_KEY_ALIAS,RELEASE_KEY_PASSWORD.
10) Known caveat (buat pembacaan objektif)
- Banyak SW command belum sepenuhnya di-convert ke parser berbasis field; saat ini tetap berbasis string matching untuk backward compatibility.
- Jika ini akan dipakai di production nyata (bukan simulasi/prototype), perlu hardening tambahan:
- enkripsi/rotasi kunci lebih ketat,
- secure policy distribusi dan integrity update,
- backend attestation/monitoring terpusat.
11) Ringkas: arsitektur dalam satu kalimat
Ini adalah stateful HCE emulator: APDU masuk → rate-limit & parser → aturan fase sesi → update card/metrics → response status dengan persistensi terenkripsi + audit event.
12) Cara membaca kode (bisa dijadikan panduan debugging)
12.1 Alur end-to-end dalam 1 request
- Terminal mengirim APDU ke
BrizziHostApduService. processCommandApdu(...)memvalidasi ukuran, null, dan rate-limit di service.BrizziHostApduServicemenyerahkan APDU keBrizziApduRouter.handle(...).- Router memanggil
ApduParser.parse(...)untuk decode field CLA/INS/P1/P2/Lc/Data/Le. - Router memvalidasi:
- sesi timeout (
SESSION_TIMEOUT_MS), - replay untuk perintah sensitif (
REPLAY_WINDOW_MS), - state/phase yang valid (
BrizziSession), - format payload (contoh: debit/credit/write log/last transaction).
- sesi timeout (
- Jika valid, router memproses rule per command dan memodifikasi
pending*padasessionsertacardjika commit. - Response dibentuk dari
BrizziResponse(6700,6985,6FFF,9100, dll). - Service mencatat event ke
BrizziSecurityMetrics, menilai health, dan menulis snapshot kesecurity_metrics_report.txt.
12.2 Urutan file untuk dibaca dari atas ke bawah
- BrizziHostApduService.kt
- Titik masuk APDU dari HCE.
- Juga memegang rate-limit, incident throttle log, dan ekpor metrik.
- BrizziApduRouter.kt
- Aturan stateful command routing.
- Core logic transaksi debit/credit/log/last transaction/commit-abort.
- BrizziSession.kt
- Menjaga state sesi, fase autentikasi, fase transaksi, anti-replay, dan pending state.
- ApduParser.kt
- Parsing protokol APDU (case-1..case-4).
- BrizziCard.kt + BrizziSecureStorage.kt
- Struktur data card dan log transaksi; bagaimana data bertahan di penyimpanan terenkripsi.
- BrizziSecurityMetrics.kt
- Event tracking, incident threshold, snapshot/report.
12.3 Kontrak keamanan yang harus dipahami
- Syarat autentikasi: akses area saldo/log/last transaction hanya setelah fase
AID3_AUTHENTICATED. - Syarat transaksi: debit/credit harus dalam state siap transaksi, tidak boleh ada pending transaction lain.
- Commit/Abort:
C7/A7adalah pembatas akhir lifecycle transaksi. Tanpa pending state, kedua command itu ditolak. - Logika rollback: pending update hanya masuk ke state final saat
COMMIT;ABORTmembersihkan pending. - Replay guard: command sensitif (debit/credit/commit/abort/write log/last tx) tidak boleh diulang dalam window pendek.
12.4 Checklist membaca log saat debugging
- Jika terjadi
CONDITIONS_NOT_SATISFIEDberulang: cek urutan select-aid-auth-send command. - Jika
rateLimitExceededsering:- periksa apakah device reader terlalu cepat kirim command (<30ms antar command).
- pastikan transaksi tidak melebihi 80 command/s.
- Jika
COMMAND_PARSE_FAILEDnaik: cek command malformed (Lc/Le mismatch, trailing bytes, payload aneh). - Ambil snapshot metrik:
adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_DUMP_METRICS
- Hapus metrik jika perlu test ulang:
adb shell am start -n com.korancrew.brizzi/.MainActivity -a com.korancrew.brizzi.ACTION_RESET_METRICS
13) Peta ancaman & mitigasi singkat (ringkas)
- Replay → dibatasi window 800ms di router + deteksi command sensitif.
- Flood → dibatasi 80 cmd/1000ms + minimum 30ms antar command di service.
- Session theft/continuity → timeout 120 detik, reset state saat deactivated.
- Data disclosure →
FLAG_SECURE, cleartext dimatikan, keystore-backed storage untuk card state. - Silent fail di prod → metrik tidak menyimpan APDU mentah, hanya metadata event.
14) Paket uji cepat (smoke test) untuk koneksi reader
- Gunakan HCE_BRIZZI_SMOKE_TEST.md untuk menjalankan alur verifikasi:
- build/install,
- cek service + logcat,
- validasi interaksi AID/auth/transaksi ke reader.