本文主要是介绍practical on mifare,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
抽象的。
mifare Classic 是市场上使用最广泛的非接触式智能卡。 其设计和实施细节由制造商保密。 本文研究了该卡的体系结构以及卡与读卡器之间的通信协议。 然后,它提供了一种实用的、低成本的攻击,可以从卡的内存中恢复秘密信息。 由于伪随机生成器的弱点,我们能够恢复 CRYPTO1 流密码生成的密钥流。 我们利用流密码的延展性来读取卡第一个扇区的所有内存块。 此外,只要我们知道该扇区中的一个内存块,我们就可以读取卡内存的任何扇区。 最后,也许更具破坏性的是,修改内存块也是如此
1 简介
RFID 和非接触式智能卡如今已成为普遍技术。 在过去几年中,越来越多的系统采用该技术来替代条形码、磁条卡和纸质票据,用于各种应用。 非接触式卡由一小块可以无线访问的内存组成,但与 RFID 标签不同的是,它们还具有一些计算能力。 大多数这些卡都实现某种简单的对称密钥加密技术,这使得它们适合需要访问控制的应用程序。 许多备受瞩目的应用都使用非接触式智能卡进行访问控制。 例如,它们用于在多个公共交通系统中进行支付,例如香港的八达通卡1、伦敦的牡蛎卡2和荷兰的OV-Chipkaart3等。 许多国家已经将非接触式卡纳入其电子护照 [3],并且一些汽车制造商将其嵌入汽车钥匙中作为防盗方法。 许多办公楼甚至机场和军事基地等安全设施都使用非接触式智能卡进行访问控制。
一方面,无线接口具有实际优势:读卡器和卡之间没有机械部件,系统维护成本更低,更可靠,读取时间更短,提供更高的吞吐量。 另一方面,它代表了对隐私的潜在威胁[3],并且很容易受到以前不可能的中继、重放和窃取攻击。 市场上有各种各样的卡。 它们在尺寸、外壳、内存和计算能力方面有所不同。 它们提供的安全功能也有所不同。 mifare 是一个众所周知且广泛使用的系统。 mifare 是 NXP 半导体(原飞利浦)的一个产品系列。 据恩智浦称,全球约有 2 亿张 Mifare 卡在使用,覆盖非接触式智能卡市场的 85%。 mifare 系列包含四种不同类型的卡:Ultralight、Standard、DESFire 和 SmartMX。 mifare Classic 卡提供三种不同的内存大小:320B、1KB 和 4KB。 mifare Classic 是市场上使用最广泛的非接触式卡。 在本文中,我们重点关注这张卡。 mifare Classic 通过所谓的 CRYPTO1 流密码提供相互身份验证和数据保密。 该密码是恩智浦的专有算法,其设计是保密的。 Nohl 和 Plotz [7] 最近对芯片的硬件进行了逆向工程,并暴露了几个弱点。 其中,由于伪随机生成器的弱点,观察到用于身份验证的 32 位随机数只有 16 位熵。 他们还注意到伪随机生成器是无状态的。 他们声称了解确切的加密算法,该算法有助于对 48 位密钥进行离线强力攻击。 这种攻击在合理的时间内是可行的,特别是如果有专用硬件可用的话。
我们的贡献
我们使用 Proxmark III4 来分析 Mifare 卡并发起攻击。 为此,我们在 Proxmark 上实施了 ISO 14443-A 功能,因为当时仅实施了 ISO 14443-B。 我们在协议的物理层和更高层对读取器到标签和标签到读取器通信的处理和生成进行了编程。 固件的源代码可在公共领域获取5。 同时,独立于 Nohl 和 Plotz 结果,我们还注意到伪随机生成器的弱点。 我们的贡献有三个:首先,也是最重要的,利用伪随机生成器的弱点,并允许访问特定的 Mifare 卡,我们能够在不知道加密密钥的情况下恢复 CRYPTO1 流密码生成的密钥流。 其次,我们详细描述了标签和阅读器之间的通信。 最后,我们利用流密码的延展性来读取卡的第一个扇区(扇区零)的所有存储块(无需访问密钥)。 一般来说,只要我们知道该扇区中的一个内存块,我们就可以读取卡内存的任何扇区。 窃听交易后,我们始终能够读取该扇区中每个块的前 6 个字节,并且在大多数情况下还可以读取最后 6 个字节。 这些块中只剩下 4 个未公开的字节。
我们想强调的是,我们在发布结果之前已将我们的发现通知了恩智浦。 此外,我们让他们有机会与我们讨论如何在不损害他们(及其客户)直接利益的情况下发布我们的结果。 他们没有利用这个优惠。
我们攻击的后果
任何使用 Mifare Classic 卡且依赖于存储在零扇区的信息的保密性或真实性的系统现在都是不安全的。 我们的攻击在几分钟内恢复了该扇区的所有秘密信息。 它还允许我们修改存储在那里的任何信息。 其余扇区的大部分数据也是如此,具体情况而定。 此外,我们的攻击补充了 Nohl 和 Plotz 结果,为对密钥进行暴力攻击提供了必要的明文。 目前这项工作正在进行中。 本文概要 第 2 部分描述了 Mifare 卡的架构和通信协议。 第 3 节描述了用于发起攻击的硬件。 第 4 节通过示例跟踪讨论该协议。 第 5 节暴露了卡片设计中的弱点。 第 6 节描述了攻击本身。最后,第 8 节给出了一些结论性意见和详细的改进建议。
2 MIFARE 经典版
非接触式智能卡如今被用于许多应用中。 非接触式卡基于射频识别技术 (RFID) [1]。 1995年NXP(当时的飞利浦)推出了mifare6。 Mifare 的一些目标应用是公共交通、访问控制和活动票务。 mifare Classic [8] 卡是 mifare 产品系列的一员,符合 ISO 14443 第 3 部分的要求。ISO 14443 第 4 部分定义了高级协议,此处 NXP 的实施与标准不同。 2.1 节讨论了 ISO 标准的不同部分。
2.1 通信层
Mifare Classic 卡的通信层基于 ISO 14443 标准 [4]。 该 ISO 标准定义了识别卡、非接触式集成电路卡和感应卡的通信。 该标准由四部分组成。 第 1 部分描述了卡应能够运行的物理特性和环境。 第 2 部分定义了读卡器和卡之间的通信,反之亦然。 数据可以通过两种方式进行编码和调制:A 型和 B 型。mifare Classic 使用 A 型。有关 RFID 通信的更多详细信息,请参阅 Klaus Finkenzeller 编写的“RFID 手册”[1]。 第 3 部分描述初始化和防冲突协议。 当读卡器的读取范围内存在更多卡片时,需要防冲突以便选择特定的卡片。 成功初始化和防冲突后,卡处于活动状态并准备接收命令。 第 4 部分定义了如何发送命令。 这就是 mifare Classic 与 ISO 标准的不同之处,它使用专有且未公开的协议。 mifare Classic 从身份验证开始,之后所有通信都被加密。 每八位计算一个奇偶校验位以检测传输错误。 在 mifare Classic 协议中,该奇偶校验位也被加密,这意味着完整性检查只能在应用层中进行。
2.2 逻辑结构
Mifare Classic 卡原则上是一种几乎没有额外功能的存储卡。 存储器被分成16字节的数据块。 这些数据块被分组为扇区。 mifare Classic 1k 卡有 16 个扇区,每个扇区有 4 个数据块。 Mifare Classic 4k 卡的前 32 个扇区由 4 个数据块组成,其余 8 个扇区由 16 个数据块组成。 扇区的每个最后一个数据块称为扇区尾部。 图 1 显示了 Mifare Classic 4k 卡的内存示意图。请注意,扇区 0 的块 0 包含特殊数据。 前 4 个数据字节包含卡的唯一标识符 (UID),后跟其 1 字节位计数检查 (BCC)。 位计数检查是通过连续异或所有 UID 字节来计算的。 其余字节用于存储制造商数据。 该数据块是只读的。 在允许任何内存操作之前,读取器需要对扇区进行身份验证。 扇区尾部包含用于身份验证的密钥 A 和 B。 访问条件定义了该扇区可用的操作。
扇形拖车有特殊的进入条件。 密钥 A 永远不可读,密钥 B 可以配置为可读或不可读。 在这种情况下,存储器仅用于数据存储并且密钥B不能用作认证密钥。 除了访问条件(AC)和密钥之外,还剩下一个没有定义用途的数据字节(U)。 扇形拖车的示意图如图 2a 所示。 数据块用于存储任意数据,也可以配置为值块。 当用作值块时,带符号的 4 字节值将存储两次非反转和一次反转。 这里的取反意味着该值的每一位都与 1 进行异或运算。这四个字节是从左边的最低有效字节到右边的最高有效字节存储的。 剩余的四个字节用于存储可用作指针的 1 字节块地址。
2.3 命令
mifare Classic的命令集很小。 大多数命令都与数据块相关,并要求读取器对其包含的扇区进行身份验证。 每次执行命令时都会检查访问条件以确定是否允许。 数据块可以配置为只读。 限制的另一个示例可能是只能递减的值块。 读和写 读和写命令读取或写入一个数据块。 这是数据块或值块。 写命令可用于将数据块格式化为值块或仅存储任意数据。 递减、递增、恢复和传输 这些命令仅适用于格式化为值块的数据块。 递增和递减命令将递增或递减具有给定值的值块,并将结果放入内存寄存器中。 恢复命令将值加载到内存寄存器中而不进行任何更改。 最后通过传输命令将内存寄存器在同一块中传输或传输到另一个块中。
2.4 安全特性
mifare Classic 卡具有一些内置的安全功能。 通信由专有流密码 CRYPTO1 加密。
密钥
用于认证的 48 位密钥存储在每个扇区的扇区尾部中(参见第 2.2 节)。 mifare Classic 使用对称密钥。
身份验证协议
mifare Classic 根据 mifare 文档 [8] 使用基于 ISO 9798-2 的相互三通身份验证协议。 然而,事实证明这并不完全正确[2]。 在本文中,我们仅使用卡发送的第一个初始随机数。 读卡器发送扇区身份验证请求,卡将使用 32 位随机数 NC 进行响应。 然后,读取器发回该随机数的 8 字节答案,其中还包含读取器随机 NR。 该答案是认证过程开始后的第一条加密消息。 最后,卡发送 4 字节响应。 就我们的攻击而言,此描述捕获了所有必要的信息。
3 硬件和软件
RFID 系统由应答器(卡)和读取器组成[1]。 该读卡器包含射频模块、控制单元和卡耦合元件。 该卡包含耦合元件和微芯片。 支持 Mifare Classic 的读卡器的控制单元通常是具有封闭设计的 Mifare 微芯片。 该微芯片与应用软件通信并执行来自应用软件的命令。 请注意,命令的实际调制是由该微芯片完成的,而不是由应用软件完成的。 该卡的微芯片设计是封闭的,卡与读卡器之间的通信协议也是封闭的。 图 3:Proxmark III 我们想要评估 Mifare 系统的安全属性。 因此我们需要硬件来窃听交易。 它还应该可以像 Mifare 读卡器一样与卡进行通信。 Jonathan Westhues 开发的 Proxmark III 具有这些可能性7。 由于其灵活的设计,可以调整数字信号处理以支持特定的协议。 该器件支持低频 (125 kHz - 134 kHz) 和高频 (13.56 MHz) 信号处理。 来自天线的信号通过现场可编程门阵列 (FPGA) 路由。 该FPGA将信号中继到微控制器,并可用于在中继之前执行一些过滤操作。 该软件实现允许 Proxmark 窃听 RFID 标签和阅读器之间的通信(图 4)、模拟标签和阅读器。 在这种情况下,我们的标签将是 mifare Classic 卡。 尽管这些操作有基本的硬件支持,但数字化信号和(解)调制的实际处理需要针对每个特定应用进行编程。 Mifare Classic 卡的物理层是根据 ISO14443-A 标准 [4] 实现的。 我们必须实现 ISO14443-A 功能,因为它尚未实现。 这意味着我们必须在物理层和更高级别的协议中对读取器到标签和标签到读取器通信的处理和生成进行编程。 为了满足重放攻击的要求,我们添加了“hi14asnoop”函数来进行跟踪,“hi14areader”函数充当读卡器,“hi14asim”函数来模拟卡片。 我们添加了发送自定义奇偶校验位的可能性。 这是必需的,因为奇偶校验位是加密的一部分。
4 通讯特性
为了了解 Mifare Classic 通信是什么样子,我们对 Mifare 读卡器和卡之间的交易进行了跟踪。 通过这种方式,我们收集了许多痕迹,这让我们对 mifare Classic 的高级协议有了一些了解。 在本节中,我们将解释作为示例记录的跟踪,如图 5 所示。该跟踪包含事务的每个部分。 我们指的是我们讨论的消息的序列号(SEQ)。 来自读卡器的消息显示为 PCD(接近耦合设备)消息,来自卡的消息显示为 TAG 消息。 消息之间的时间以基本时间单位(ETU)显示。 一个 ETU 是位周期的四分之一,等于 1.18μs。 消息以十六进制表示。 如果字节的奇偶校验位不正确8,则以感叹号表示。 我们将只讨论最重要的消息。
防碰撞
阅读器启动 SELECT 过程。 读卡器发送 93 20 (#3),卡将以其唯一标识符 (#4) 进行响应。 读卡器发送 93 70 后跟 UID 和两个 CRC 字节 (#5) 以选择卡。
验证
该卡处于活动状态并准备好处理任何更高层的命令。 在 2.4 节中我们讨论了身份验证协议。 在图5中,消息#7到#10对应于认证。
读写器的认证请求为60 04 d1 3d (#07)。 第一个字节 60 代表使用密钥 A 的身份验证请求。对于使用密钥 B 的身份验证,第一个字节必须是 61。第二个字节表示读取器想要对块 4 进行身份验证。请注意,块 4 是扇区 1 的一部分,并且 因此,这是对扇区 1 的认证请求。最后两个字节是 CRC 字节。
加密通讯
成功验证后,卡就准备好处理扇区 1 的命令。可以清楚地识别命令的结构。 由于我们控制 mifare Classic 阅读器,我们知道发送了哪些命令。 消息#11 到#15 显示了如何执行增量。 增量后紧接着读取命令(#16 和#17)。
5、MIFARE Classic 的 个弱点
Nohl 和 Plotz 部分恢复了用于加密卡和读卡器之间通信的 CRYPTO1 算法 [7,5]。 卡上的伪随机生成器通过生成随机数来启动算法,其性能较弱。 在我们的分析中,我们利用这一弱点通过实际攻击扩展了 Nohl 和 Plótz 的工作,该攻击提供了暴力破解所需的已知明文以及 mifare Classic 协议的描述。 在这种攻击中,我们不需要了解 CRYPTO1 算法,只需要知道它是一种按位加密的流密码。 在我们的独立实验中,我们还通过请求许多卡随机数来注意到卡的伪随机生成器的弱点。 我们每小时能够请求大约 600,000 个随机数。 一小时内,随机数至少出现了四次。 随机数由线性反馈移位寄存器 (LFSR) [5] 生成,每 9.44µs 移位一次。 这恰好是通信中的一位周期。 因此,如果在正确的时间查询该卡,理论上随机数可以在 0.618 秒后重新出现。 在另一次过期中,我们尝试在卡上电后的固定时间请求随机数。 这样,我们可以将卡随机数减少到十个不同的随机数,从而减少等待时间。
在不知道密码算法的情况下,只能对密钥进行在线暴力攻击。 由于通信延迟,每次尝试需要 5 毫秒。 彻底的密钥搜索将需要 16,289,061 天,相当于大约 44,627 年。 当加密算法已知时,可以使用身份验证运行的一些窃听痕迹来发起离线强力攻击。 Nohl 和 Plotz 表示,如果使用价值约 17,000 美元的专用硬件,这大约需要一个小时。 为了使这种攻击起作用,需要一些已知的明文。 我们的分析提供了这个明文。
6 密钥流恢复攻击
在第 5 节中
我们讨论了 mifare Classic 伪随机生成器的一个弱点。 在本节中,我们部署一种方法来恢复在读卡器和卡之间先前记录的交易中使用的密钥流。 结果,通信的密钥流将被恢复。 对于这次攻击,我们需要拥有该卡。 以下原因使这种攻击变得有趣:
- 我们的攻击提供了对密钥进行暴力攻击所需的已知明文。
- 通过我们的攻击,我们恢复了有关字节命令的详细信息。
- 使用恢复的密钥流,我们可以在不知道密钥的情况下读取卡内容。
- 使用恢复的密钥流,我们还可以在不知道密钥的情况下修改卡的内容。
6.1 密钥流恢复
为了恢复密钥流,我们利用了伪随机生成器的弱点。 因为正是这个随机数与读取器的一个有效响应相结合才决定了剩余的密钥流。 对于此攻击,我们需要完全控制读卡器 (Proxmark) 并访问(正版)卡。 攻击包括以下步骤:
1.窃听读卡器和卡之间的通信。 例如,这可以在访问控制系统或公共交通系统中。
- 确保卡将使用与记录的通信相同的密钥流。 这是可能的,因为卡在合理的时间内重复相同的随机数,并且我们完全控制读卡器。
- 修改明文,以便卡接收我们在响应中知道明文的命令(例如,通过更改读取命令中的块号)。
- 对于已知明文的每个片段,计算相应的密钥流片段。
- 使用此密钥流对 1 中获得的跟踪进行部分解密。
- 尝试通过移位命令恢复更多密钥流位。
通信中的明文 P1 与密钥流 K 进行按位异或运算,得到加密数据 C1。 当可以在不同的明文 P2 上使用相同的密钥流并且 P1 或 P2 已知时,P1 和 P2 都会被揭示。
弱伪随机生成器使得重放早期记录的交易成为可能。 我们可以翻转密文位来尝试修改第一个命令,以便它给出另一个结果。 另一个结果给了我们另一个纯文本。 攻击就是基于这个原理。
6.2 密钥流映射
数据按位加密。 当读卡器发送或接收消息时,密钥流在读卡器和卡端都会移位该消息中的位数。 这是保持同步并使用相同的密钥流位来加密和解密所必需的。 流密码不使用任何反馈机制。 尽管如此,当我们尝试使用早期跟踪的已知密钥流来揭示消息序列的内容时,出现了问题。 我们记录了一个增量,然后是一个传输命令。 我们使用此跟踪来应用攻击,并将第一个命令更改为读取命令,该命令由 4 个命令字节组成,并提供 18 个响应字节。 与奇偶校验位一起使其成为 198 位流。 明文是已知的,因此我们恢复了 198 个密钥流位。 当我们使用这个密钥流将其映射到增量的原始轨迹上时(图 6),结果发现密钥流在第一个命令之后并不同相。 原因是卡的 4 位答案很短,后面没有奇偶校验位。 在我们最初的跟踪中,我们现在处于第一个响应字节的一半位置。 这意味着,再经过 4 个位后,我们就到达了原始迹线中的奇偶校验位。 然而,在我们的新跟踪中,我们位于下一个命令字节的一半。 为了纠正这个问题,我们需要丢弃最初用于加密奇偶校验位的密钥流位。 但是,当我们需要在新情况下解密奇偶校验位并且我们相对于第一个跟踪的半个字节时该怎么办? 解决方案是使用恢复的密钥流中的下一位来加密奇偶校验位,并使用该相同的密钥流位来解密下一个数据位。 由此我们可以得出结论,奇偶校验位是用密钥流位加密的,密钥流位也用于加密数据位
正如我们上面所描述的,以下方法成功地将密钥流映射到另一个消息序列上。 获取恢复的密钥流并从中去除位于奇偶校验位位置的所有密钥流位。 剩余的密钥流可用于加密新消息。 每次需要加密奇偶校验位时,请使用下一个密钥流位而不移位密钥流,在所有其他情况下使用下一个密钥流位并移位密钥流。
6.3 认证重放
要重播身份验证,我们首先需要跟踪真正的 Mifare 读卡器和卡之间的成功身份验证。 下面显示了一个身份验证后跟一个读取命令的示例。
在我们记录卡和读卡器之间的身份验证后,我们不会修改内存。 这确保了卡的内存保持不变,因此它将返回相同的明文。 现在我们将像 Mifare 读取器一样尝试启动相同的身份验证。 简而言之:
- 我们记录了真卡和读卡器之间成功验证的痕迹。
- 我们发送身份验证请求 (#1),直到获得与原始跟踪中的随机数 (#2) 相同的随机数。
- 我们将记录的响应 (#3) 发送到此随机数。 它由对挑战随机数的有效响应和来自读者的挑战组成。
- 我们从卡中检索对质询的响应 (#4)。
- 现在我们可以重新发送相同的命令(#5)或尝试修改它。
6.4 读取扇区零
我们将证明在不知道密钥的情况下可以从卡中读取扇区 0。 我们只需要真正的 Mifare 读卡器和卡之间进行一次交易。 每张 Mifare Classic 卡都有一些已知的内存内容。 NXP 发布的产品信息[8]给出了这一信息。 当读取扇区尾部时,卡将返回逻辑“0”而不是密钥 A,因为密钥 A 不可读。 如果密钥 B 不可读,卡也会返回逻辑“0”。 密钥B是否可读取决于访问条件。 可以使用制造商数据来恢复访问条件。 块 0 包含 UID 和 BCC,后跟制造商数据。 UID和BCC覆盖5个字节并且是已知的。 其余 11 个字节由制造商数据覆盖。 对不同卡(mifare Classic 1k 和 4k)的一些调查表明,制造商数据的前 5 个字节几乎永远不会改变。 这些字节 (MFR1) 覆盖了访问条件 (AC) 和未知字节 U 的位置,如图 7 所示。这意味着可以使用已知的 MFR1 字节通过读取块 0 和块 3(扇区尾部)来恢复密钥流 ) 随后。 请记住,访问条件在 3 个字节中存储两次。 一次反转和一次非反转。 这样就很容易检测我们是否确实泄露了访问条件。 当卡离开制造商时,未知字节 U 可以处于任何状态,但通常是 00 或 69。访问条件告诉我们密钥 B 是否可读。 在许多情况下,密钥 B 不可读,例如荷兰公共交通系统中使用的 OV-Chipkaart10。 制造商数据的前 5 个字节(图 7 中的 MFR1)恢复了扇区 0 的访问条件。由于扇区尾部的访问条件将密钥 B 定义为不可读,因此我们知道明文为零。 因此,整个扇区尾块被揭示,因此整个扇区0的内容也被揭示。
7 阅读高扇区
在 mifare Classic 卡的较高部分,我们没有制造商数据的进展。 我们基本上有扇区预告片和一些未知的数据块。 由于密钥 A,我们始终可以恢复前 10 个密钥流字节。 密钥 B 在大多数情况下不可读,因此会多提供 6 个密钥流字节,但会留下 4 个字节的间隙(AC 和 U)。 尽管实现起来比较困难,但这些部门存在受到损害的潜在威胁。
7.1 专有命令代码
在进行这项研究时,我们并不知道我们在攻击中泄露的命令代码已经可以在 NXP11 的示例固件中找到。 请注意,固件是指从 PC 发送到阅读器的命令代码。 我们的研究表明(也许显然)这些是从读卡器发送到卡的相同命令代码。 我们在传输配置中使用了带有默认密钥和空数据块的卡来揭示高级协议中使用的加密命令。 阅读器发送的所有命令均由一个命令字节、参数字节和两个 CRC 字节组成。 我们多次尝试通过修改该命令的密文来揭示该命令。 做到这一点的方法是假设我们实际上知道该命令。 有了这些“知识”,我们对密文进行异或运算,得到密钥流。 为了检查这是否确实是正确的密钥流,我们将其与我们知道响应的新命令进行异或。 如果我们猜对了初始命令,那么卡的响应将是已知的响应。 该方法显示了图 8 中所示的命令。现在,人们可以尝试再次重播相同的身份验证,并尝试执行返回 ACK 或 NACK 的命令,以恢复更多密钥流。 因为 ACK 或 NACK 的大小只有 4 位,所以它留下了一些我们知道密钥流的备用位。 我们可以使用这些位来执行我们现在知道明文的另一个命令。 结果,这提供了更多已知的密钥流,并且该方法可以重复应用。 然而,这种方法只有在允许减少、增加或转移的情况下才有效。 这些命令返回 ACK,因此总体上比读取命令短。 我们只能发送有效的命令,否则协议将中止。 读命令返回 16 个数据字节和 2 个 CRC 字节。 在执行写命令时,卡返回 4 位 ACK,这表明卡已准备好接收 16 个数据字节,后跟 2 个 CRC 字节。 递减、递增和恢复命令都遵循相同的过程。 卡通过发送 4 位 ACK 响应来表明它正在等待读卡器发送一个值。 该值是 4 个字节,后面跟着 2 个 CRC 字节。 对于恢复,该值被发送但不被使用。 该值以 YY YY YY YY ZZ ZZ 形式发送,其中 YY 是值字节,ZZ 是 CRC 字节。 最后,发送传输命令以将先前命令之一的结果传输到存储块。 如果顺利的话,卡响应是 ACK。 否则,它会响应 NACK。 4 位 ACK 为 0xa。 当不允许命令时,卡发送 0x4。 当检测到传输错误时,卡发送 0x5。 如果命令长度错误,卡甚至根本不会给出响应。 协议会在每次错误或不允许的命令时中止。
8 结论与建议
我们已经实施了一次成功的攻击,以恢复真正的 Mifare Classic 读卡器和卡之间早期记录的交易的密钥流。 我们将 Mifare Classic 读卡器与带有默认密钥的“空白”卡结合使用,以恢复专有协议中使用的字节命令。 知道字节命令和足够长的密钥流使我们能够执行任何操作,就好像我们拥有密钥一样。 我们设法读取卡的第 0 扇区的所有存储块,而无需访问密钥。 一般来说,只要我们知道该扇区中的一个内存块,我们就能够读取卡内存的任何扇区。 此外,在任何扇区上记录有效交易后,我们能够读取该扇区中任何块的前 6 个字节,如果密钥 B 是只读的,还可以读取最后 6 个字节。 同样,我们能够修改存储在特定扇区中的信息。 后果 首先,存储在卡上的所有数据(除了密钥本身)不应再被视为秘密。 特别是,如果 Mifare Classic 卡用于存储个人信息(如姓名、出生日期或旅行信息),这将构成直接的隐私风险。 安全风险相对较低,因为一般来说安全性是通过密钥的保密性来保证的。 请注意,特别是我们无法克隆卡,因为密钥仍然保密。 其次,卡上存储的数据的完整性和真实性不再可靠。 这是一个相当严重的安全风险。 在使用卡存储特定价值(例如忠诚度积分,甚至更糟糕的是某种形式的数字货币)的应用中,这一点尤其令人担忧。 忠诚度级别或存储在电子钱包中的价值可以很容易地增加(或减少,在拒绝服务类型的攻击中)。 第三,了解明文(或密钥流)是执行暴力(或其他更复杂的)攻击以恢复秘密密钥的必要条件。 我们在开发一种非常有效的攻击来恢复 Mifare Classic 卡的任意扇区密钥方面取得了良好进展。
建议
对于短期改进,我们建议不要使用零扇区来存储秘密信息。 将密钥 B 配置为可读并在其中存储随机信息。 不要在任何扇区的前 6 个字节中存储敏感信息。 在一笔交易中使用多个扇区身份验证来阻止攻击者尝试恢复明文。 仅当不允许值块命令时这才有用。 值块命令比读取命令短,并且将启用密钥流的移位。 对于某些应用程序来说可能可行的另一种可能性是在后台采用另一种加密方案,例如 AES,并仅在标签上存储加密信息。 为了防止对数据块进行未经授权的修改,可以对该数据添加额外的身份验证。 然后在后台验证此身份验证。 适当的欺诈检测机制和后台的额外安全功能对于发出信号甚至防止上述类型的攻击是必要的。 一般来说,收集和处理来自读者的数据的后台系统是非常重要的第二道防线。 从长远来看,这些对策还不够。 mifare Classic 卡采用封闭式设计。 默默无闻的安全性已经多次表明,在某些时候系统的详细信息将被泄露,从而损害安全性 [6]。 因此,我们建议迁移到具有开放设计架构的更先进的卡
这篇关于practical on mifare的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!