M1卡破解(智能卡攻防技术分层、分级研究探讨)

本来是当任务来完成的一篇论文,原计划有些宏伟,迫于时间太紧根本无法完成它,就草草成了现在这个样子交差了。交出去如石沉大海,了无消息。干脆发到这里也不辜负我加班写作的辛苦了。

     许多材料来不及验证,可能有误,先打个招呼:对不起!

 

智能卡攻防技术分层、分级研究探讨

<第一部分>


摘要

       本文试图将学术界总是聚焦于芯片层的IC卡安全或说攻防课题的目光引开到更为立体的层次、更为宽广的界面。

       本文尝试将目前已知的攻击手段根据其攻击点进行分层,对攻击强度根据难易程度进行分级,并初步探讨了攻击强度与后果的关系。同样的,对事物的另一面-防御也进行了同样的分析。

       文章试图建立一个简单明了的分析框架  ,然后根据这个框架分析了sim卡,Mifare卡和我国用量极大的Mifare兼容卡的攻击案例,并公布了两年前发现的复旦兼容卡的一个安全漏洞。


一、引言

       智能卡诞生于上世纪的七十年代,发展到今天,已经或即将成为每个生活在现代社会的家庭和人的生活必需品。在我国,随着中央政府公布的国民经济发展十二 五规划中明确地将金融领域的“IC卡迁移”作为十二 五期间的战略目标之一后,有关IC卡(智能卡)的攻击与防御的话题也逐渐升温,不仅是圈内的厂商、研究机构、检测机构和大学的从业人员和研究者,甚至成为了国家领导人批示的对象。不可谓不热!特别是在各类学术杂志和高校校刊上,有关之智能卡加解密、攻击与防御的论文已不再藏藏掩掩,而是堂而皇之地公开讨论,尽管水平参差不齐,但气象可喜、前景看好。

       不过纵观学术界和产业界感兴趣或瞩目的题目,多是围绕在使用芯片的非侵入分析或故障引入分析攻击DES、3DES或RSA等公开算法的具体方法或数学原理的讨论。我本人在十年前初入IC卡这个行当时,第一次看到的有关IC卡攻击方法的文章就是此类内容。当然,那时基本都是照搬国外的文章,没见过中国人写的。现在,我也不认为这类题目的文章多了,而是还嫌太少,我们的发展步伐还应该加快。但是,我认为我国的学术界和产业界把智能卡攻防的话题或课题仅仅局限在一个点或一个面上是远远不够的。相反,应该对智能卡的攻防问题展开更为立体的、更为广阔的和更为深入的探讨和研究。

       本文试图将有关智能卡的攻击和防御问题分层面进行介绍和讨论,并尽量能够拓开边界。但由于时间和能力的局限,不敢多做深度方面的尝试。但愿起到抛砖引玉之微薄效果。

l  第二章介绍了智能卡分层、分级的概念和具体方法;然后引申到防御。最后讨论了攻击强度与后果之间的关联问题。

l  第三章使用第二章建立的方法,对密码层的攻击案例进行分析。第2节讲的是著名的GSM COM 128破解。本文引述此案例重点不在进攻,而在防御和后果的分析。第3节讲的是前两年沸沸扬扬的Mifare卡破解案,同样对后果和防御提出了自己的观点。

l  第四章将话题转移到应用层,比较详细的介绍了一款mifare卡的兼容卡-复旦卡,分析了其安全隐患和应用系统常见的安全漏洞。示例了一种简便的攻击方法,并介绍了相应的防御手段(以上为第一部分)。接着计划介绍一些网银USBKey最普通的应用层攻防手段。

l  第五章讨论COS层的攻防分析案例,特别介绍JAVA卡的攻防问题。

l  第六章是芯片层,按攻击手法分类为侵入、半侵入和非侵入加以讨论。并一一介绍相应的防御方法。

l  第七章 总结

 


二、智能卡攻击的层级分类
1.    层次划分的方法

       智能卡攻击的本意是:(针)对智能卡进行的攻击方法或行为。所以,在研究智能卡攻击的层面划分时,首先应对“攻击”的对象即智能卡进行层面划分,然后将针对该层面的攻击方法定义为“该层攻击”。

       本文所讨论的“攻击“仅指在智能卡生命周期中“应用期“内所可能发生的,不涉及其他期间。


2.    智能卡的层面划分

       本文讨论的对象智能卡一般指具有CPU和COS的IC卡,但在某些段落里也会讨论Mifare classic1 这类著名的逻辑加密卡。所以在分层时,我们是以CPU卡为模型的。

       有教科书把智能卡分成三个层面:芯片层、COS(嵌入软件)层和应用层。但把攻击分成:社会层、物理层和逻辑层。这种分法自有它的道理和逻辑,本文不做评论。我们的分层则基本根据对象的本质特征,并结合有利于分析的原则,将对象划为4个层面:芯片层、嵌入软件层、应用层和密码层。见下图:

 

      

     图1. 智能卡的4个层面

       (注1)试图用二维平面图表达四个层面的关系是件困难的事,因为密码层面其实与其他三个层面都有直接关系,这样把它称为层面就有些牵强。但在没有找到更贴切的词汇时,姑且用之。


3.    智能卡攻击的层面划分

       我们简单地引用对智能卡的分层方法,将专门针对智能卡某一层面的攻击归类于同名层的攻击。因此,智能卡的攻击方法可分为以下图所示的4个层面:

图2. 智能卡攻击的4个层面


4.    智能卡防御的层面

       作为矛盾的对立面,有攻击的层面,自然就存在相应防御的层面。所以,智能卡防御技术也可按上述4个层面来讨论。但需要强调的是:对某一特定层面的攻击的防御技术或措施并不一定在同一层面实现。这其实是存在于攻防矛盾事物中的普遍规律,以对人的攻防技术为例:人该如何防御在战场上敌人对自己身体的物理伤害呢?古人确实设想或说幻想过改变皮肉的物理特性,变成钢筋铁骨、刀枪不入。于是便炼丹、吃药、画符、念咒、上山修炼,甚至像孙悟空跳到太上老君的炼丹炉里烧个七七四十九天……。然而真正在战场上得到实用的却是盔甲和盾牌,工事和掩体,还有就是搏击躲闪的技能等。

       从本文之后例举的案例也可以看出:当把智能卡作为一个整体看待时,其某些层面的安全瑕疵是可以通过其他层面加以修补的。


5.    攻击者的分类

       文献【1】将智能卡攻击者的基本动机分为两类:一是为了钱,二是为了出名并处于某特殊场景的状态。我认为他们说的不错,即使是像我这样的所谓专业智能卡安全检测机构的从业者,也是两个动机兼而有之。这里同样引用文献【1】的攻击者分类图。

 

图3. 文献【1】中的攻击者分类图

       我想补充的是,还有一种无意或偶然起意的攻击者,他们既不为名也不为利,只是恰好处于一个特殊的场合,就象玩玻璃球一样开始对手里的卡进行攻击亦或是各种尝试。他们的动机可能仅来自于好奇甚至无聊。

       本文只想强调,智能卡攻击者其实是个中性词,不代表人品和行为的好坏,也不代表其具有的专业知识或技能。但其结果确实都可能给智能卡的应用系统运营商带来巨大的麻烦。


6.    攻击强度分级
6.1.        分级规则

       攻击强度分级是对攻击强度进行量化分析的一种尝试,希望走出定性分析的老路。在我们的分级方法中,攻击的强度与攻击的层面是有密切关系的。

       现将智能卡的攻击强度分为5个级别,分别用A,B,C,D,E表示,其中A级强度最高,B次之,E级最低。


6.2.        强度分级的描述
6.2.1.  E级

       无意的或偶然起意的具有普通技术能力和公共知识的攻击者的攻击。

       现实社会中绝大多数人的攻击能力属于这个级别。


6.2.2.     D级

       具有综合专业技术知识但不具备特殊设备的攻击者的攻击。

       事实上,专业(专业机构的检测人员和研究人员除外)攻击者群体中的大部分的能力在这一水平上。IC卡应用系统面临的安全威胁主要来自这些攻击者。


6.2.3.    C级

       掌握受测件机密技术信息但不具备特殊设备的攻击者在软件层面的攻击。

       这个级别的攻击者可认为是或相当于图3中的Insider。一个不争的事实是:许多IC卡产品制造业的技术人员为了便于自己修改方便而在COS或软件的其它层面上留有隐密指令(不能排除其它目的的后门)。这样的产品的安全性是建立在某种技术秘密基础上的,在知晓这些技术秘密的人面前,产品毫无安全性可言。

       这些所谓技术秘密往往就是一两条特殊格式的指令,易于掌握和操作,即使没有被扩散也会对IC卡及其系统构成极大的安全威胁。


6.2.4.  B级

       攻击者具有充分的专业知识和技能,具有芯片层非侵入攻击专业设备,攻击的主要目的是破解卡上的密钥。

       这个层级上的攻击方法基本都是研究学者或检测者们在实验室里想出来的,攻击者们也大都是他们自己。这个级别的攻击对IC卡系统的现实安全威胁其实远远小于以上两个级别。因为要完成此类攻击需要很多先决条件。

      


6.2.5.  A级

       攻击者具有一切必要的专业知识和技能,具有所有层面需要的专业设备(包括芯片侵入、修补设备),攻击的主要目的是得到卡本身的所有信息,破解卡上的密钥甚至改变芯片的功能、性能和行为。

       因为攻击成本过高,条件过于苛刻,这个层面的攻击对IC卡的普通民用系统已经基本没有实际威胁,它们不过是在探索所谓攻击的潜在极限到底在哪里。这个级别的攻击者已经基本上是专业检测实验室的操作员,而且必须拥有昂贵的高精尖专业设备和高深的技术以及经验。


6.3.        强度与后果的关系

       某种攻击的试验成功,然后发布或揭露而在学术界、业界产生的影响,和对现实应用系统的影响其实是有差别的,文本中将后一种影响称为后果。

       我认为并且希望能在下面的案例论述中证明,攻击强度与攻击的后果并无直接的正向关系,相反,应该呈反向关系。


三、密码层攻击案例分析
1.    两个案例

       近年来,在IC卡的密码层有两个著名的破解案例:一是手机GSM系统SIM卡的COM128算法,另一个是原飞利浦Mifare卡的M1算法。这两个案例的共同点是都引起了业界的极大兴趣,但却都没有引起严重的后果。下面分别分析。


2.    GSM- COM128
2.1.攻击

       尽管就在写这段文字的早晨,我的手机又接到了一条的短信,声称可以为我做一张“他(她)”的手机卡,让我可以听到“他”的通话,看到“他”的来往短信-这类的短信我们每个人恐怕一年会接到至少十几次-等,我也知道com128在上个世纪末就已经被破解了,而且我还曾从网上下载了具体的破解程序和操作说明,但我确实没有对此题目做过深入研究,也没有实际进行相关的试验或说验证。现在只能援引相关的资料和我的同行朋友的试验作为佐证而得到以下结论:

1.  COM 128(至少是V1版本) 的算法确实被破解了;

2.  这个破解是实实在在的密码学意义上的破解,也符合我们定义的密码层的攻击成功(参阅文献【2】);

3.  这次破解给全世界当时正如火如荼发展的GSM移动电话运营商和广大用户带来的影响和实际后果远远不如想象般严重。

    什么叫严重后果呢?可以有以下几点:

l  系统用户人人自危,感觉到自己手机的不安全,包括:自己的通话和短信等通信内容可能被窃听或窃取;自己号码账户预付的资金可能被以各种方式盗用;自己的手机号码可能冒名使用,并造成巨额话费单。广大用户由于这种不安全感而拒绝继续使用GSM手机,或要求运营商赔偿。

l  移动系统运营商不断接到用户投诉甚至指控,因而不得不召回所有卡片并做出重大技术修改,同时花巨资赔偿用户损失或常年陷入官司纠纷。

    然而,事实是这一切并没有发生,这又是为什么呢?我的思考结果是以下这几条原因:

1.  Com128的算法虽然有弱点,但其密钥Ki的生成算法被证明是较强的,这又可从两个方面说明:

a)   攻击者找不到各个用户Ki密钥之间的数学关联,这样就无法通过破解一个密钥来推导出其他用户的密钥从而导致整个密钥系统崩溃;

b)   攻击者找不到每个用户的Ki密钥与其手机号码或其它明文信息间的数学关联,所以就无法通过得知某人的手机号或其个人身份信息或其手机设备信息等明文信息计算出该用户密钥。

       所以个别卡中密码Ki的被破解,并没有波及到其它的卡,更遑论波及整个系统。

2.  攻击者在破解每个sim卡时,都必须将其物理占有,放入与计算机相连的读卡器或特制装置中进行反复运算,才可能做出。通过无线移动网或互联网来窃取密钥是不可行的。

3.  GSM系统在其终端的设计中采取了“机卡分离”的策略,即使某用户的sim卡被复制,他可以通过申报运营商,废除原卡,换新卡(新密钥Ki),并继续使用原号码和原手机,以较小成本换取安全。

4.  GSM系统飞速发展的同时,话费不断下降到了社会各阶层人士能普遍接受的水平,使得90年代所谓第一代“大哥大”时风行一时的“孖机”产业链因为无利可图而无法建立,更遑论再度辉煌了。

    以上4点中,“1.”条的特性和“2.”的攻击条件非常重要,基本杜绝了攻击者通过隐蔽的联网方式大规模攻击用户手机的可能性。“3”和“4”则可能说明了为何COM128的破解技术扩散到社会后被人想到的生财之道竟然是出售复制设备给手机用户用于将自己的多个手机号复制到一片sim卡中。


2.2.         防御

       任何一种和任何一个应用系统都不能是完美的,在设计时和实际运营中都会遗留安全漏洞或产生安全事件损失。我们可统用安全风险来表示它们的可能性。防御策略和手段是降低系统或各部件安全风险的有效途径,

       防御手段是多种的,就此案例而言分为事前防御和事发后防御来讨论。

1.  事前防御

       事前的防御措施实际就是系统的安全设计。作为一个超大而复杂的系统,GSM一定有不可数计的安全设计,在本案例中我们见到最有效的安全设计就是上节提到的原因1.和3.,简述为:

l  密钥Ki的生成算法或产生方法具有较强的抗攻击性;这是我们定义的智能卡防御分层中的密码层面措施;

l  终端机卡分离;这是应用层面的防御措施。

2.  事发后防御

       事发后的防御亦可称为应对措施。虽然由于系统安全设计还算合格,个别sim卡的破解带来的损失一直在系统可容忍的范围内,但这类事情毕竟使得整个系统的形象不光彩,听之任之、无所作为是不可取的。各GSM系统运营商们基本采取了以时间换取安全的做法,在新发行的卡上对原算法做修补。这些修补有的针对性很强,就是专门防御网上流传的攻击软件的攻击点,所以如果绕过这些防御点,攻击还是仍然能够得逞的,但确实难度大多了(参见文献【2】)。

       不管怎样,GSM的运营商们还是实现了“软着陆”,规避了可能发生的系统性安全灾难。


2.3.         总结与评估

       本节通过一个卡片表格,结合本文第二章中介绍的分层分类概念对这个案例进行总结和评估。

表一:GSM  COM128 案例卡片

项目

内容

备注

案例名

GSM  COM128

 

攻击对象

GSM  Sim卡中的 COM128 (A3) 密钥Ki

 

攻击结果

Ki 可析出,sim卡可被复制

 

攻击层面

密码层

 

攻击强度

*开发强度

B级

见下面注解

**利用强度

E级

防御层面

事前

密码层、应用层

仅指最有效措施

事发

密码层、应用层

防御效果

合格

 

后果评估

 

 

系统风险

 

个体风险

中低

 

注:*开发强度指针对一个新的对象或旧对象但是新的攻击方法在被攻击者首次创建时的强度。

   ** 利用强度指一个新的攻击方法被开发后,有人根据其基本原理和流程制造了简化和专业化的工具(包括软硬件),或者编写出指导操作教程,并扩散入社会,此时的攻击强度。


3.    Mifare  Classic  Crypto-1

       Mifare系列IC卡是非接触的逻辑加密卡,也可被归类于RFID(按我的标准它不属于智能卡,最多算准智能卡)。Mifare  Classic 1 (简称M1卡)可能是世界上迄今为止应用最多的IC卡,多用于公交、小额支付和门禁。在我国,有着众多的厂家至今还大量生产着它的形形色色的仿制品。

       M1卡使用硬件技术固化了一种不公开的密码算法,叫做Crypto 1 。21世纪IC卡界安全领域的一件大事就是Crypto 1被人破解,并将原理与部分方法公开于众。然而,事态的发展又一次出乎专家意料的趋于平静了,除了某些厂家趁机卖出了自己的智能非接触卡;一个小有名气的黑客小试牛刀后被捕;社会上多了几条传言外,再未见什么波澜。

 


3.1. M1卡的逻辑结构

       为说明问题现在必须简单介绍M1的逻辑结构如下:

       MIFARE Classic卡原则上是一个有着几个额外功能的存储器卡。存储器被分成许多的数据块,每个数据块由16个字节组成。这些数据块组成扇区。1K的mifare Classic卡有16个扇区,每个扇区有四个数据块。4K的mifare Classic卡的前32个扇区由4个数据块组成,剩下的8个扇区每个由16个数据块组成。每一个扇区中最后一个数据块被称为扇尾(trailer)。图1为一个4K的mifare Classic存储器的示意图。

注意,扇区0的模块0有特殊的数据。前4个数据字节包括唯一的卡验证号(UID),后面跟着一个字节的位计数检查(BCC)。这个位计数检查通过连续的异或所有的UID字节被计算出来。剩下的字节用来存储制造商的数据。这个数据块是只读的。读卡器需要在进行任何存储操作前认证扇区。扇尾trailer包含密钥A和密钥B,这两个密钥都是用来认证的。访问条件定义了对该扇区的哪种操作是可行的。

扇尾trailer有特殊的访问条件。密钥A是永远不可读的,而密钥B可被设置成可读或不可读。当B为可读时,存储器只用来存储数据而密钥B不能用作认证密钥。除了访问条件(AC)和密钥,剩下一个未被定义的数据字节(U)。图2a是扇尾trailer的示意图。数据块可以被用来存储任意的数据或设置成值模块(value block)。当用作值模块时,一个有符号的4字节的值被存储了三次,两次未取反和一次取反。取反在这里意味着值的每一位都和1进行异或。这四个字节按照从左到右低位字节到高位字节的顺序存储。剩下的四个字节用来存储1字节的模块地址,这个地址可被用作指针pointer。”(译自【5】)

图2、数据块的内容

       M1卡在做公交卡应用时,某个特定数据块可被设置为“值模块”,因为每次递减一个固定值或它的整数倍。

 


3.2.         攻击过程回顾

       与Com128不同的是,Crypto 1 的攻击是以芯片层面开始,并广为人知;在密码层面继续并完成,却鲜为人提。本节的中心内容是讲密码层面的事,但为了完整还原全过程,不得已从芯片层讲起。

       在2007年年底柏林举行的第24届黑客大会Chaos Communications Congress上,两位研究者宣读了他们合作的论文。“这两位一个是德国的学者Henryk Plotz,另一个是弗吉尼亚大学的在读博士Karsten Nohl,他们利用显微镜,把Mifare Classic的芯片进行了抽丝剥茧般的逐层分析,然后附以RFID读卡器,得到了Mifare Classic芯片每层的布线图。从而分析出芯片中近万个逻辑单元,分别是逻辑电路的与门、或门以及触发器。.....他们从这些逻辑门中发现了规律,从而大大简化了分析的进程。接下来就是要找到其中关键的加密处理部分,......他们按照自己获得的数据信息进行了重构,在此过程中他们详细分析了各个单元模块的功能,经过一番辛苦劳作之后,他们发现了MifareClassic芯片的若干安全隐患。其中之一就是他们掌握了一个16位随机数发生器的原理,每次都能够正确预测下一个随机数的值。 “【3】。这个伪随机数发生器的函数是X16 + X14 + X13 + X11 + 1。

2008年的2月,荷兰政府公布的一项针对此事的报告对此回应:报告肯定了Nohl and Plotz的发现,但却断言由于攻击的成本,Mifare 卡系统在两年内还是安全的。他们估计攻击所使用的硬件成本约为9000美元,并费时数小时。

Nohl看来对荷兰政府想把大事化小的态度不甚满意,于是马上又发表了一篇名为“Cryptanalysis  of  Crypto-1”【4】的文章,公开了Mifare Classic加密算法Crypto-1的核心就是一个48位的线性反馈移位寄存器加上几个输出函数过滤器。而这几个函数过滤器应用了三种不同的函数关系,它们都有统计学上偏移的弱点,利用这些弱点和之前掌握的随机数发生器的知识,使用普通计算机通过向读卡器发送几十个挑战数,就能够猜出卡片的密钥中的32位是什么。其中有12个比特仅通过乱码流的第一位比特值便可判定,其余36位密钥值的破解时间,若使用一个FPGA装置是30秒内,即使使用普通PC机也就用几分钟。

 

图一、【8】根据【4】画出的Crypto-1逻辑框图

 

不过Nohl所公布的信息还是有相当保留的,他虽介绍了攻击方法,却没有技术细节;对Crypto-1的内容和缺陷也披露的颇为朦胧。例如,并没有指出48位的线性反馈移位寄存器的20个抽头的具体位置,也没有透露三个输出函数的细节;更没有任何他所使用的硬件辅助工具的信息,所以我们也不知道除了PC机外,攻击的硬件成本到底是多少。Nohl的这篇文章更像是在警告世人,而不是倾囊而出地展现自己到底知道多少。所以到这个时候Mifare Classic的最后一层面纱还没有在公共面前揭开。

然而,Nohl的文章的标题-“Crypto-1的密码学分析”却为有志者指明了奋斗方向。-

于是荷兰本土人士,Radboud大学计算与信息科学学院的研究人员开始出场。

先是这个学院的Gerhard de Koning Gans等人组成的一个小组公布了他们的论文:“对MIFARE Classic的一种实用的攻击方法”【5】。

         “这篇文章研究了MIFARE Classic卡的内部结构和卡与读卡器间的通信协议。提出了一个实际的、低成本的攻击,能够从卡的存储器中获取私密信息。由于伪随机数发生器存在的一个缺陷,我们能够还原由CRYPTO1序列密码算法产生的乱码流。我们利用流密码的延展性去读卡上第一个扇区中所有的存储块。并且,如果我们知道卡上任意扇区的一个存储块,我们就能读这个扇区。最后,也许还可制造更多的威胁,例如去修改存储块。......”[5]

         从密码学角度上说,这个小组的工作还很不彻底--他们没有破解任何一个卡的密钥;但又确实很实用,因为使用了很简单的原理和方法就读出了卡上的许多私密信息。“在这种攻击中,我们不需要知道CRYPTO1算法,只需要知道它是一个按位加密的流密码。”[5]

       另外他们介绍了自己所使用并加以改进了的廉价的射频截听工具并能够模仿卡或读卡器与对方通信的PK III(Promark III),价值约几百美元。拥有了它,不但可以获取并制造大量报文,且使攻击成本变得十分低廉和简便易行,在我看来,这才是可怕之处。

       国内有人把这种方法称为“重放攻击”,因为是在截听了读卡器与卡间的射频信号,然后再向卡重放修改过的信息而达成的。

       不过大多数黑客或别有用心的人还是会失望,因为到这个阶段他们还不知道怎么去克隆一张Mifare卡。

         荷兰这所大学的这个小组并没有停止他们的工作,可能反而增加了人员,加快了速度。他们的下一篇文章,“拆解Mifare Classic”[6]终于向公众揭开了CRYPTO1的庐山真面目。

文章声称:在逆向研究了Mifare Classic卡的安全机制-包括认证协议、对称加密算法和初始化机制-后,他们发现了存在于上述机制中的几个安全漏洞,利用这些漏洞,可实施两种攻击,这两种攻击都可以从一个真实的读卡器中获取密钥。其中一个攻击仅需要与读卡器进行一或两次的认证尝试,不到一秒钟。“采取相同方法,一个攻击者可以侦听到卡与读卡器之间的通信内容并将其解密,尽管可能涉及多重认证。这使得攻击者可以克隆一张卡,或者将卡的内容恢复到之前的状态。”【6】

       这次他们使用的工具除了Pk III外,又尝试了更为廉价但功能相当的一款叫GHOST的自制仪器,这东西仅估价40欧元,比之PKIII又低了一个数量级。

       又一次与Nohl and Plotz的做法不同,荷兰的科学家们公布了所有细节,包括Mifare Classic芯片的算法逻辑和他们自己设计的攻击手段。

    现在,一个向我一样有兴趣的人可以自由的在网上订购Radboud小组使用的工具,自由的下载破解CRYPTO1密钥的程序,重复这些实验,得到密钥并复制它到任意张卡中。

    到此时,荷兰的Radboud大学的研究者向世人公布了三种攻击方法。然而他们并没有停下脚步,这之后他们又发表了《Wirelessly Pickpocketing a Mifare Classic Card》【7】(可以译为无线窃取M1卡)一文。

       在文献【7】一文中,研究者阐明了M1卡在报文产生奇偶位和所谓嵌套认证两个方面的漏洞;利用此漏洞,攻击者可以通过工具仅仅研究该工具与一片M1卡之间通讯数据便可以成功破解该卡的所有密钥,从而克隆这张卡。请注意:与以往公开的任何一种针对M1卡的攻击所需要的条件所不同的是,这次的四种攻击方案都不再需要一个“真实的”读卡器。而他们此前介绍的3种方法都是需要一个真实的应用系统中的读卡器,在攻击时要截取它与被攻击卡之间的通信报文作为分析的资料。也就是说用以前的方法,如果你想攻击北京的公交卡,你就得抱着个仪器去公交车上或到地铁站的收费口前晃悠几下子。这难免不被警惕性高的革命职工或周围群众盯上,或被摄像头记录下来。做贼又心虚者没准就会感到太冒险而就放弃了。从这个角度讲,这些攻击对应用系统的威胁就不难么大。而新的攻击方法就不同了,你可以买张公交卡回家自己琢磨去,没人能知道你要干什么。对攻击者越安全,对被攻击物就越危险!所以,这样的攻击更加实用,更具危害。

       文章认为:M1在产生奇偶校验位时将数据链路层和安全通信层本该分层处理的协议混为一谈,先校验后加密,并且重复使用了加密校验位的密码。这是不符合安全原则的并确实可被利用。

    再就是M1卡嵌套认证的漏洞使得攻击者在得知一个扇区的密钥后可较容易的再破解其它任何扇区的密钥从而做到对该卡的全面破解。这在以前的攻击中并不容易做到,因为一个应用系统的读卡器不一定能产生其系统中所有卡的所有扇区的密钥,如果设计系统时就没有考虑使用所有扇区的话。

       文中设计了四种攻击方法,这里简单介绍一下:

       1.暴力破解

        即使是暴力破解,也需要先得到确切的明文和对应的码流。这大约要进行1536次认证过程,用时在一秒钟之内。不过还要进行离线暴力破解,估计在36分钟可完成。但是需要专用的硬件设备。

       2. 以读卡器的挑战值做变量

       这里说的读卡器实际上指的是用来模拟读卡器的攻击工具,下个攻击亦如此。这种攻击又可称选择密文攻击,想法用工具控制被攻击的卡每次在认证时产生同一挑战值,而读卡端则回应不同值。这种攻击需要大约28500次的认证过程,用时约15分钟,然后计算密钥,用时约一分钟。

       3.卡的挑战值做变量

   第三种攻击与攻击2类似,但需要使自己的工具的挑战值为常数,而令卡的挑战值数不断变化。需要预制一个384 GB的状态表(我怀疑384GB这个数字有误)。要进行4096次认证。大约用时2分钟。

      4.嵌套认证攻击

      第四种攻击假设攻击者已知了至少一个扇区的密钥,他可以根据漏洞得到其它密钥的32位,然后对其它16位进行穷举攻击。只需3次认证(时间可以忽略不计)。离线攻击计算时间约为一秒。

      这样,到文献【7】发表时,我们已经知道了7种攻击M1的方法。


3.3.    攻击过程小结

       从一个检测工作者角度对Nohl and Plotz和Radboud这两个小组的工作做个比较和总结:尽管两方都宣称自己使用了逆向工程的方法,但实际上有天壤之别。Nohl and Plotz采用的是硬件(芯片)逆向工程,属于侵入式攻击方法,也可称物理攻击方法。这两位就像两个勤劳的兰领工人,吭哧吭哧埋头苦干,终于把算法逻辑还原了。他们需要不少昂贵的仪器、专业实验室环境和集成电路工艺学的知识;大量的时间和细致、专注、枯燥的工作。而Radboud小组的工作方法其实更原始,完全通过研究卡与读卡器之间的通信信息(报文)来逆向推出算法装置及其破绽,然后又推出密钥。此“逆向”非彼“逆向”,说白了就是通过研究加了密的报文破译密钥并最终得到明文的传统密码学方法。这种方法需要研究大量的“报文”,所以Radboud小组才对硬件工具PKIII和Ghost这么重视。

       仅靠硬件(芯片)逆向工程可以还原出加密算法逻辑,却不能找出算法的弱点,所以Nohl也必须运用密码学方法来研究CRYPTO1,还好,他终于找到了一个弱点,但可惜没有说透。在使用密码学方法研究问题、解决问题的能力上,显然Radboud小组要强得多,取得的成果也就更大。这也是我将此案例列入密码层而不是芯片层来讨论的原因之一。


3.4.         攻击分类

       为便于讨论,首先将荷兰Radboud大学公布的7种方法编号并分类。

       我们将文献【5】介绍的方法命名为{1};文献【6】中第7章介绍的Attack One为{2},或者表格法;同一章接介绍的Attack Two为{3},或者逆转法;文献【7】介绍的方法1.2.3.4.则依次为{4}、{5}、{6}、{7}。

1.  如果以攻击对象分类,则{1}单独为一类,可称为改值类,因为它攻击的对象是卡内的数据“值(value)”;其它从{2}到{7}的对象都是各扇区的密钥。

 

2.  若从攻击场景或说攻击条件分,则{1}、{2}、{3}为一类,都需要与真实应用系统的读卡器交换信息,简称为“依赖(读卡器)类”;后四种只需与被攻击的卡交互信息,可称为“非依赖(读卡器)类”。


3.5.          防御

       前面一直强调过,防御对某一特定层面的攻击的措施可以在更多的层面开展和实施。

       据说北京公交卡的运营商在M1卡破解的消息传来后,采取了升级新卡的措施,将新发行的卡都换成了DES算法的智能卡。这也是一种防御策略,但不在本文的讨论之列,因为在我看这是一种先认输的防御。


   3.5.1.密码层防御

1) 修补逻辑

     这种方法很像前面介绍的GSM运营商的方法,即不管以前发的卡如何,而在新卡上做些文章。通常是仔细研究过【5】和网上最易得到的攻击软件的源码后,修改某个地方的数据或某些流程,使得攻击软件不再奏效。在我国有一些复制M1卡的芯片商是这么做的。但这并不可能完全改变CRYPTOR 1算法的固有的“弱”的问题,只是又加大了攻击难度。

     而且我很怀疑这类防御是否对改值类攻击有效。

 

2) 密钥管理

     有很多规模不大的M1卡应用系统从来没有密钥管理的概念,发出的卡不仅所有扇区的密钥相同,而且所有卡的密钥都一样。一旦一张卡被破解,系统内所有的卡都等于被破解。简单的解决办法是先产生一个主密钥然后对每张卡使用强度足够的分散算法分散出每张卡的密钥,还可以继续分散出每个扇区的字密钥。

  这方法虽然不能阻止对每张卡的分别破解,却给大规模破解增加了难度。


 3.5.2.应用层防御

       1)UID认证

       每张M1卡都有一个唯一辨认号UID,它保存在0扇区0模块中,只可读不可写(见3.1. MI卡逻辑结构),所以除非到工厂定制,否则是不可能被复制的。规模不大或系统资源丰富的应用系统可以在M1卡原有的认证流程后再加上UID认证的机制,来辨别卡的真伪。

       2)后台建账,定期核对

       为每张卡建立账户,记录每次(天)充值、消费和余额信息。并尽量每天对账,找出可疑账户记录。

3) 应用层数据保护

终端对存储在数据块中的应用数据(电子钱包余额等)使用较强的算法进行加密后再写入,或对关键数据进行mac计算后将MAC码与数据一并保存在数据块,读入时进行验证。此方法只能解决部分问题。


 3.5.3.芯片层防御

       与密码层“1)逻辑修补”的意义相同,它必须在芯片层实现。


 3.5.4.后果分析

       无论是挑起争端的Nohl还是荷兰的Radboud大学都做了非常扎实而漂亮的工作,然而令他们始料不及的可能是:世界各地多如牛毛的M1卡系统既没有停业也没有崩溃,基本还运转良好。除了运营商们可能采取了以上所列各种措施外,在现实中,使用网上容易得到的“依赖读卡器”类的工具实施攻击其实并不那么同意,而“非依赖”类的工具还很少见。可能还有一个重要的原因是:其实在这类应用系统上获利的诱惑还不够大,因此攻击者并不多。关于此点,下面应用层的例子更能说明。

       总之一句话:后果不很严重!


3.6.         总结与评估

表二:

项目

内容

备注

案例名

Mifare Classic(M1)

 

攻击对象

Crypto 1算法和卡内密钥

 

攻击结果

Crypto 1算法,卡密钥

 

攻击层面

密码层

 

攻击强度

*开发强度

A、B级

 

**利用强度

D级

防御层面

事前

密码层、应用层

仅指最有效措施

事发

密码层、应用层

防御效果

合格

 

后果评估

 

 

系统风险

中或中低

 

个体风险

 


四、应用层攻击案例分析
1.    定义

       针对智能卡在应用期由于系统发卡方由于对某些参数设置不当而产生的漏洞进行的攻击称为应用层攻击。

       上面的两个例子已经说明:对智能卡的攻击大多发生在其应用期,但这并不等于攻击点就在应用层。


2.    M1卡的兼容卡密钥B攻击

                                                                                                                                   对于一个专业智能卡检测机构的技术人员,应用层的攻击案例其实不胜枚举,自己每天几乎都在做这样的事。两年前想方设法弄到M1卡的攻击工具后,不免想到试试身上周边几个食堂的饭卡,结果发现根本用不着这么“高科技”的东西,拿个读卡器就可以保证我白吃到老了……。


2.1.        M1卡与其兼容卡的区别

       我发现,并非所有的M1的兼容卡都与正版的M1有区别,标题中说的兼容卡特指以复旦微电子为代表的,数据访问条件与原版M1卡有区别的芯片所制造的卡。


       2.1.1.密钥A、B与访问条件

这里还要重复介绍一下M1卡的逻辑结构:“每个数据块由16个字节组成。这些数据块组成扇区。1K的mifare Classic卡有16个扇区,每个扇区有四个数据块。每一个扇区中最后一个数据块被称为扇尾(trailer)。扇尾trailer包含密钥A和密钥B,这两个密钥都是用来认证的。访问条件定义了对该扇区的哪种操作是可行的。

    trailer有特殊的访问条件。密钥A是永远不可读的,而密钥B可被设置成可读或不可读。当B为可读时,存储器只用来存储数据而密钥B不能用作认证密钥。”【5】见下图:

图4. 1kM1 卡CS50的存储区结构图【9】

       再看复旦的FM11RF08兼容卡的存储结构如下图:

 

            图5. FM11RF08的存储区结构图【10】

       仔细对比就会发现,除了在15扇区复旦卡多了一处Manufacture Code ,其余地方其实完全一样,只不过复旦的资料中更多的把所谓Sector Trailer称为Block 3(第3块)。

       继续来看M1卡的这个Sector Trailer的访问条件,见下图:

图6  M1卡存储区(扇尾)trailer块的访问条件【9】

       再看复旦的相应块(Block 3)的访问条件,如下图

图7. 复旦卡(芯片)存储区Block3的访问条件【10】

 

       将两张图稍加比对便可明显看出,相比于M1卡,在复旦的卡中密钥B的使用权限被大大扩展了,其适用范围已经大于密钥A。

       再往下看M1卡数据区(块)的访问条件:

 

图8. M1卡数据区访问条件【9】

 

       和复旦卡数据区的访问条件:

图9. 复旦卡数据区的访问条件【10】

       对比图8和图9 会发现,两图内的表格内容其实没有差别,但图8中对KeyB的注解(即用红线框住的部分),在图9中是没有的。

       图8的注解说:如果某一扇区的密钥B被设为可读(图6中灰色标注区间),则它(密钥B)不能用于该扇区的认证;因此,如果在(图8)灰色标注区间的访问条件下试图去使用密钥B认证任何一个扇区,则卡将在认证过后拒绝任何存储区的访问要求。【9】

       而图9则没有在这一注解,也就是说复旦卡的密钥B不受此限制,在可读的条件下仍然可以既认证又访问存储区。

       两种卡也许在其它方面还存在差异,但都不是本文所关心的。


 2.1.2. 密钥A、B的功能简介

       在将两种卡的A、B密钥之间的差异进行小结之前,先说明mifare卡密钥功能的两个概念:

1)认证:在对M1卡任何扇区进行访问前,卡与读卡器之间必须要进行相互的身份认证,这个过程叫“三重认证”,在此过程中卡与读卡器必须同时使用完全相同的密钥才可以通过认证。如果认证过程失败,读卡器不能继续对卡的存储区数据进行任何访问。

2)存储区访问:如果认证过程成功,则读卡器可以对该扇区的数据进行访问,如:读、写、增值、减值等。此时密钥的功能是加、解密卡与读卡器之间的交互信息。上节图6、7、8、9中标示的其实都是密钥A、B在访问期间的使用条件。

3)在对一个扇区进行访问时,可以在认证过程和访问过程中分别使用A和B。


2.1.3.   两种卡和两个密钥间的差异

1)M1卡

l  密钥A :永不可读,所以安全级别高于B,权限范围亦大于B,为绝大多数应用所用;

l  密钥B:可设置为被密钥A读取,但可读时不能做认证,适用范围小,所以一般不被应用;

2)复旦卡

l  密钥A :永不可读,所以安全级别高于B,为绝大多数应用所使用;

l  密钥B:可设置为可读(密钥A、B),可读时亦可作认证;适用范围还要大于A,;一般不被实际应用。

 


2.1.4.  复旦卡的脆弱点分析

1)密钥B可能被设为可读,安全级别已经低于密钥A,但是其使用权限范围却大于密钥A,这是个明显的脆弱点;

2)密钥B被设为可读时仍可以进行认证,习惯M1卡设置的用户可能会忽略此差别,按照对M1安全的参数去设置复旦卡,则造成应用层的安全漏洞。

3)M1卡和复旦卡出厂时,两个密钥通常都是FFFFFFFFFFFF,应用系统初始化时,一般会选择用密钥A,于是把密钥A换成应用系统密钥值;但这时许多系统管理员可能是忽略了密码B,或主动选择对密钥B不作处理,在这种情况下,复旦卡中C1C2C3(访问条件)无论怎么设置,只要密钥A能访问的,密钥B一定可访问,所以卡片会认为你同时选择了密钥B,值是FFFFFFFFFFFF。密钥B此时成为一扇虚掩的“后门”!


2.2.        攻击方案

l  步骤一:找不同系统的非接触支付卡作为攻击对象;

l  步骤二:架设非接卡的读卡器与电脑连接;

l  步骤三:将读卡终端密钥A设为FFFFFFFFFFFF,进行认证尝试(一般会失败);

l  步骤四:将读卡终端密钥B设为,进行认证尝试;

l  步骤五:将上一步通过认证的卡片挑选为继续攻击对象;

l  步骤六:逐块读各块内容;

l  步骤七:尝试修改(写)某块内容;

l  步骤八:结束。


2.3.        攻击实施试验

1)身上有四种卡:北京公交卡、甲食堂卡、乙食堂卡、丙食堂卡(两张)

2)连接明华读卡器ER-R342,启动得到界面如下图:

图10. 读卡器非接触卡操作界面

3)按上图设置对5张卡分别测试:密钥A=FFFFFFFFFFFF。结果见下图。

图11. 密钥A测试结果

       公交卡、甲、乙都在预料之中的失败了;没想到丙1和丙2居然成功,说明它们的系统设置更不安全,连密钥A都没有变!

 

4)密钥B=FFFFFFFFFFFF

对5张卡分别用密钥B等于全FF进行试验,结果见下图:

图12. 密钥B测试结果
可见:公交和甲失败,乙和2丙都成功了。现在对乙继续试验。

5)连续读乙数据块1-5的内容,密钥B=FFFFFFFFFFFF

 

图13. 对乙使用密钥B读数据块1-5

    都成功了!其中第三块就是Trailer内容,可以看到密钥A:000000000000(其实是不可读),访问条件:FF078069,密钥B:FFFFFFFFFFFF。由此可以判断这就是块复旦卡,或是仿复旦的卡。

    到此步,其实已经证明我们使用密钥B= FFFFFFFFFFFF可以读并改写存储区的内容。

    对第5块进行写入“FFFFFFFFFFFFFFFFFFFFFFFF”;然后回读;再把原内容写回;再读出一系列操作。

图14. 对乙第5块用密钥B写、读、写、读。

    这些操作都成功了!这意味着对乙卡的攻击成功。


2.4.        防御
2.4.1. 密钥B攻击的应用层防御

       1)应用时改变密钥的初始值

       密钥的初始值指卡片出厂时被赋予的设置,一般都是“FFFFFFFFFFFF”,在应用期。密钥A和B都应该重新设置。特别是当系统指定使用密钥A的时候,不要忘记要把B也换掉。否则它就是一个后门。

       2)后台建账,定期核对

       为每张卡建立账户,记录每次(天)充值、消费和余额信息。并尽量每天对账,找出可疑账户记录。

       (在本例中,丙食堂两张卡性质是不一样的,丙1是正式卡,办卡时登记了个人信息,若丢失可以挂失并找回余额;丙2是临时卡,不记名不挂失。显然,对丙2的攻击篡改是不易被系统察觉的。)

       3)应用层数据保护

       终端对存储在数据块中的应用数据(电子钱包余额等)使用较强的算法进行加密后再写入,或对关键数据进行mac计算后将MAC码与数据一并保存在数据块,读入时进行验证。但此方法只能解决随意改写的攻击。


2.4.2. 密钥B攻击的密码层防御

       限制密钥B在可读条件下的使用权限,取消此时的认证功能。


2.4.2. 密钥B攻击的芯片层防御

       在芯片层工程实现密码层的防御措施。


2.5.        总结与评估

       应用层面的攻击是成本最低、用时最短、技术含量最低、最易实现又最易获利的攻击,所以带给应用系统的安全风险实际是最大的。

       两年前我在试着丙食堂的卡时,发现他们使用的是M1卡或说是符合M1卡规范的兼容卡,虽然密钥B让我猜中,但却无法继续操作,望卡兴叹。想不到两年过去了,丙食堂的卡变得不堪一击,差到无法当例子。圈内圈外的人们在这两年间又发表了难以数计的文章介绍种种IC卡的攻击与防御,可现实中应用系统的安全性却越来越差。统计一下在专业、半专业的智能卡技术杂志发表的安全文章,就会发现几乎所有文章一说到安全,一说到攻击,就是旁路分析。就是功耗攻击,再就是故障引入……。几乎没有人关心就在身边眼前的应用系统的安危,而以我不乐观的估计,全国至少百分之五十的IC卡小额支付系统和门禁系统是不够安全的。

 

项目

内容

备注

案例名

M1兼容卡密钥B攻击

 

攻击对象

M1兼容卡卡内数据

 

攻击结果

通过认证,读出并篡改成功

 

攻击层面

应用层

 

攻击强度

*开发强度

D级

 

**利用强度

E级

防御层面

事前

密码层、应用层

仅指最有效措施

事发

应用层

防御效果

只要想到,就能防住

 

后果评估

 

 

系统风险

中高

虚假收入

个体风险

需要抵御的是“白吃”的诱惑

 

<第一部分>完

 


 

 

                                             论文引用文献目录

【1】《Smart Card Handbook Third Edition》  Wolfgang Rankl and Wolfgang Effing

       Giesecke & Devrient GmbH, Munich, Germany

【2】《sim卡ki扫描破解全攻略》

【3】《浅析Mifare被破解的过程》

【4】<Cryptanalysis of Crypto  Karsten Nohl  University of Virginia

【5】A Practical Attack on the MIFARE Classic   Gerhard de Koning Gans, Jaap-Henk Hoepman, and Flavio D. Garcia Institute for Computing and Information Sciences  Radboud University Nijmegen

【6】 Dismantling MIFARE Classic   Flavio D. Garcia, Gerhard de Koning Gans, Ruben Muijrers, Peter van Rossum, Roel Verdult, Ronny Wichers Schreur, and Bart Jacobs  Institute for Computing and Information Sciences,  Radboud University Nijmegen, The Netherlands

【7】 Wirelessly Pickpocketing a Mifare Classic Card  Flavio D. Garcia Peter van Rossum Roel Verdult Ronny Wichers Schreur Radboud University Nijmegen, The Netherlands

【8】 Mifare (In)Security Update January 2008 

By Dr David Everett, CEO, Smart Card Group

【9】NF1ICS50 Functional specification Rev5.3.-29January 2008 product datasheet

【10】FM11RF08 8Kbit  Contactless Card IC Functional Specification 复旦微电子

 

后记:文本传上来了,里面的插图去没有,真是一大遗憾! 缺了图,这文章几乎就不可理解!就算是个“洁本”吧!

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值