1、轨道交通收费系统非接触芯片风险研究摘要:本文对城市轨道交通单程票系统广泛采用的UltraLight非接触芯片安全性进行全面分析,从物理、电气、数据结构等几个方面进行剖析,针对其弱点研究了潜在的攻击方式,为目前众多城市公交收费系统敲响安全的警钟。关键词:安全、CRC32、破解、智能卡、Ultra Light一、 基本情况1.1芯片参数Mifare UltraLight (以下简称UL)存储容量:512bit,16块,每块4字节,唯一的7字节序列号,32位用户可定义的一次性编程区域,384位用户读、写区域;工作频率:13.56MHZ;通讯速度:106Kbps;读写距离:在100MM以内(与天线有关
2、);卡与读卡器通过iso/iec 14443A协议进行通讯;通讯过程中,没有使用通常逻辑加密卡的三重认证机制。1.2 使用特点由于其是Mifare Class平台简化的非接触设计,因此其成本低廉;而其完全兼容于Mifare非接触系统的特点,使得国内90%以上城市轨道交通自动售检票系统(AFC)中采用作单程票(single ticket),甚至作为多程票卡使用。1.3 技术局限恩智浦公司UL设计目标为可丢弃票卡使用(最早用于罗马的公交计次票),国内用作循环单程票系统,从一开始就遭到诸多专家的置疑,为此,恩智浦公司很早就开发了Ultralight-C作为UL替代解决方案在国内推广,这在一定程度印证
3、了UL技术上存在无法弥补的安全缺陷。Mifare逻辑加密卡被破解,实际上是逻辑加密卡与读卡器之间的三次认证算法Crypto1被破解。缘于此事,工信部于2009年初下达了关于做好应对部分IC卡出现严重安全漏洞的通知,其主要精神是限制和逐渐取消M1卡。但是对于UL,业界对其安全性应该说是忽视掉了,目前UL在国内单程票卡市场上占有很大优势,并在新建地铁项目中,几乎全部采用。UL平台的风险,就少为人提起。下文以既有UL系统为例,说明UL安全存在的巨大隐患。二、 UL卡破解2.1暴力破解UL卡芯片实际上属于没有读控制/缺少完整写控制的存储卡,在实现计程收费的公交系统中,如采用UL芯片作为单程票卡,攻击者
4、/乘客只需持type A标准读卡器,向单程卡内写入任意数据,打乱票卡逻辑结构,票卡就不能被出站闸机正常读取,但由于无法确定票卡故障原因,运营商必须放乘客出站,这样就实现了乘客用最低票价,乘座最长程的目的。2.2 票卡复制UL卡利用其56个bit的出厂唯一序列号作为其防伪的主要技术手段,但是UL卡与读卡器通过iso/iec 14443A协议进行通讯,没有通常加密卡的三重认证过程。因此,只要利用iso/iec 14443A的模拟设备,就可以轻易实现票卡的复制。具体设计与实现如下图所示:上图为14443A开发板卡。上图为模仿正常工作票卡的工装,可以完全模拟UL卡读写操作。2.3 算法破解由于UL卡没
5、有环境认证机制,芯片本身缺少完整的读写控制功能,因此在此芯片平台开发支付应用是非常困难的,由于UL缺少物理层读写控制,因此只能进行平面加密,限于前置系统的处理能力,对UL卡几乎不能进行全文加密,因此只能采用签名算法,正因如此,外界可以轻易取得明文与密文。所有这些,都成为制约系统安全的瓶颈。下图是国内典型UL卡的安全体系统示意图。卡内数据(明文)CRC32防伪码(MAC)特征值串(CRC校验值)3DES笔者借鉴资料,得到一种CRC逆向配适算法,成功的对CRC特征值进行了反向工程(破解);同时利用上述原理,利用读卡器与既有系统内票卡,已成功的制作出上述UL系统内任意种类的合法票卡。三、 CRC逆向
6、算法3.1 CRC原理循环冗余校验算法(下文简称CRC),它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。 CRC是在传统通信行业发展起来的,如在串行传输过程中,数据是逐位沿传输通道传递的,因此利用CRC寄存器,就可以实现对传输数据准确性的保障。他的主要应用就是用于数据传输的偶发性电平突变的防治。因此他的算法简洁高速。通常,计算量与原始数据量呈线性关系,可以在传输的同时进行校验。CRC应用范围很广泛,最常见的就是在网络传输中进行信息的校对。由于CRC算法简洁,占用系统资源较小,近来有人也把他用于数据保护,甚至在一些涉密系
7、统,如AFC系统中作为签名算法使用。3.2 基本算法算法描述如下:(1)生成CRC对应表,建立队列形CRC寄存器,准备好待计算的数字队列;(2)CRC寄存器操作(高位移出,低位移入待计算的队列);(3)将移出值进行查表,得到对应的CRC值后与现在的寄存器进行异或操作;(4)循环至所有待计算的数据均移入寄存器后,此时寄存器值即为此数字队列的CRC值。3.3 优化算法查表法可以继续优化,根据异或算法的结合律:(ab) c = a(bc)最终优化了CRC算法,具体描述为:(1)生成CRC对应表,建立队列形CRC寄存器,准备好待计算的数字队列;(不变)(2)CRC寄存器操作(高位移出,待计算的队列不移
8、入);(3)将移出值与待计算队列中的待计算位进行异或操作;结果进行查表,得到对应的CRC值,并将此值与当前的寄存器进行异或操作;(4)循环至所有待计算的数据均处理完成后,此时寄存器值即为此数字队列的CRC值。此算法也是目前开发系统中通用的CRC实现。采用C+表示非常的简洁,即:crc32 = p_ tab(*pS+ (unsigned char ) (crc32)& 0xFF) (crc32 8)其中,p_tab变量指向生成表,pS指向待计算队列。3.4 CRC求逆从CRC查表法中看出了一些毛病:任意字符的组合,最终可以归根结底为256组既定的CRC生成值。那么,我们只要找到与待生成结果一致的
9、源,就可以轻易实现数据队列生成了。继续深入分析,以CRC-32为例,他的生成数组每项均为4个字节,共256组数据,根据信息学基本原则,“当源与目标体量相同时,信息可以不损”。可以简单估算,最多只需四组数据(4个字节),就应该可以操纵CRC32的值。通过待定系数法,重现一次查表法的计算过程,具体为:设数据队列如下(白色为已运算过,蓝色为待运算的字节队):队头XYZ队尾W此时寄存器如下(即数列运算到最后一个白格时的CRC结果):a3a2a1a0初始我们期待操纵目标值为:f3f2f1f0寄存终值我们模仿标准CRC-32的计算方法,进行下述4字节操作。1)X被处理;*待查表值为:a0+X;查表得到,T
10、AB(a0+X)b3b2b1b0TAB(a0+X)寄存器终值00+b3a3+b2a2+b1a1+b0X操作终值同理:2)Y处理c3c2c1c0TAB(a1+b0+Y)00+c3b3+c2a3+b2+c1a2+b1+c0Y操作终值3)Z处理d3d2d1d0TAB(a2+b1+c0+Y)00+d3c3+d2b3+c2+d1a3+b2+c1+d0Z操作终值2)W处理e3e2e1e0TAB(a3+b2+c1+d0+Y)00+e3d3+e2c3+d2+e1b3+c2+d1+e0W操作终值3)求解e3=f3;从TAB表中可以查出符合字首为e3的唯一表项TAB(a3+b2+c1+d0+Y)并据此进一步得到e
11、2,e1,e0;d3=f2+e2,可以查出符合字首为d3的唯一表项TAB(a2+b1+c0+Y)并据此得到d2,d1,d0;同理,可以得到c3,c2,c1,c0;b3,b2,b1,b0;X=TAB-1(b3)+a0;Y= TAB-1(c3)+a1+b0;Z=TAB-1(d3)+a2+b1+c0;W=TAB-1(e3)+a3+b2+c1+d0;最终,我们可以将X、Y、Z、W全部求出,因此可以将任意CRC32的值改成任意你想要的结果(f3,f2,f1,f0)。上述算法可以轻易通过计算机实现,按上述原理,只要在卡应用结构内找到4字节可变量,就可以对其它任意变量进行修改而最终的MAC值仍保持不变,这样
12、就实现了上述应用系统的全面破解。四、 结束语本文介绍了UL卡,说明了其自身缺乏基本的安全控制手段的缺陷;提出了CRC逆向算法,得出CRC不能作为签名算法使用的结论。由于目前UL与CRC32在收费系统中被普遍应用,这孕含着巨大的安全隐患与社会风险。笔者希望通过本文为业界敲响警钟,促使国内AFC行业亡羊补牢,及早解决上述一系列问题。五、 参考资料1、Anarchriz A CRC Tutorial & The c00l way to Reverse CRC2、NXP半导体公司 AN 073120 mifare Ultralight Features and Hints;3、北京市交通委员会 北京市政交通一卡通卡在轨道交通自动售检票系统中应用的技术规定4、工信部 关于做好应对部分IC卡出现严重安全漏洞的通知5、北京市质量技术监督局轨道交通联网收费系统标准(征求意见稿)7