诱导认证缺陷以绕过信用卡密码
——Inducing Authentication Failures to Bypass Credit Card PINs
1 研究背景
万事达卡为全球金融机构、政府、企业、商户和持卡人提供领导全球性的商务链接。借助旗下的MasterCard、Maestro、Cirrus品牌,和作为核心产品的信用卡、借记卡和预付卡,以及创新多功能性平台,如MasterCard PayPass™和MasterCard inControl™,万事达卡不断促进全球商务,为超过210个国家及地区的消费者、政府和商户提供服务,截至2021年12月31日,万事达卡用户已经开通了30亿张MasterCard和Maestro。
而论文则提出一种通过诱导MasterCard脱机数据认证机制过程中的缺陷绕过信用卡的PIN密码的方法,并将其应用到MasterCard(一种借记卡、信用卡或预付卡)和Maestro(一种借记卡)。在高于限额时使用PIN进行支付,低于限额则无需使用PIN,即免密支付。所以论文是提出一种可以在大额支付时绕过PIN码的方法,并且在物理世界可以通过两个在用户卡和支付终端(例如pos机)之间的中转设备,对小额支付和大额支付都进行攻击,在客户不知情的情况下使得交易进行,并从持卡人的账户中扣除金额。
部分关键词缩写、全称及中文含义
缩写 | 全称 | 中文含义 |
---|---|---|
EMV | Europay, Mastercard, VISA | 由Europay, Mastercard, VISA三方制定的用于现代智能卡支付的标准协议 |
ICC | Integrated Circuit Card | 集成电路卡 |
CVM | Cardholder Verification Method | 持卡人验证方法,例如pin密码验证、指纹验证、签名验证 |
DDF | Dictionary Definition File | 字典定义文件 |
AID | Application Identifiers | 应用标识符 |
ADF | Application Definition File | 应用定义文件 |
FCI | File Control Information | 文件控制信息 |
PDOL | Processing Data Object List | 处理数据对象列表 |
AFL | Application File Locator | 应用文件定位器 |
AIP | Application Interchange Profile | 应用交互特征 |
SFI | Short File Identifier | 短文件标识符 |
CDOL | Card Risk Management Data Object Lists | 卡片风险管理数据对象列表,即与交易相关的数据对象列表 |
CDA | Combined Dynamic Data Authentication | 组合动态数据认证 |
ATC | Application Transaction Counter | 应用交易序号 |
ODA | Offline Data Authentication | 脱机数据认证 |
POC | Proof-of-concept | 概念验证,是对某些想法的一个较短而不完整的实现 |
2 方法介绍
接下来将从万事达卡交易和脱机数据认证机制开始介绍,并引出其中的漏洞,然后介绍具体的攻击方法。
2.1 一次万事达卡交易的四个过程
2.1.1 应用选择:终端(刷卡机)和ICC就EMV非接触式协议达成一致,该协议在终端上作为约定俗成的内核实现。
终端通过向ICC上树形结构的文件层次结构中的一个元素——字典定义文件(DDF)发送SELECT 2PAY.SYS.DDF01 command来启动交易。
ICC的响应包含受支持的应用列表,由它们的应用标识符(AIDs)标识。
在终端端,接收到的AID(或AIDs列表)导致内核激活,这个步骤也可以理解为选择用于ICC和终端之间当前交易的协议。
支付系统的EMV非接触式规范列出了以下的内核:
Kernel 2 for Mastercard AIDs.
Kernel 3 for VISA AIDs.
Kernel 4 for American Express AIDs.
Kernel 5 for JCB AIDs.
Kernel 6 for Discover AIDs.
Kernel 7 for UnionPay AIDs.
文章主要关注Kernel 2 for Mastercard AIDs,用于万事达卡的Kernel 2。
2.1.2 同步:终端与ICC协商要使用的选项,例如持卡人验证方法(Cardholder Verification Method,CVM),并交换成功完成交易所需的信息,例如发卡机构要求的数据元素。
终端发出SELECT command,在ICC上选择对应的ADF (application Definition File)文件。(AID标识终端端的应用,而ADF表示ICC上应用的对应文件名。)
ICC响应一个文件控制信息(FCI)消息,其包括一些信息,例如,卡的语言首选项和处理数据对象列表(PDOL),这是一个终端驻留数据对象列表,ICC用它来处理后续的GET PROCESSING OPTIONS command。
终端通过发送GET processing OPTIONS命令开始交易处理,其中包含卡在PDOL中请求的数据元素。
ICC的响应包括应用交互特征(AIP)。其具体说明了卡的可用功能和应用文件定位器(Application File Locator, AFL它标识了卡上用于交易的文件和记录。)
终端通过对ICC上的数据元素(数据元素由相应的短文件标识符(SFI)和record number标识)使用READ RECORD commands来访问所需的信息。
ICC返回以下数据元素(对于某些记录,我们隐式地假设ICC上的相应功能可用,即这些功能可能不可用所以没有返回对应数据):
- 主帐号(PAN)。
- 卡风险管理数据对象列表(CDOL1和CDOL2):两个与交易相关的数据对象列表,终端将在后面的步骤中发送给ICC签名(脱机和在线验证)。
- 持卡人验证方法(CVM)列表。
- pki相关信息:卡和发卡人的PK证书,以及发卡机构CA的索引。
此时,终端和ICC已经根据要求引导了必要的参数配置并确定了它们的结构。同时,终端已经接收到证书和密钥来脱机认证ICC。由于记录的哈希值包含在ICC的证书中,因此终端可以验证这些记录的完整性。
对于非接触式EMV支付,在协议的这个阶段还没有观察到终端对静态数据的认证。但是,静态数据的完整性稍后在更一般的脱机动态数据认证过程中进行验证,该过程还包括与交易相关的动态数据,例如支付金额。
2.1.3 持卡人验证:终端验证进行购买的人是该卡的所有者。
持卡人验证方法包括:
- 在线PIN码:终端将在终端pad上输入的密码加密后发送给发卡方进行验证。
- 设备自带CVM:谷歌Pay、Samsung Pay或Apple Pay等移动支付应用提供了在设备上验证持卡人身份的可能性。通常,他们使用指纹识别器或面部识别来实现这一目的。
- 纸质签名:持卡人在购买收据(数字或纸质打印)上签名,收银员将签名与卡片背面的签名进行核对。现代支付终端通常提供触摸屏,持卡人可以用手指或数字笔签署交易。
如果交易金额超过预定义的阈值(cvm要求的限额),终端将要求对持卡人进行验证。终端选择的方法取决于CVM列表,该列表由ICC在从应用文件读取的记录中提供。
可以修改卡提供的CVM列表,使终端根本不请求CVM,或者请求签名而不是PIN。
2.1.4 身份验证和授权:终端和卡采取行动,决定此时是否应该拒绝交易,或者是否需要进一步的验证方法,例如(i)脱机数据认证或(ii)在线授权
终端发送GENERATE AC command,通过bCDA告诉ICC是需要组合动态数据认证CDA还是只进行在线授权。
bCDA := AIPB1b1 AND valid(CA PK Index) AND · · ·
ICC这边
基于应用交易序号(ATC Application Transaction Counter )和秘密密钥MK派生会话密钥S
S := KDF(MK,ATC)
从PDOL和CDOL1中提取相关的数据元素,并将结果连接在一起作为X。
X := construct_AC_input (PDOL,CDOL1)
计算应用密文(AC 应用密文)
AC = MACS(X||AIP||ATC||IAD)
如果bCDA==1,则进行组合动态数据认证,M=SDAD,组合动态数据认证过程如下
建一个随机只使用一次的NC
NC := random()
将数据元素PDOL、CDOL1、CID (Cryptogram Information data)、ATC (Application Transaction Counter)、IAD (Issuer Application data)连接并散列(使用SHA-1),生成交易数据散列码(TDHC Transaction Data Hash Code):
TDHC = h(PDOL||CDOL1||CID||ATC||IAD).(h是sha-1散列值)
然后将TDHC进一步与应用密码(AC Application Cryptogram)、CID和nonce NC结合,以构建
Y = AC||CID||NC||TDHC
最后,将Y与Y和终端的不可预测数(UN)的连接散列连接起来,然后使用ICC的私钥进行签名,以生成签名的动态认证数据:
SDAD =signprivC (Y||h(Y||UN))
如果bCDA!=1,则M=AC,不进行组合动态数据认证。
ICC最后将CID,ATC,IAD,M发给终端。
终端根据bCDA的值以及证书和标志位等信息对交易进行认证,确定拒绝交易、接受脱机交易或请求在线认证。
2.2 攻击过程
攻击建立在以下和现实情况贴近的假设下:
- 攻击者在受害者的非接触式卡的NFC范围内。
- 攻击者为NFC通道上活跃的攻击者。特别是,攻击者可以在该通道上读取、阻止和注入消息。
- 支付终端和发卡机构之间的通道是安全的,因为它提供了真实性和保密性。
- 如果有必要,攻击者可以复制与数字支付应用程序的图形用户界面相关的图像,显示攻击者自己的(手写)签名和姓名。
万事达卡内核规范规定,如果提供的CA公钥索引不存在于终端的CA公钥数据库中,则终端应设置终端验证结果(TVR Terminal Verification Results)的“CDA Failed”位。TVR是终端在整个交易过程中维护的数据对象(记录交易过程中,数据认证、处理限制、持卡人验证、终端风险管理、行为分析以及联机处理的结果),故保存有关验证过程(包括脱机数据认证(ODA))结果的信息。注意,这个TVR更新发生在终端发出GENERATE AC命令之前。这是文章中攻击以及数字支付的用户界面弱点所利用的基本设计缺陷。
根据内核规范,如果TVR显示CDA failed,AIP显示付款方不支持On Device CVM,则终端不会在GENERATE AC command中请求SDAD (Signed Dynamic Authentication Data)。这意味着不执行ODA(CDA正是ODA的一种形式),因此所有完整性仅由ODA机制保护的交易数据,很容易受到对抗性修改。
文章通过中间人攻击诱导这种过早的ODA缺陷模式来修改此类未受保护的数据。因此,它利用了这样一个事实,即在这种模式下,终端将在交易期间忽略所有(脱机)加密验证失败。
从技术上讲,攻击由以下三个步骤组成:
S1通过将应用标识符(AID,带有4F或84标签的对象)替换为Mastercard AID A0000000041010来修改卡对第一个SELECT command的响应。
S2通过将Mastercard AID替换为该卡的合法AID修改终端的第二个SELECT command负载。
S3修改卡对READ RECORD command的响应:
(a)将CA公钥索引(标签为8F的对象)替换为无效的索引,在示例中使用DD。
(b)删除CVM List(标签为8E的对象),或者用Paper Signature方法替换所有基于pin的CVM。
(c)清除Issuer Action Code (IAC)-Denial(tag为9F0E的对象),将其替换为全零。
步骤S1和S2仅与Maestro卡(前面一直说的是Mastercard信用卡,这里扩展到Maestro借记卡)相关,目的是欺骗终端执行默认的Mastercard交易流程。这两个步骤覆盖了可供选择的流程,这些流程可能不适用于专有的Maestro卡。AID缺乏完整性保护使得步骤S1和S2成为可能。步骤S3有两种方法
- M1 禁用该卡中所有持卡人验证功能(即删除CVM列表)。
- M2 将基于pin码的方法替换为纸质签名方法。
步骤S3(b)从可用选项中删除所有基于pin的cvm,供终端执行持卡人验证。(即M1)步骤S3(c)的作用是替换由公式计算出的值,使其值为0:
(IAC-Denial OR TAC-Denial) AND TVR=0
否则交易将被拒绝。
3.效果描述
3.1 攻击在物理世界的实现
作者们开发了一个概念证明(即Proof-of-concept,POC,是对某些想法的一个较短而不完整的实现)Android应用程序,以演示如何利用在万事达卡内核中发现的漏洞。应用程序使用两个Android手机实现了一个中间人攻击,这两部手机通过WiFi通过基于TCP/ip的中继通道相互通信。应用程序支持两种操作模式:POS模拟器和卡模拟器。POS模拟器负责消息的实际修改。卡模拟器运行我们为Android定制的基于主机的卡仿真服务。应用程序的屏幕截图如图4所示。
应用程序最少需要配置中继通道,并且必须激活POS模拟器和(受害者的)信用卡/借记卡之间的NFC通道。攻击的工作原理如下。一旦卡模拟器在支付终端的NFC范围内,它捕获终端的命令,将其中继到POS模拟器设备,然后POS模拟器设备根据需要修改它,并通过先前激活的NFC通道将其发送到卡。一旦卡响应命令,POS模拟器将适当地修改响应,将其转发给卡模拟器,然后卡模拟器将(可能修改的)响应传递给支付终端。对于终端的每个命令都要重复这个过程。
3.2 攻击效果
攻击效果如图:
使用来自2个国家的2家银行发行的5张不同的卡,每张卡都使用在线PIN作为首选身份验证方法,进行了13笔交易。所有这些交易都被接受了,并随后从持卡人的账户中扣除金额。在这里用粗体表示了绕过了PIN转移超过当地cvm要求的限额(80瑞士法郎)的金额。高于限额需要使用PIN码,低于限额则无需使用PIN,自然无需绕过,故成功规避了9笔交易的PIN验证。
对第9笔交易使用的Maestro卡,攻击没有成功。尝试了两种攻击的变体:将CVM从PIN降级为签名(M2变种,签名是有效签名,M2中的签名伪造的)和完全删除CVM List(M1)。在这两种情况下,非接触式交易都被终端拒绝。终端要求使用普通读卡器处理付款,然后要求输入密码。与成功绕过PIN的交易的日志相比,这些交易的日志没有显示出重大差异。特别是,终端提供的两个与cvm相关的数据对象,即值为3F0000的(CVMR)和值为2400008001的(TVR),都没有显示持卡人验证失败。即没有置TVR的第三个字节的第8位,这意味着持卡人验证成功,并且CVMR的第三个字节没有设置为01,也表明终端的持卡人验证成功。这表明发卡方的欺诈检测系统要求在线交易授权中的终端响应接触式芯片读取器。在最近发表了PIN绕过攻击之后,该发行机构对其欺诈检测系统进行了相应的微调,现在如果在非接触式交易中检测到违规行为,则要求切换到接触式芯片方法。
在论文作者和信用卡发卡机构的安全工程师进行讨论后,证实了自己的想法。在最近发表了PIN绕过攻击之后,发卡机构对其欺诈检测系统进行了相应的微调,现在如果在非接触式交易中检测到违规行为,则要求切换到接触式芯片方法。
文中对来自多个制造商的终端进行了实验。除了终端坚持完成CDA并如上所述终止交易的情况外,对于每个发卡人来说,攻击要么对该发卡机构所有的卡(我们可以访问)都成功,要么对发卡机构的任何卡都不起作用,很可能是由于部分发卡机构采用了欺诈检测系统,而部分机构没有。
3.3 防范措施
防御这种攻击的关键在于:不能接受脱机数据认证(Offline Data Authentication, ODA)失败的事务。可以通过参与交易的至少四个不同的参与者来实现。接下来,我们列出了这些行为者可以实施的四种具体对策,其中任何一种对策都足以阻止该攻击:
- 对策1 卡必须始终检查其CVM List与终端提供的CVM Results之间的一致性。也就是说,CVMR的前两个字节必须等于卡的CVM List中对应的字节。
- 对策2 终端必须始终持有记录TAC-Denial中的“CDA Failed”位。
- 对策3 发卡机构(或银行)必须拒绝TVR中“CDA Failed”置位的交易。
- 对策4 支付网络(例如万事达卡)必须始终拒绝TVR中“CDA Failed”置位的交易。(脱机数据身份验证失败CDA Failed位就会置位)
4 评价与思考
4.1 论文小结
文章首先是总结了一次万事达卡交易的流程和机制,并指出了脱机数据认证机制过程中如果AIP显示付款方不支持On Device CVM,则终端不会在GENERATE AC command中请求SDAD,即不执行ODA,因此所有完整性仅由ODA机制保护的交易数据,很容易受到对抗性修改。并针对这个缺陷提出了一种针对MasterCard的攻击方法,这种攻击方法通过诱导MasterCard脱机数据认证机制过程中这种过早的ODA缺陷模式来修改此类未受保护的数据,进行绕过PIN码的攻击。
并通过两种方式对缺陷进行利用,M1禁用该卡中所有持卡人验证方法(即删除CVM List),相当于通过攻击使得没有持卡人验证方法被使用,M2 将基于PIN码的方法替换为纸质签名方法,相当于降更安全的PIN码降级为没有那么安全的纸质签名方法。
此外扩展了攻击范围,通过修改交易应用标识符(AID),让终端将Maestro识别为MasterCard,从而将这一种原本用于攻击MasterCard的方法也能用于攻击Maestro。
然后文章将提到的方法进行工程实现,在物理世界实现自己的攻击,通过两台模拟设备POS机模拟器和卡模拟器对真实的POS机和卡进行中间人攻击,并在合法的情况下进行测试,并与一些发卡机构的工作人员进行讨论,分析一个攻击失败的、但与其他攻击成功的交易日志并无明显差异的交易中失败的原因。
最后提出了四种对策防御文中的攻击,并且提出防御文中的攻击的关键在于:不能接受脱机数据认证(Offline Data Authentication, ODA)失败的交易。
4.2 评价与思考
文章的研究背景极具现实意义和经济意义,万事达卡作为万事达国际组织与全球各地银行联合发行的银行卡,与各国的各个方面都关系密切,有着庞大的用户数量并且每天都会进行大量的交易,一旦出现漏洞或缺陷,将可能造成巨大的经济损失和法律风险,所以本文针对万事达卡中交易流程的缺陷进行的攻击极具价值。
并且在应用方面,文章不仅仅是指出漏洞,并在现实世界通过两台模拟设备POS机模拟器和卡模拟器对真实的POS机和卡进行中间人攻击对其进行了工程实现进行验证,表明万事达卡中交易流程的缺陷并不只是理论中存在,而是切切实实可以在现实世界中实现并造成损失的。这样一种聚焦于现实和工程实现的做法,也让文章更具备实践价值。
而文章在现实世界对其进行了工程实现进行验证的过程中,作者们也遵循法律规范,没有进行非法或者大规模的测试,并且也和相关的工作人员进行联系,及时的汇报了问题,并提出了自己的解决思路和解决方案,并没有为了研究的实时性而造成其他不必要的损失,例如在他们的实验过程中已经有部分机构修补了该漏洞,从而导致攻击失败,而他们也没有为了攻击成功而故意隐瞒自己的进度和成果,我想,安全领域的从业者,也需要有这种大局观和道德水平,才能更好地为网络安全贡献自己的力量。
此外在技术方面,文章的攻击方法很具备借鉴意义,通过修改交易应用标识符(AID),让终端将Maestro识别为MasterCard,从而将这一种原本用于攻击MasterCard的方法也能用于攻击Maestro,进一步扩展了攻击范围。这样一种扩展、发散的思维值得学习。
而漏洞本身的存在也说明交易流程中对关键数据进行保护的重要性,对于没有进行保护的数据应当保持充分的怀疑、或者说应该直接拒绝,但漏洞之所以是漏洞,正是流程设计者们并没有发现在某些情况下这些数据没有被保护,从而导致了漏洞的产生,所以不光要在流程上避免漏洞的出现更需要保证漏洞出现后,能够及时的处理问题,避免造成更大的损失。
正如文章中提到的,在交易流程的缺陷被提出后,有部分机构很快就对欺诈检测系统进行了相应的微调,如果在非接触式交易中检测到违规行为,则要求切换到接触式交易方法。但也存在部分机构,反应不够及时,这也是一种漏洞,如果某些有心人始终关注新漏洞的产生,就能利用部分机构反应不够及时的问题,利用时间差,使用这些漏洞对这些反应不及时的机构进行攻击。
漏洞的产生是不可避免的,人总会有疏忽的地方,但漏洞造成的损失是可以通过及时的反应、妥善的处理减小的,而边际效应的存在也告诉我们,或许预防漏洞、处理漏洞等多个方面同时下手,其产生的效果可能远远好于单纯只关注某一个方面,毕竟对一个方面的优化达到一定程度后,再进行优化的成本会更高,收益却一般。