(1)攻与防:哑智能卡
简单的攻击是使用一个定制程序的智能卡,并具有记录和分析功能。数年前这是几乎不可能实现的,因为只有从少数公司才能获得智能卡和用于制造它们的微处理器芯片。今天智能卡和配置的程序可以从许多公司公开订货,当然就敞开了攻击者增多的选择。即使没有这些,略作努力就可用一张塑料卡,一个表面安装器件SMD(Surface Mounted Device)封装的标准微处理器组装起一张智能卡,这样的一张卡至少可用来模仿一张真正的智能卡的电气接口并以同样的方式进行数据传送。智能卡的Java技术同样也提供了新的可能性,它能比较容易生成程序并装入哑卡之中。
用这样的一张哑卡,至少可记录下一部分和终端的通信并对这些信息进行评估,几次尝试后,就有可能像一张真实的智能卡那样以完全相同的方式执行部分通信。
这样的攻击能否取得成功是可怀疑的,因为所有设计的应用对重要的活动都是加密保护的。只要不知道秘密密钥,攻击就不可能取得超过第1次鉴别的进展。如果已经知道了密钥或是整个应用的运行没有任何加密保护时,这样的攻击就可能取得成功。如果真的存在着这样的攻击,值得疑虑地是由这种类型的攻击所取得的利益,是否足以补偿为安排这一攻击所需的花费。
(2)分析:确定智能卡的命令组
智能卡所支持的命令和指令类别并不总是公开的,但可以很容易确定它们是什么。关于完全确定智能卡的命令组比攻击智能卡的安全性要有趣一些,而攻击却可以是构建在这一信息的基础之上。
图1说明用来确定命令表的过程。首先用一个可自由编程的终端产生一命令APDU并把它传送给IC卡,在APDU 中的类别字节随每一APDU而改变,覆盖了自“00”至“Ⅲ”的范围,随着接收到的回送代码不是“无效类别 ”,则第1个有效类别字节就确定了。通常有两或三个有效类别,在下一轮中可用来试出所有可能的指令字 节。有不同指令字节的命令APDU被传送至智能卡,而那些不产生“未知指令”回送代码的则被记录下来。终 端中特定的合适的软件,用这一方法能在1~2分钟内断定一给定的智能卡支持那些命令。某种程度上,这样 的识别法也可能把一些参数以类似的方式确定下来。
图1 详尽搜索被智能卡操作系统支持的所有命令的基本流程。除了指令的调用不受状态机的控制外,这一过 程将识别所有受支持的命令。其工作原理为系统依次试出所有类别字节(CLS)和指令字节(INS)的编码, 而与任何命令内容(安全通信,逻辑通信,Vpp控制等等)无关如果只采用ISO/IEC 7816-4标准所允许使用 的类别字节,并允许指令字节作为索引变量时,则所述算法可显著加快,把安全报文通信和逻辑通道考虑在 内可大大减小类别字节的编码空间。类似的改进可由仅采用偶数值的指令字节作出,因为众所周知,奇数值 编码含有Vpp的控制信息,已不再是必要的了。
这种关于指令类别、命令和参数的简单搜索算法,它能如此有效的原因在于所有智能卡操作系统中的命令 解释器,对接收到的命令的处理是从识别类字节开始而逐步扩展到跟随其后的各个字节的。随着识别出第1 个无效字节后,此过程就立即结束,并产生一个适当的回送代码回送至终端。
然而,这样的过程只是在没有全局状态机监视命令序列的智能卡时才这样工作的。如果存在有这样的状态 机,至少有可能用此方法以步进的方式确定命令序列。
攻击者能从这一过程中取得的好处并不那么大,因为通常命令组不是秘密。然而它毕竟提供了一个简单而 快速地方法去确定所有命令。在确定操作系统供应商有无在软件中引人任何未为文件规定的命令时,它是很 有用处的。
(3)攻击:窃听数据传输
一张略作修改的智能卡可用来在一会话期中窃听数据传送并在需要时操纵数据。所做修改包括在I/0接触 面的顶部粘贴一个绝缘的哑触头,新的(哑的)触头和原来的I/0触头都接至一台快速计算机,经适当编程 这台计算机可删去或插人任何所需的数据到终端和智能卡的通信中去。如果计算机足够快,终端和卡都不能 检查出正常的和被操纵的通信之间的区别。
很显然,用这一方法能影响会话期中的过程。攻击者是否能由此方法获得任何利益取决于智能卡中的 应用。一个的设计原则是对通信的窃听、删除数据和插人数据均不允许对安全性有所削弱。如果这条原 则未得到遵守,攻击者就可用此方法得到好处。已经有使用模拟存储卡进行欺诈的。
为了对这种攻击提供防范,某些终端将有闸门装置(如图2所示)以切断附加在智能卡上的任何导线,也可 以有效地使用安全通信来可靠地检测出在数据传输时对数据的任何操纵。
图2 在终端的机壳之外扩充一智能卡适配器对卡进行测试(在左方可以看到8个触点,而右方则有着一个区 域可以安装电子线路)
许多终端只能在受监控的情况下使用,这使得难于在这种终端上使用带有引线和相伴随的计算机的受控卡 。简言之,这种类型的攻击可看作是理论上极受关注的和十分有前途的,但在实践中却是不可能的,而且亦 不能可靠地获得成功。
(4)攻与防:切断电源供应
直到近为止,一种对许多智能卡进行的有效攻击是在执行一条命令的某个时刻切断电源。这种攻击的背 景是对常规的编程而言所有写入EEPROM页面的操作是相继地执行的。如果程序员未能明智地安排写操作的顺 序时,则在适当时机切断电源将有利于攻击者。
这一点可用简单的例子来说明。在电子钱包的应用中,如果钱包在一条装入命令执行后的余额是在记录文 件更新前就增加了。对攻击者来说就有一个好机会可自由向智能卡装人,只要在正确的时刻切断电源,或以 微秒的(!)把卡从终端快速拉出即可。钱包内容的余额已经改变为新值,但却没有关于此项交易的任何记载和对此命令的响应。对在过去使用的简单的电子钱包系 统,这样的攻击的确有实实在在的可能性(原理见图3)。
图3 在电子钱包中写人新余额(DM:德国马克)的过程。本例中,假定EEPROM的擦除状态为1,这就是说, 由干EEPROM的工作方式,即使只有一位需要由I改变为0,也必须擦去整个ELPROM页面(即把它所有的们均置 为1)。本例中,如果智能卡的电源被准确地在EEPROM被擦除后切断,即在第3步之后,则钱包余额被设定为 其值,从而使攻击者窃得了钱.这当然可用元进程(atomic Process)来可靠地予以防止
为了确定结束处理的时刻,攻击者只要用一台电子计数器去计数当命令发生后的时钟脉冲数,作一系 列的试验逐渐增加时钟计数直到确定正确时刻为止,很难用一台计算机(增加和减少)来使整个过程自动化 。
虽然,这种类型的攻击看起来很有意思而且易于模仿,但在实际上还是有有效对策的。简单的手段就是 使用一个选择好的EEPROM写入命令序列。这方面关于多扇区电子钱包的EN 1546标准就很值得一试,因为在 该标准中描述的所有电子钱包都明显地对这类攻击实行了防护。
然而,即使完善的写操作序列也不能使其本身得到的保护。可用另一个例子来说明,当前例的电子钱 包已经装入后,在写处理之前有必要擦除EEPROM,如果EEPROM的擦除态为钱包余额的值,就像在通常的 情况中那样,只需在正确的时刻切断电源就可使钱包装入值,当擦除操作刚刚完成而写操作尚未开始时 就是恰当的时刻。
操作系统设计者知道一种对此类攻击的有效对策,元进程的特点是它是不可分割的,这就是说要么它被完 整地执行要么就完全不执行。这就对刚刚叙述的这类攻击提供了恰当的保护,即使是在EN 1596标准中叙述 的EEPROM写操作的序列仍然在几个地方需要元进程去防止这种类型的攻击的实现。
(5)攻与防:在PIN比较时的电流分析
一项技术上非常惹人注目的攻击是特征比较,例如PIN。可以用对一参数的实体测量和逻辑值变化的组合来 实行,这种类型的攻击涉及到传送数据给智能卡并在卡中与相应之值比较,按照比较结果使重试计数器增量 等所有这些方面。
攻击工作的原理是测量卡所汲取的电流,例如测量串接在Voc引线中电阻上的压降。如果一含有比较数据的 适当命令被传送给卡,即使在回送代码被接收之前就有可能从电流测量中看到重试计数器是否被增量。用这 种方法可以确定比较之值,如果在重试计数器增量之前就回送代码,则比较结果是肯定的。这可由把所有比 较值的可能变化都传送给智能卡来完成,如果比较结果是否定的,则在重试计数器增量之前就切断卡的电源,一个肯定的结果可由相关的回送代码清楚地识别出来,它是在写人重试计数器之前传送的。
有两种基本的方法可抵御这种类型的攻击。简单的防御包括永远在比较之前先对重试计数器增量,如果有必要时而后再减去此值。不管攻击者在什么时候切断卡的电源,也不可能取得任何好处,因为重试计数器已经增量了。第2种防御比较复杂,但可满足同样的防御功能。在此方法中,重试计数器随着否定的比较被增量,而随着肯定的比较结果则写人一未占用的EEPROM单元,在处理中这些写入访问发生在同一时刻,所以攻击者不能从比较结果得出有关的结论,只有在接收到回送代码时才能了解比较结果,而在这时再去切断电源来阻止对重试计数器的写访问已经是太迟了。
(6)攻与防:对PIN的比较时间安排的分枥
程序员ElJU是为使程序执行得尽可能快而付出大量的关注。通常,这也是一个重要的因素。而事实是一项被化了的处理的执行时间,可被用于有足够成功机会的攻击。若PIN被送至智能卡以便比较,负责比较的子程序通常把接收的PIN与存储的PIN之值逐字节地比较,一个没有安全意识的程序员所编制的程序将在两个比较值第1次出现差异时就立即结束子程序并返回调用程序。这将引起比较的执行时间的细小差别,它可用适当的设备,例如一台存储示波器明确地予以测量,这一信息可被攻击者以比较简单的方式用来决定秘密的PIN代码。
直到数年前,这种类型的攻击对智能卡仍然有效,今天它是一种已知的攻击类型,比较子程序也设计得总是要把PIN的所有数位都比较完毕。这就是说在肯定与否定的比较结果之间没有时间差。
(7)防护:无干扰加密算法
智能卡应用的安全性是建立在加密算法的秘密密钥的基础之上。为了对卡执行某种类型的访问或采取某种措施,终端总是首先必须在秘密密钥的帮助下鉴明其本身。对于攻击者来说,卡对终端的鉴别成为极受关注的攻击目标是可以理解的。关于对卡的攻击,由终端对智能卡的鉴别并不令人感兴趣,因为使用一个(哑)终端就能按需要操纵智能卡。
智能卡给终端发送一随机数来鉴别它,终端加密后回送给卡,然后智能卡执行相同的加密并比较此结果与自终端接收之值。如果一致,则终端已被鉴明它将收到一相应的回送代码。如果鉴别失败,卡将回送不同之代码。攻击者的出发点就是在传送命令后的处理时间与智能卡响应返回的时间之间进行分析。
在90年代的初期,仍有某些在使用中的加密算法其执行时间明显地依赖于密钥和有关的明文(参见图8.37),由此所导致的密钥空间的缩小,使攻击者可用一种强力的攻击去搜索秘密密钥。需要多长的搜索时间依赖于算法受多大的干扰而定,时间差别越大,密钥空间就越小,因而就较易且较快地搜索到密钥。如果所提及的算法在目标计算机上的实现为已知,这一信息也可被包括在内作为产生计时表的参考。在Paul Kocher于1995年的一份出版物[kocher95]中,把这类攻击公开称为“计时攻击”(timing attack),它主要考虑的是RSA和DSS算法的时间依赖性。
原理上,计时分析对智能卡的安全性具有极其危险的威胁。然而,由于这类攻击已经被了解到较长时间了,所有今天的智能卡只使用无干扰的加密算法,这就是说加密和解密占用的时间与输入值无关,从而就堵塞了这类攻击。然而程序员们对此有相矛盾的观点,因为无干扰的算法通常需要较多的程序代码并且总比有干扰的版本要慢些,原因在于无干扰算法必须设计得使通过程序的路径对所有的明文数据、密文数据和密钥都是等长的。于是长的所需路径就成了基准值,而所有其他路径必须适当地修改以便与此长度相匹配。
图4 密文和明文对受干扰的加密算法的影响之例(图中给出了密文和明文空间的一部分,
它是用一个老的DES算法实现产生的,对每个测量值进行了100 000次迭代)
为了提供额外的安全性,在某些应用中所有鉴别密钥有它自己的重试计算器,只能执行有限次数的不成功鉴别。一旦重试计数器达到值,智能卡将封锁所有对鉴别的更进一步的尝试。
(8)操纵:差分故障分析DFA
众所周知,电子元器件的性能当它们在电磁干扰之下时将被削弱。例如一台移动电话的干扰能使含有多种类型处理器的小型计算机控制的应用崩溃,其内容可被高频交流场所改变,使存储单元失效。1996年,Dan Boneh,Richard DeMillo和Richard Lipton出版了论文[Boneh96],描述了用引入扩散硬件故障来确定非对称加密算法的秘密密钥的理论模型。由于这三位发现者,那时在贝尔通信研究(Bellcore)实验室工作,这种类型的攻击通常被称为Bellcore攻击。仅在两个月后,Eli Biham和Adi Shamir就发表了对Bellcore攻击的扩充,称为差分故障分析(DFA)[Biham 96],它还包括了对称加密算法,诸如DES。这就是说,至少在理论上,许多智能卡应用受到了这类方式的攻击。
以上两种攻击的基本原理是比较简单的。第1步,任意的明文用待破解之密钥加密,并将结果的密文存起来,接着在卡处理加密算法的操作时受到了干扰,例如将它暴露在离子辐射或高频辐射之下,使得在计算进行时密钥的任何位置上的某单独一位被改变。这样就产生了由于此位之改变而未被正确加密的密文。这一过程被重复若干次之后,所有的结果均被用来分析,剩下的决定密钥值的处理就纯粹是数学的事了,这些内容详细叙述在刚才提到的论文中。
这一攻击之所以强烈主要是基于这样的事实,即甚至不必要去知道秘密密钥中被改变位的位置。Biham和Shamir在他们的论文中断言对于单个破坏了的密钥位,200加密字组就足够用来计算DES密钥了。如果是以3DES(密钥为168位)来代替单元的DES,所需密文数量并没有明显的增长,即使是多于一位的改变,这一攻击仍旧有效,惟一的结果是需要较多的不正确加密的密文。
这种攻击实践起来并不像听起来那么简单。如果需要在所有的可能中只有一位改变,或仅有很少数位改变,然而当整个微控制器完全笼罩在微波辐射中,大多数的情况下有很多位将会改变,一般来说,毫无例外的是处理器将崩溃。结果只好用特别准备的闪变信号(glitch)①注人到电源或时钟中去以试图诱发处理器产生受隔离的计算错误。如果在相关的输入引线端的滤波器不能抑制掉这些闪变信号,它们就可能产生所期待的处理错误。
然而,智能卡在面对Bellcore攻击或DFA时,只要使用了适当的预防措施就不会是完全无能的,简单的防御就是把加密算法计算两遍并比较这两个结果。如果它们完全相同,则说明没有改变任何一位的外部干扰。这里假定有意引人的扩散差错决不可能在一列的同一位改变两次。这也是一个符合实际的假定,因为假设能选择性地改变智能卡处理器中的某一特定位,则攻击就可能比DFA要简单而快速得多。两遍计算的主要缺点是需要额外的时间,可能会引出新的问题,这些攻击主要用于耗费时间的非对称加密处理,诸如RSA和DSS。
另一个可以达到有效防御差分故障分析的方法是永远加密不同的明文,简单的方案就是对要加密的明文前缀以一随机数,就是说使加密算法永远加密不同的数据,这样就使DFA成为不可能的了。
总之,对于没有适当保护手段的智能卡,Bellcore攻击和差分故障分析无疑是有可能成功的攻击类型。所有智能卡操作系统和应用都会在它们被解密后立即做了修改以保护自己免于这类攻击,所以当前不论是Bellcore攻击或是DFA都已不再成为严重的威胁。
欢迎转载,信息来源维库电子市场网(www.dzsc.com)
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。