为了更实用一点,而不仅仅是理论上的,我在xda-developers上发布了一些补丁,以在当前唯一支持 NFC 的 Android 手机(Nexus S)上启用卡模拟模式。您和其他人可能对自己玩卡模拟模式感兴趣。考虑到这仅用于实验目的。
它们适用于 AOSP 源的姜饼 2.3.4_r1 版本。他们允许:
- 在 Nexus S 上启用 NFC 卡模拟模式。此模式始终启用。
- 禁用读卡器模式,让卡仿真成为唯一的工作。
- 选择外部安全元件(在 UICC 中)而不是嵌入式安全元件(在 SmartMX 芯片中)。
- 虽然不相关,但删除了蓝牙可发现性选项的时间限制。
到目前为止,我对 Android 上的 NFC 卡仿真的发现:
- 默认情况下,库存图像上禁用卡仿真,需要修改固件。Nfc 系统应用程序和 libnfc-nxp 系统库的改动是值得关注的地方。
- Nexus S 中的嵌入式 SmartMX 芯片以双智能卡的形式呈现。一个基于可编程的(允许在其上安装小卡片)和一个 4K Mifare 的。
- 4K Mifare 卡具有默认密钥,因此可以从外部读卡器写入/读取。
- 可编程卡应该是GP兼容的,但除了 Google 之外没有人可以摆弄它,因为访问密钥是不公开的。
- Nexus S 确实支持 SWP 并允许使用位于 UICC 内的安全元件进行操作。
- 应用程序不能直接访问安全元素的任何内容。一方面,嵌入式 SE 无法访问,因为我们不知道密钥。另一方面,外部元素可通过 SWP(连接到 NFC 控制器)从外部访问,但不能在内部访问,因为 AFAIK SIM 插槽未通过其他方式连接到 NFC 控制器。这给我们留下了唯一的途径,即基带处理器。但是 BB 固件是专有的,由制造商控制。三星尚未在其 BB 固件中实施3GPP TS 27.007 技术规范以与其交互。
- OTA 访问外部 SE 应该是可能的,这掌握在 MNO 的手中。其中一些可能提供 TSM 服务以允许第 3 方访问 UICC 内的 SE。
顺便说一句,您提到的技术(NFC-WI)已经在 Nexus S 中使用,用于将 NFC 控制器与嵌入式安全元件互连。
更新
总而言之,我回答 Sten 的问题:
由于 Mifare 4K 区域有默认密钥,任何拥有外部 NFC 读取器的人都可以更改密钥并在那里安全地存储值 - 是否正确?你试过了吗?这有什么困难吗?
简短的回答是的,我确实从外部阅读器访问了 Mifare 4K。我也能够修改默认键。困难来自修改系统源和自己构建自定义固件。
使用外部 NFC 阅读器是访问 Mifare 空间的唯一方法吗?
理论上没有。另一种选择是将 APDU 发送到 SIM,其中包含要在 Mifare 卡上执行的 Mifare 命令。
例如,安装在 Android 手机上的应用程序可以使用某些 API(通过 NFC 控制器和 NFC-WI 路径)读取/写入 Mifare 4K 的一些数据吗?例如,seek-for-android 可以在那里提供帮助吗?
暂时没有。尽管您使用 seek-for-android 补丁修改了 AOSP 源代码(我自己做了),但您的应用程序只会因库存手机而崩溃。原因是他们没有实施3GPP TS 27.007 技术规范,该规范允许应用处理器直接向 SIM (UICC) 发送 APDU。
然而,隧道前方可能会有一些曙光,因为法国的citizy项目已经在 Android 手机上使用 NFC 技术的安全元件模式,采用 UICC 安全元件方法。事实上,三星 Galaxy SII型号正在使用中,新的Acer Liquid Express也将很快集成到 citizy 中。这些手机必须在其基带处理器固件中实现所需的 TS 27.007 规范。说到应用处理器,我不知道他们是从 G&D 路径中获取 SEEK-for-android 还是从 Insecure 获取 OpenNFC。作为法国人,我会在最后一场比赛中全押。