一、背景
复某微发行的 FM11RF08(S) 作为 M1 卡的对标卡,其提供了对于数据的加密保护。相对于 NXP 原厂的卡,能够有效避免类如 NACK、Nested 攻击。
最初在 2024 年 8 月 12 日,来自夸克实验室的 Philippe Teuwen 发表了题目为 MIFARE Classic: exposing the static encrypted nonce variant 的论文。在 2024 年 11 月 8 日的时候修订提交了第二版。在文章中,完整地描述了来自复某微 FM11RF08(S) 芯片存在后门密钥和可预测随机数的问题。通过这些问题,可以在很短的时间内解密全加密卡,除了全量更换卡片外,没有好的解决方案。
在论文中提到了三种不同的攻击方式,而目前大部分网上的推文都仅关注了一种方式,所以认为影响范围不大。而实际上,目前市面上的 M1 卡加密已经形同虚设,CPU 卡将是大势所趋。
二、攻击方式
在论文中提到了三种不同的攻击方式,用于不同的场景。
1. 利用官方 API 读取零扇区全部内容
这一种方式是最简单的,也是令我感到最奇怪的。这看起来似乎是官方预留的后门。将 0 块的数据发送到复某微提供的 API 接口,就可以获得整个零扇区的 keyA 密钥,而 不论 是否对零扇区进行加密。由于 0 块是不加密的,因此可以直接获得 0 块 ~ 3 块的全部数据。
1
2
3
wget -q --header=
"Content-Type: application/text; charset=utf-8"
--post-data
"1C4C7563460804000475DE7AFD3B8890"
-O -
https:
//rfid
.fm-uivs.com
/nfcTools/api/getKeyA
| json_pp
1
2
3
4
5
{
"code"
:
0
,
"data"
:
"0543C7A1F992"
,
"message"
:
"success"
}
后面论文也提到,还发现了一个专用于读取零扇区的密钥 A31667A8CEC1
。因此读取零扇区有以下三种方式,后面两种应当是 不得 存在量产卡中的:
通过预先设置的加密密钥
通过复某微 API 请求密钥
后门密钥
2、利用后门密钥读取所有数据内容
这里加了 数据 限定是由于这种方法只能够读取所有的数据块内容,而不能够读取控制块的内容。
论文中提到,通过 fuzz 的方式获取到 A396EFA4E24F
这一个密钥。如果使用该密钥对 任一 扇区进行鉴权,即可获得其他 所有 扇区的读取权。
1
hf mf ecfill -c 4 --key A396EFA4E24F
这个方案可以导出数据,也可以嗅探到 nonce,但是无法导出密钥,所以似乎是无法实现复制卡的。但是,事实上 Crypto-1 的加密算法强度并没有那么高,只要 让读卡器认为密码正确 就行了。因此,伪造卡的风险很高。
3、利用可预测伪随机数进行全卡解密
相对于前两种方法,这个方法我更倾向于是 Crypto-1 算法和芯片设计缺陷。
由于历史的局限性,当时并没有办法实现高强度的加密握手。而且,NFC 卡本身不内置电源,且功耗极其有限,因此在当时没有办法使用真随机数发生器采集足够的熵源,于是采用了 LFSR 的方式生成伪随机数序列用于握手 nonce。(当然,随着时代发展,一些加密算法被硬件实现,其功耗能做到很低,安全性又很高。因此现在 CPU 卡在没有后门的情况下,基本是不太可能被攻破的)
不过,尽管 Crypto-1 算法先天具有一定问题,但是,在全加密的情况下想要破解,也是需要很长的时间。而复某微似乎在特定情况下,会将 同一个 明文使用两个 不同的 密钥进行加密,因此给破解带来了很大的便利。
论文作者给出了一个脚本,但是没有提供预编译的工具。于是现在对 Windows 环境进行了适配,kazutoiris/pm3-fudan 里面提供了脚本和相关工具,用于在 Windows 上测试当前的卡是否存在问题,如果存在问题将会自动全卡解密转储。(你需要提前拥有 PM3)
经过测试,之前一些全加密无漏洞卡只需要 5 分钟左右就可以全部转储。
验证方法
之前认为只有 FM11RF08S 一款受到影响,但是通读论文后,发现相关的 M1 卡、CPU 混合卡似乎都存在有相同的问题。
确认的方式是通过后门密钥 A31667A8CEC1
、 A396EFA4E24F
等尝试是否能够读取数据。
后记
如今,如今再使用 M1 卡已经不再安全,而 CPU 卡的价格也并没有非常高昂,全面更新卡片是 极其必要 的。
附录
工具用法
kazutoiris/pm3-fudan 里面提供了脚本和相关工具,用于在 Windows 上测试当前的卡是否存在问题,如果存在问题将会自动全卡解密转储。(你需要提前拥有 PM3)
1
python fm11rf08s_recovery.py --port COM1
参考文献
Teuwen, P. (2024). MIFARE Classic: Exposing the Static Encrypted Nonce Variant . Cryptology ePrint Archive, Paper 2024/1275. Retrieved from https://eprint.iacr.org/2024/1275
最后于 34分钟前
被wx_张三_488编辑
,原因: