本研究展示了如何利用完整性保护缺失(missing integrity protection)来绕过万事达卡交易的PIN码验证。为了进行概念验证,研究者构建了一个PoC安卓程序,可以修改未受保护的银行卡源数据,包括与持卡人验证相关的数据。通过该PoC程序,可以欺骗现实世界的终端,将 PIN 码验证降级为无持卡人验证或(纸面)签名验证。该研究的调查结果已向供应商披露,并已建议发卡机构拒绝任何离线数据身份验证失败的交易,相关代码已开源:https://github.com/EMVrace/auth-failure-attack
EMV(Europay, Mastercard, Visa)是现代智能卡支付的标准协议,全球流通着超过90亿张EMV卡。由于其重要性,该协议受到深入且持续的研究,最近的研究表明该标准的非接触式版本容易受到各种严重攻击。
EMV交易的安全性依赖于支付设备(例如信用卡/借记卡、智能手机或智能手表)对交易数据进行离线和在线验证的加密计算。在在线情况下,终端使用与发卡机构共享的对称密钥生成MAC,并使用该MAC向发卡机构请求对交易进行授权。会话密钥用于生成MAC,并通过会话密钥与发卡机构进行通信。在离线情况下,终端使用PKI验证银行卡的RSA签名,其中根CA证书从终端的内部数据库检索。
如果这两种身份验证机制中的任何一种失败,人们通常期望终端中止交易。然而,实际情况并非总是如此。例如,万事达卡规范(https://www.emvco.com/wp-content/uploads/documents/C-2-Kernel-2-v2.10.pdf )允许有效执行,在这种情况下,如果离线验证过早失败,终端就不需要中止或拒绝交易,而是忽略交易期间后续的离线验证失败。这一设计的重要性在于,它允许在未引起注意的情况下修改数据,且仅在离线验证时进行检查。
本文描述了针对Mastercard和Maestro卡的一种新型攻击,该攻击利用了无需离线数据身份验证(ODA,Offlfline Data Authentication)的执行方式。该攻击允许修改所有未包含在MAC生成中的数据,并用于在线授权。这些数据包括与持卡人验证过程相关的信息,例如持卡人验证方法(CVM,Cardholder Verifification Method)列表,该列表通知终端卡片支持的CVM方法。对该列表进行了两个修改,这些修改破坏了持卡人验证过程。
修改①:禁用信用卡上的所有持卡人验证功能(即删除列表)。
修改②:将PIN验证方法替换为纸质签名验证方法。
这两种修改都会导致终端错误地认为该卡不支持PIN码验证。因此,进行这些修改的攻击者可以使用被盗的信用卡进行大额购物,而无需输入卡片的秘密PIN码。
这种攻击是通过中继架构使用两部智能手机以中间人(MITM)的形式实施的,如上图所示。实际上,攻击者将其中一部手机放置在目标用户的信用卡附近。例如,这可能是因为目标用户丢失了信用卡,攻击者偷走了信用卡,或者攻击者可以简单地靠近目标用户。攻击者将第二部手机出示给终端,也可能出示给收银员。如下图所示,将该手机伪装成正在运行移动支付应用程序。两部手机转发目标用户信用卡与终端之间交换的数据,并对其进行修改,以便终端在不要求输入PIN的情况下接受付款,即使支付金额超出了通常需要PIN码的限制。
除了利用身份验证漏洞的中间人攻击,攻击者还通过修改②利用了与纸质签名方法相关的用户界面(UI)漏洞。在这种方法中,当信用卡与终端成功交互后,持卡人被要求在购买收据上进行签名。这个收据可以是物理收据,也可以是显示在触摸屏上、可用电子笔进行签名的数字收据。然后,收银员根据支付设备上的签名进行验证。支付设备可以是实体卡,在这种情况下,签名位于其背面;如果适用,也可以是电子设备,在这种情况下签名显示在其屏幕上,如上图所示。
拥有丢失或被盗信用卡的攻击者无法伪造信用卡上的手写签名。然而,对于基于智能手机的支付,他们只需展示带有持卡人姓名和签名的虚构支付屏幕即可伪造签名。这给攻击者提供了选择。不论使用哪种签名方式(手写与数字键盘),以及是否需要持卡人的身份验证,都要经过收银员的验证。因此,本研究的攻击不仅利用了EMV协议中的设计缺陷,还利用了数字支付方法中的用户界面漏洞。
通过修改②进行的攻击,攻击者展示了如何利用机制从一种环境(例如物理签名在塑料银行卡背面)转移到另一种环境(例如缺少签名的签名图像),从而导致漏洞的利用。
EMV生态系统涉及多个利益相关者。其核心是支付网络(如万事达卡和VISA),为从持卡人账户到商户账户的支付交易提供基础设施。金融机构(通常是银行)可以通过发行符合EMV标准的卡片成为该生态系统的一部分。销售商品和服务的商家可以运营符合EMV标准并连接到支付网络的支付终端。
为了保护交易并确保网络只接受合法的交易,银行采取了各种安全措施。本研究重点关注EMV通信协议及其元素的安全属性。为确保银行卡、支付网络和发卡银行之间的通信安全,发卡机构建立了一个全球分层的公钥基础设施(基于RSA密钥)。支付网络接受一组根证书颁发机构为发卡机构提供证书,而发卡机构则提供存储在其发行的银行卡上的证书。终端可以通过拥有根证书颁发机构的公钥来验证卡证书的正确性,并验证其是否为合法卡。
除了用于离线验证的非对称密钥外,银行卡还拥有仅与发卡行共享的对称密钥。最后但同样重要的是,持卡人使用PIN码、手写签名或智能手机进行验证,以确保每张银行卡的合法使用。
银行卡支付系统的另一个安全要素是欺诈检测。例如,这可能涉及对客户行为进行分析和异常检测。欺诈检测机制构建了额外的防御层,并可以验证技术上合法的交易。
EMV支持六种提供商特定的非接触式协议,这些协议定义了所使用的数据元素以及发卡机构、终端和集成电路卡(ICC,Integrated Circuit Card)之间数据交换的方式。除了必须支持的六种不同支付网络外,还需要特定于发行方的数据元素,具体取决于ICC的发行方。
集成电路卡和终端之间使用一系列命令-响应进行通信。终端发送命令,在集成电路卡上进行处理,并由ICC生成相应的响应。这些命令和响应作为应用协议数据单元(APDU,Application Protocol Data Unit)发送。
ICC上的数据存储在称为文件的信息项中,并以树形结构在ICC上进行排序。发卡机构负责确保ICC上的数据具有正确的格式。终端可以使用SELECT命令结合相应的文件名来访问文件。使用READ RECORD命令可以读取文件中的记录。一笔交易涉及以下步骤:
1)应用选择:终端和ICC之间就EMV非接触式协议进行协商,该协议作为所谓的内核实现在终端上运行。
2)同步:终端和ICC协商选项,例如要使用的持卡人验证方法(CVM),并且它们交换成功完成交易所需的信息,如发卡机构请求的数据元素。
3)持卡人验证:终端验证购买者是否为持卡人。
4)认证和授权:终端和银行卡采取行动来决定是否应拒绝交易,或者是否需要进一步的验证方法,例如离线数据认证或在线授权。
终端通过发送选择字典定义文件(DDF,Dictionary Definition File)的SELECT 2PAY.SYS.DDF01命令来启动交易,DDF是集成电路卡上文件树形结构层次中的一个元素。合法ICC的响应将包含支持的应用程序列表,这些应用程序由其应用程序标识符(AID,Application Identifier)进行标识。
在终端端,接收到的AID(或AID列表)将触发所谓的内核激活。该步骤也可以理解为选择当前交易所使用的协议,以便在ICC和终端之间进行通信。支付系统的 EMV 非接触式规范说明书(https://www.emvco.com/terms-of-use/?u=wp-content/uploads/documents/EMV-Contactless-Book-A-Architecture-and-General-Rqmts-v2.10.pdf )列出了以下内核:
万事达 AID - Kernel 2,
VISA AID - Kernel 3,
美国运通 AID - Kernel 4,
JCB(日本信用卡株式会社) AID - Kernel 5,
Discover AID - Kernel 6,
银联 AID - Kernel 7。
本研究重点关注万事达卡内核(Kernel 2),并将终端与该卡之间的通信描述为下图中的消息序列图。
作为应用程序选择的结果,终端知道在哪里可以找到成功完成交易所需的ICC信息。在以下消息中,终端了解发卡机构所需的数据元素,并向银行卡提供所需的信息。此外,ICC还提供有关可接受的持卡人验证方法的信息,并提供终端在后续步骤中使用的公钥和证书,以在称为离线数据认证(ODA)过程中对卡进行身份验证。
选择应用程序后的第一步是,终端发出SELECT命令来选择集成电路卡(ICC)上相应的应用程序定义文件(ADF)。银行卡通过文件控制信息(FCI,File Control Information)消息进行响应,其中包括银行卡的语言首选项和处理数据对象列表(PDOL,Processing Data Object List),PDOL即ICC处理后续GET PROCESSING OPTIONS命令所需的终端驻留数据对象列表。AID标识终端端的应用程序,而ADF表示该应用程序在ICC上对应的文件名。
终端通过发送前述的GET PROCESSING OPTIONS命令来开始交易处理,该命令在PDOL中包括卡所请求的数据元素。ICC的响应包括应用程序交换配置文件(AIP, Application Interchange Profile),其中指定了银行卡的可用功能和应用程序文件定位器(AFL,Application File Locator),后者标识了在银行卡上用于交易的文件和记录。
关于ICC的功能,终端通过使用READ RECORD命令来访问ICC上所需的信息,这些信息由相应的短文件标识符(SFI, Short File Identifier)和记录号进行标识。在ICC中,这些记录的顺序具有一定的灵活性。终端读取的记录包括以下数据元素:
主账号(PAN,Primary Account Number)
风险管理数据对象列表(CDOL1和CDOL2):供终端在后续步骤中发送的两个与交易相关的数据对象列表,用于ICC的签名(离线和在线验证)。
持卡人验证方法(CVM)列表
PKI相关信息:包括信用卡和发行者的PK证书,以及发行证书颁发机构(CA)的索引。
至此,终端和ICC根据发行方的要求进行了必要的参数配置,并确定了它们的结构。此外,终端已收到用于离线验证ICC的证书和密钥。由于安全关键记录的哈希值包含在ICC的证书中,因此终端可以验证这些记录的完整性。
对于非接触式EMV支付,在当前阶段,研究者尚未观察到终端对静态数据进行验证。然而,静态数据的完整性稍后在更通用的离线动态数据认证过程中进行验证,该过程还涵盖与交易相关的动态数据,例如支付金额。
持卡人验证方法(CVM)的目的是确保出示集成电路卡(ICC)的人确实是该卡的持卡人。根据万事达卡非接触式支付规范,ICC要求提供CVM列表。该列表定义了各种CVM及其在符合发行方定义的条件下应用的方式:
在线PIN:终端将持卡人在终端上输入的加密PIN发送给发卡机构进行验证。
设备上的CVM:移动支付应用程序如Google Pay、Samsung Pay或Apple Pay提供在设备上验证持卡人身份的可能性。通常使用指纹识别器或面部识别来实现这一目的。
纸质签名:持卡人在购买收据(数字或纸质打印)上签名,收银员将签名与信用卡背面的签名进行核对。现代支付终端通常提供触摸屏,以便持卡人可以使用手指或数字笔进行交易签名。
如果交易金额超过预定义的阈值(CVM要求限额),终端将要求持卡人进行验证。终端选择的验证方法取决于由集成电路卡(ICC)在应用程序文件中的记录之一中提供的CVM列表。
显然,不同的CVM对信用卡的非法使用施加了不同程度的难度。欺骗收银员相信伪造签名的合法性比正确猜测PIN码要容易得多,尤其是当信用卡在3次尝试失败后被锁定时。而在终端的触摸屏上输入签名时,情况会变得更糟,因为通常很难确定签名的真实性。
本文展示了一种通过修改信用卡提供的CVM列表的方式,绕过终端根本不要求CVM或要求签名而不是PIN码。此外,在交易授权阶段,发卡机构似乎没有检测到CVM列表的修改,从而导致有效交易的发生。
有两种中心安全机制可以用于防止滥用集成电路卡(ICC):离线数据认证(ODA)和在线交易授权(OTA)。这两种机制中的任何一个异常都可能导致交易被拒绝。
离线数据认证仅涉及终端和信用卡之间的通信,而在线交易授权还涉及发卡机构的参与。这两种机制都实现了关键数据对象(静态和交易特定)的完整性保护。尽管这些机制存在重叠,因为它们都保护某些数据的完整性,但还有其他数据对象仅受离线机制保护。这对于攻击来说至关重要。
对于EMV,存在一个终端接受的证书颁发机构(CA)列表,这些机构为发卡机构颁发证书,而发卡机构又为每个集成电路卡(ICC)颁发证书。发卡机构的证书以及ICC的证书已作为数据元素从信用卡中读取。它们使用CA公钥索引进行验证,CA公钥索引是由ICC提供的数据元素,它将终端指向其合法CA列表中的颁发机构。
EMV标准规定了两种形式的离线动态数据认证:动态数据认证(DDA)和组合动态数据认证(CDA)。集成电路卡(ICC)在应用程序交换配置文件(AIP)中声明其支持的离线身份验证形式。鉴于组合动态数据认证(CDA)是目前最常用的方法,下面介绍CDA的ICC处理过程:
创建随机数(NC);
将数据元素PDOL、CDOL1、密码信息数据(CID)、应用程序交易计数器(ATC)和发行者应用程序数据(IAD)连接起来,并对它们进行散列(使用SHA-1算法),以构建交易数据散列码:
然后,TDHC进一步与应用密码AC、CID和随机数NC组合,构建:
最后,Y、Y与终端的不可预测数 (UN) 连接的哈希值之间将连接,然后用ICC的私钥签名以生成签名的动态认证数据:
此签名保护了所有相关交易特定数据以及一些静态数据元素的完整性。除了被此签名保护的数据元素的完整性之外,集成电路卡的证书中还包含发卡的主帐号(PAN)和信用卡的公钥,以及ICC的静态数据元素,如CVM列表。
与离线数据认证涉及终端和ICC的通信不同,在线授权涉及发卡机构和ICC之间的通信。在线授权的安全性依赖于发行者和ICC之间共享的密钥(MK)。对于每个交易,ICC和发行者根据应用程序交易计数器(ATC)和MK导出会话密钥(S)。随后,执行以下步骤:
从PDOL和CDOL1中提取交易相关的数据元素,并将它们连接在一起作为X;
对应用程序密码进行计算:
其中MAC是使用密钥S的基于块密码的CBC-MAC。
离线动态数据认证(ODA)案例中的签名消息包含用于在线授权的应用密文。然而,根据终端的决定,将执行离线认证还是仅进行在线授权。终端会发送GENERATE AC命令,该命令中的参考控制参数告知ICC是否需要进行组合动态数据认证(CDA)或仅进行在线授权。
攻击者的威胁模型条件包括:
1)攻击者位于目标用户非接触式信用卡的NFC范围内;
2)攻击者是NFC通道上的主动攻击者。特别是,攻击者可以在此通道上读取、阻止和注入消息;
3)支付终端和发卡机构之间的通道是安全的,提供真实性和保密性;
4)如果需要,攻击者可以复制与数字支付应用的图形用户界面相关的图像,并显示攻击者自己的(手写)签名和姓名。
这种威胁模型是现实存在的。例如,如果目标用户的信用卡丢失或被盗,攻击者可能会获得对该卡的访问权限。此外,攻击者可以使用普通智能手机对NFC通道进行主动中间人攻击。
考虑到数字支付应用程序中的用户界面缺陷,攻击者具备了第四种能力。这意味着任何人都可以轻松复制与这些应用程序相关的用户界面图像,并在其上添加任何签名和名称,这使得纸质签名成为一种不安全的持卡人验证方法(CVM)。请注意,最初纸质签名是为塑料信用卡设计的,持卡人的姓名和签名很难伪造。
在EMV交易期间,支付终端使用离线数据身份验证(ODA)机制对信用卡和交易数据进行验证。该机制采用公钥基础设施(PKI),通过从终端的数据库中查找根CA证书来进行验证。数据库中的条目是由信用卡在响应READ RECORD命令时提供的以下数据所确定:
注册应用程序提供商标识符,源自应用程序标识符(AID);
CA公钥索引。
根据万事达卡内核规范,如果终端的CA公钥数据库中不存在提供的CA公钥索引,终端将设置终端验证结果(TVR,Terminal Verifification Result)中的"CDA Failed"位,TVR是终端在整个交易过程中维护的数据对象,它保存了有关验证过程结果的信息,包括离线数据身份验证(ODA)。此TVR的更新发生在终端发出GENERATE AC命令之前。这是非常重要的,也是此攻击所利用的基本设计缺陷和数字支付中的用户界面漏洞。
根据规范,如果TVR指示CDA失败并且AIP指示支付来源不支持On Device CVM,那么终端不得在GENERATE AC命令中请求签名动态认证数据(SDAD)。这意味着不会执行ODA,因此所有只受ODA机制保护的交易数据容易受到对抗性修改。
中间人攻击利用了早期的ODA故障模式来修改未受保护的数据,在这种模式下,终端将忽略交易期间所有(离线)密码验证失败。 攻击由以下三个步骤组成:
步骤①:通过将应用程序标识符(AID,标签为4F或84的对象)替换为Mastercard AID A0000000041010,修改信用卡对第一个 SELECT 命令的响应;
步骤②:通过将万事达卡 AID替换为信用卡的合法 AID 来修改终端的第二个 SELECT 命令有效负载;
步骤③:修改了信用卡对READ RECORD命令的响应:
(a) 将CA公钥索引((带有标签 8F 的对象)替换为无效索引(CA 公钥数据地址:https://www.eftlab.com/knowledge-base/243-ca-public-keys );
(b) 删除或修改CVM列表(带有标签 8E 的对象),将所有基于PIN的CVM替换为纸质签名方法;
(c) 通过将'发行方操作代码-拒绝'(IAC-Denial,带有标签 9F0E 的对象)替换为全零来将其清除。
步骤①和②的目的是欺骗终端以执行默认的万事达卡交易流程,这与Maestro卡无关。这两个步骤超越了可能适用于Maestro卡的替代流程,这些流程是专有的,攻击者无法使用。
步骤③(b)的效果是删除所有基于PIN的CVM,这意味着终端无法使用PIN作为持卡人验证的选项。
最后,步骤③(c)的效果是将一个值替换为零,该值使用以下公式计算:
注意,为了确保交易的离线拒绝,所有比特位置都必须为零。需要强调的是,只有在信用卡中没有已清除的IAC-Denial对象时,才需要执行此步骤。请注意,如果终端在接收GENERATE AC响应时将TAC-Denial的"CDA Failed"位设置为1,则终端操作分析将拒绝离线交易,因为公式的结果不会等于零。
研究人员开发了一个概念验证程序(PoC),用于展示在万事达卡内核中发现的缺陷。该PoC使用两部Android手机作为中间人,通过基于TCP/IP的中继通道在它们之间进行WiFi通信。PoC程序支持两种操作模式:POS机模拟器和银行卡模拟器。POS仿真器模式负责实际修改消息,而银行卡模拟器模式将运行基于主机的定制Android银行卡模拟服务(https://developer.android.com/guide/topics/connectivity/nfc/hce ),截图如下。
PoC程序需要配置一个中继通道,并确保POS模拟器设备和目标用户的信用卡/借记卡之间的近场通信(NFC)通道处于活动状态。攻击的工作原理如下:
一旦银行卡模拟器位于支付终端的NFC范围内,它会捕获终端的命令,并将其转发到POS模拟器设备。然后,POS模拟器设备会对命令进行适当修改,并通过预先激活的NFC通道将其发送回银行卡。一旦银行卡响应命令,POS模拟器会适当修改响应,并将其转发回银行卡模拟器。然后,银行卡模拟器将(可能已经修改的)响应传递回支付终端。这个过程对每个终端命令都会重复执行。
上表总结了PoC程序执行的交易情况,其中离线数据认证(ODA)失败,并且每张信用卡都使用在线PIN作为首选CVM。研究人员使用来自两个国家的两家银行发行的五种不同信用卡,在九笔交易中成功规避了PIN验证。
Mastercard内核的执行流程与American Express和JCB内核非常相似。这意味着该攻击可能适用于这些品牌的银行卡。对于VISA卡,该攻击进行了测试(对内核进行了一些小的调整),并且交易成功。然而,目前还不清楚是因为修改了CA PK索引导致ODA失败,还是终端只是忽略了未经验证的签名动态数据(SDAD)。
漏洞的根本原因是由于协议规范允许非接触式交易在终端无法验证信用卡公钥证书的情况下成功完成。易受攻击的执行流程要求将终端指向根证书列表中的无效索引,并且设置了零的TAC-Denial(终端内部的位向量)。
EMV规范建议不将TAC-Denial设置为零。然而,即使此攻击失败,终端实现似乎也没有遵循这个建议。即使尝试不成功,遵循建议的设置也会导致终端表现出不同的协议行为。因此,每个未遵循建议的规范实施的终端都容易受到此攻击。终端制造商可能没有遵循建议以避免误报,导致有效交易被拒绝。
在披露此攻击后,发卡机构相应地调整了其欺诈检测系统,现在如果在非接触式交易中检测到违规行为,则要求切换到接触式芯片方法。发行机构没有透露最终触发其欺诈检测系统拒绝交易的具体原因。然而,一个明显的情况是终端验证结果(TVR)中设置了"CDA Failed"位。
防御此攻击是相对简单的,至少在概念上是如此。以下是四个不同参与者可以采取的具体对策,其中任何一个都足以防止该攻击:
防御①:信用卡必须始终检查其CVM列表与终端提供的持卡人验证方法结果(CVMR)之间的一致性。换句话说,CVMR的前两个字节必须等于信用卡的CVM列表中的[CVM,条件]。
防御②:终端必须始终设置终端操作代码(TAC)拒绝的"CDA Failed"位。
防御③:发卡机构(或银行)必须始终拒绝终端验证结果(TVR)中设置"CDA Failed"位的交易。
防御④:支付网络(例如Mastercard)必须始终拒绝终端验证结果(TVR)中设置"CDA Failed"位的交易。
该列表按照全球数量进行降序排序。 例如,信用卡有数十亿张,但发卡机构只有数千个,因此防御③排在防御①之后。 相对于上述列表,相应对策的实施成本和部署工作也相应较低。
如果信用卡合法支持纸质签名方法,则防御①可能不起作用,无论它是否是首选。 例如,用于交易 4 和 5 的信用卡具有一个 CVM 列表,该列表指示纸质签名作为在线 PIN 的后备选项。 因此,防御①不会阻止对这张信用卡的攻击。 因此,在这种情况下,防御②-④是更优选的对策。
对于防御②,如果CDA失败会导致前文中的公式结果为非零值,这将触发(离线)下降。根据观察,已测试的每个终端的TAC-Denial都设置为零。
需要注意的是,防御②-④要求信用卡和终端都能够执行组合动态数据认证(CDA)。因此,防御①是唯一适用于双方(信用卡或终端)都不支持CDA的情况的对策。
对于使用EMV标准的信用卡交易,交易信息的完整性受到信用卡的加密保护。支付终端的完整性检查使用RSA签名,是EMV离线数据认证机制的一部分。发卡机构使用密钥MAC进行在线完整性检查。人们可能认为任何一个机制的失败都会导致交易失败,但事实并非如此,因为离线身份验证失败并不总是会导致交易被拒绝。因此,无法保证不受密钥MAC(在线)保护的交易数据的完整性。
研究者发现了万事达卡非接触式交易EMV协议中的一个缺陷,即早期离线数据身份验证失败会导致终端忽略信用卡在交易过程中的所有后续失败(基于PKI的RSA验证),包括静态和动态数据。
这个研究揭示了该协议中的一个重要安全漏洞,该漏洞可能导致交易数据的篡改和欺诈行为。发卡机构必须采取适当的措施来解决这个设计缺陷,以提高非接触式交易的安全性。