一、译者前言
在国内,我们可能已经习惯了支付宝、微信等电子支付方式所带来的便捷。然而在国外,电子支付环境普遍还没有那么成熟,美国等国家的主要消费方式还是通过信用卡刷卡进行,最厉害的大概也就是Apple Pay。由此,为解决出门携带卡片过多的问题,美国目前出现了一款名为FUZE的智能卡片,可以通过APP将多张信用卡、借记卡、礼品卡、超市卡、加油卡等卡片集于一身。本文就是对该卡片进行的安全性分析。最后,还是要非常严肃地说上一句,本译文不涉及任何漏洞的详细细节,仅用于安全学习与交流,请各位读者务必遵守相关法律法规,仅进行合法研究。
二、作者前言
本文主要进行了FUZE卡片的安全性研究,该卡片支持蓝牙,支持重编程。Fuze卡片只有一张普通信用卡的大小,却在致力做到“将你的整个钱包集于一身”。该产品的官网为:https://www.fuzecard.com/ 。
当我从@MBHbox( https://twitter.com/mbhbox )那里收到一张FUZE卡之后,我决定对它进行一下仔细的研究。在研究过程中,我使用X光对该卡片进行扫描,并成功地完整逆向了其蓝牙协议的设计,并在其中发现了一个安全漏洞。该漏洞允许攻击者通过蓝牙方式窃取信用卡号码,分配编号为CVE-2018-9119( https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-9119 )。
ICE9向FUZE产品的制造商BrilliantTS报告了这一漏洞,但该制造商没有对漏洞做出任何回应,也没有针对我们的报告采取任何行动。截至撰写本文时,CVE-2018-9119漏洞仍然在野外持续被利用。
更新:4月7日,BrilliantTS与ICE9团队取得联系,他们表示已经意识到这个问题,并计划在4月19日更新固件。此外,BrilliantTS还创建了一个邮箱地址security@fuzecard.com,用于接收大家提交的漏洞。对此举措,我们表示非常赞赏。更多详细信息,请参阅他们发布的通知( https://fuzecard.com/FUZE_NOTICE_20180406.png )。
本文主要分为以下部分:
- FUZE卡的概述;
- 使用X光对硬件进行“拆解”;
- 蓝牙逆向工程;
- 安全漏洞及PoC;
- 关于Coin的同类产品;
- 结论
对于已经具备相关知识的读者,可以直接跳到漏洞相关章节。
演示视频(YouTube):
三、FUZE卡的概述
FUZE卡是一个物联网设备,其大小、形状与正常的信用卡相同。用户要使用智能手机上的应用程序,通过蓝牙通信的方式,将信用卡信息写入FUZE卡片中。当用户支付时,需要借助于FUZE上的按钮和电纸显示屏(e-Paper)来选择要模拟的卡片。在选择之后,磁条会重新写入以模拟该卡片,随后便可以使用FUZE进行刷卡操作。
为了对FUZE进行配置,以及添加、删除信用卡,BrilliantTS发布了一个名为eCARD Manager的应用程序( https://www.ecardmanager.com/page/home/ecardmanager.html )。如果要添加卡片,用户必须将随产品附带的读卡器插入耳机插孔(如同Square dongle一样)。在实际测试中我们发现,这一过程是非常不靠谱的,可能需要尝试用读卡器刷20次才能识别出我的卡片。根据BrilliantTS的介绍,FUZE可以收录30张卡片。
FUZE确实具有一定程度的安全性。当用户首次设置FUZE时,系统会提示设置密码,密码为六个按钮的不同按键次序,但可以跳过此步骤。一旦配置密码后,该设备将只在手动解锁或贴近智能手机的情况下才能使用,否则将保持锁定状态。在锁定状态下,任何人无法访问卡上的任何数据,也不能对磁条进行写入。该设备还具有更高的安全模式,在该模式下,只有通过蓝牙连接到手机时,该卡才能使用。
根据其网站上的宣传图片,BrilliantTS计划推出一个支持EMV(芯片)的产品。但在撰写本文时,仍只有磁条版本推出。该卡还包含NFC电路,用于支持非接触式支付,但它不适用于最新的固件。
四、使用X光对硬件进行“拆解”
首先,我希望能了解该设备的内部构造。通常情况下,在对物联网设备进行分析时,首先要用一些工具拆下外壳,然后看一看里面的PCB。也有一些情况下,由于使用了环氧树脂进行封装,可能会导致失败。
而我们此次所研究的FUZE,该设备仅有0.03”的厚度,需要非常小心地移除塑料外壳。但是,我只有一个设备,不想冒着弄坏它的风险。
所以,X光成像是一个非常好的选择。为此我联系了John McMaster( https://twitter.com/johndmcmaster ),他曾经帮我拍过一些X光片( https://twitter.com/mpeg4codec/status/623658059282280448 )。在他所拍摄图像的基础上,我添加了一些注释:
从图片中,我们可以看到关于FUZE架构的一些关键特征。主板上的主要芯片是微控制器、电纸驱动程序和蓝牙系统芯片。此外,在主板上还有许多没有使用的功能部分,包括NFC和EMV(支持芯片卡)。
蓝牙芯片的封装类似于球形触点陈列,但它的球形引脚还是与之有所不同。经过仔细研究,Alvaro Prieto从中找到了CSR1013模块( https://www.qualcomm.com/products/csr1013 )。与nRF51类似,CSR101x系列是一个完整的系统芯片(SoC),支持运行自定义代码。因此,CSR1013上可能会存有一些应用程序代码。
微控制器使用了68引脚的四侧引脚扁平封装(QFP)方式。大部分的应用程序都运行在微控制器上,包括屏幕显示、按钮输入、NFC和EMV的功能代码。微控制器旁边的QFP可能是电纸显示器的驱动程序。
BrilliantTS计划推出支持EMV的新版本FUZE,并且他们的网站已经开始销售新版本的卡片。但有趣的是,这两种卡片所使用的主板却是相同的。在磁条版本的产品上,EMV智能卡的触点被塑料包装所覆盖。
通过Google搜索,我们发现了一些新闻稿和营销推广所使用的照片,展现了卡片的内部。Seoul Space中的一条评论( http://seoulspace.com/2016/01/04/korean-startup-company-launches-brilliant-card/ )告诉我们该卡片的原型版本是裸印制板。在FUZE官网( https://fuzecard.com/ ),我们看到了一些硬件堆叠的宣传照片。
五、蓝牙逆向工程
5.1 相关工具及介绍
考虑到FUZE这样的产品所使用的技术,我们认为蓝牙接口可能是最主要的逆向突破口。我在逆向蓝牙设备时所用到的工具如下:
Android手机;
Burp Suite(可选, https://portswigger.net/burp );
WireShark( https://www.wireshark.org/ ) + Perl脚本;
gatttool / BlueZ。
要进行蓝牙设备的黑箱分析,Android绝对是不可或缺的利器。我们可以将APP的所有蓝牙通信都记录到设备上。同样,也可以对Java字节码进行反编译和重编译,但在这里并不需要进行这样的“应用程序手术”。
Burp主要是用于HTTP代理,可以让我们看到Android应用程序向后端服务器发出的API请求。尽管该请求对于我们了解FUZE卡片的工作原理并不重要,但还是能提供一些线索。
Android在“开发人员选项(Developer Options)”设置菜单中提供了“HCI嗅探日志(HCI Snoop Log)”的功能。启用此功能后,可以将手机上的所有蓝牙活动保存到文件中,其中包括了应用程序和设备之间交换的每一条信息。
WireShark可以读取Android HCI嗅探日志产生的文件,这对于基本分析和筛选工作非常有帮助。批量操作和半自动分析可以提高我们的效率,因此我更倾向于将数据导出到文本文件,并使用Perl进行分析。
最后,可以使用gatttool(和其他BlueZ工具)直接分析设备。在启动应用程序之前,迅速看一下gatttool通常很有帮助。该工具有助于我们的分析过程,可以帮我们更好地理解发送和接收的协议消息。
5.2 逆向FUZE
首先,我尝试使用gatttool连接到FUZE,但并没有达到预期的效果。在连接到卡片之后,它会通过安全管理协议(Security Manager Protocol)发送一个“安全请求”。该卡片会要求我们配对,根据我的经验,这种情况在物联网设备中并不常见。我们已经知道,BLE的配对协议存在缺陷( https://blog.ice9.us/2014/01/ble-fun-with-ubertooth-sniffing.html ),因此大多数设备都会实施其自身的安全机制,而并不会依赖于BLE的配对协议。如果未与之配对,FUZE就拒绝向其发送任何数据,并且FUZE不使用BLE链路层加密。
由于gatttool没有解决我们的问题,因此我开始考虑基于Android的逆向工程方法,该方法简述如下:
1、在Android上启用蓝牙HCI嗅探;
2、在应用程序和卡片上进行一些操作;
3、使用adb,将HCI日志传输到PC;
4、在WireShark上进行分析;
5、过滤,并以文本格式导出;
6、使用Perl解析;
7、使用键盘反复砸自己的脸。
借助WireShark对数据进行过滤后,我发现了该产品的两个通信特性:应用程序会使用一个句柄上的写入请求对卡片进行写入操作,同时会使用另一个句柄上的通知来接收响应信息。这样的特性是非常常见的,可以允许开发人员将BLE通道作为TCP套接字或串行端口。
在使用WireShark对数据进行观察后,我的信心倍增。HCI嗅探日志中的数据,是在被手机上硬件蓝牙芯片加密之前所捕获的。在明文数据中包含了一些ASCII字符串,通过反复执行上述第7步,我逐渐弄懂了其中的一些协议格式。
WireShark并不适合于批量分析,但它提供了一套非常完善的导出实用程序,以允许进行后续处理。我们的分析过程其实是彻头彻尾的破解,但我进行了“导出数据包解析(Export Packet Dissections)”—>“以文本格式(As Plain Text)”操作之后,收获了一些好运气。在导出之前,我展开了“属性协议(Attribute Protocol)”解析,以显示通过无线传输的数据。在导出窗口中,需要保证“详细信息(Details)”中包括“显示(As displayed)”。最后,再通过Perl将其变为我可以使用的东西。
在这时,我重新考虑了gatttool。使用blueboothctl,我可以进行扫描,并与卡片进行配对。由于需要使用数字PIN配对模式,所以就必须在客户端(运行BlueZ的VM)上输入一个6位数的密码才能完成配对,该密码显示在FUZE的屏幕上。在完成配对并建立加密通信后,设备就会通过属性协议快速响应GATT消息。
首先,我们尝试重放通过WireShark转储的一些消息。我注意到,其中的一个消息在通信开始时就一直在传送:
tx 02f50101000000000000000000000000000000f5 ....................
rx ddf50f02019000000602000169ffffff31320003 ............i...12..
rx ddf50e0202425041592d434d472d3031410003 .....BPAY-CMG-01A..
当使用gatttool发送第一行内容时,第2、3行内容都会被可靠地发回。通过仔细分析数据,我们发现该数据包含的应该是硬件、微控制器固件和BLE固件的版本号。
这非常有意思,但它发送出去的第一条消息更加有趣:
tx 02c40101300000000000000000000000000000f4 ....0...............
rx ddc404010190000003
一旦发送此消息,FUZE将会自动解锁,并且显示主菜单。这一设定是为了方便用户的使用过程,当卡片靠近配对的智能手机时,该卡片就会自动解锁。
从这里开始,接下来的过程就都需要我们仔细分析、认真思考、反复试验。这个过程可能会非常艰难漫长,但对于任何有逆向分析经验的人来说,这一过程大概都习以为常了。
经过完整的分析之后,我成功对大部分协议消息进行了逆向工程,其中包括消息格式和支持的操作。
应用程序发送到设备的消息具有以下格式:
02 XX YY ZZ .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. WW
XX - 操作码
YY - 当前操作的GATT写入请求总数
ZZ - 当前写入请求current write request number
.. - 消息正文
WW - 校验和
我将所捕获到的消息进行了解释,此外还结合了一些Fuzzing的结果,最终确认了以下操作码:
b3 - 上传银行卡或会员卡
b4 - 删除已同步的卡片
b5 - 修改卡片信息(不确定,通过Fuzzing发现)
b6 - 重新排序卡片(不确定,通过Fuzzing发现)
b9 - 设置设备所有者名称,在关机屏幕上显示
ba - 未知功能(通过Fuzzing发现)
bb - 设置安全级别
bc - 获取卡片总数
bd - 未知功能,与卡片索引相关(通过Fuzzing发现)
be - 获取银行卡或会员卡
bf - 获取卡片所有人姓名
c4 - 解锁密码锁屏
c5 - 设置或禁用密码
c6 - 恢复出厂设置
c7 - 启用/禁用隐藏数据
d1 - 进入固件更新模式
d2 - 固件更新数据
d3 - 未知功能,与固件更新相关
d4 - 未知功能,与固件更新相关
ea - 获取电池电量
f5 - 获取硬件版本、蓝牙固件版本和MCU固件版本
其中的校验过程,是通过对所有消息字节(除初始的02之外)进行异或XOR运算来完成的。感谢Jason Benaim( https://github.com/jkbenaim )帮助我辨识出来了这种Game Boy风格的校验和。
关于固件更新过程,我简单地分析了一下,但没有深入探究。因为我只有一张卡,所以我并不会做固件刷新这些尝试。通过使用Burp监听HTTP请求,我捕获到了两个MCU固件样本。这两个样本都是大小相同,但内容相差较大。这就表明它们已经经过加密。在没有进行进一步分析的情况下,我们并不知道在固件更新过程中它们是否会进行签名或验证。
BLE固件更新是通过CSR内部的OTA更新协议进行的。我没有对这个协议进行过任何安全分析。但我认为,理解并研究该协议的过程会非常有趣,因为我确定其他设备也是用了相同或相似的CSR BLE SoC。
六、安全漏洞及PoC
在掌握了FUZE使用的蓝牙协议之后,我发现了CVE-2018-9119漏洞。借助该漏洞,一个能够物理访问(也就是能接触到)FUZE卡片的攻击者,可以进行以下操作:
1、绕过锁定屏幕;
2、读取信用卡号码、有效日期和CVV码;
3、篡改信用卡的相关数据。
截至撰写本文时,该漏洞仍未被修复,并且仍然可以用于任何FUZE卡片产品。
此漏洞影响MCU固件版本为0.1.73和BLE固件版本为0.7.4的产品,这是最新发布的两个版本。
(4月7日更新:BrilliantTS已经计划在4月19日发布固件更新,详情请参见本文的前言。)
由于卡片使用BLE链路层的安全机制,因此攻击者必须要物理访问卡片才可以进行漏洞利用。除了对数据进行加密之外,BLE链路层还具有认证机制。如果某个设备未与FUZE卡片进行配对,那么FUZE将拒绝接收来自该设备的所有消息。尽管BLE链路层的安全性存在着一些众所周知的缺陷(也是由ICE9团队发现的,详见 https://blog.ice9.us/2014/01/ble-fun-with-ubertooth-sniffing.html ),但针对FUZE来说,却很适合使用此种方式。
FUZE做得非常好的一点是它使用了数字PIN配对模式。当用户配对时,卡片会在电纸屏幕上显示一个6位数的随机数字。用户必须在手机上(或Linux攻击用虚拟机上)输入这6位数字才能成功配对。如果尝试与他人的卡片配对,非法用户只有百万分之一的机会猜对这个密码。
经过严格的测试,我们发现该配对要求无法被绕过,也无法降级到较弱加密级别的配对机制,该密码必须输入,同样无法绕过。
有一些人可能会说,“物理访问”的这个限定条件太过苛刻。我想强调两点:第一,在许多交易场景下,都需要将自己的信用卡交给陌生人,因此确保该卡片不会被人篡改非常重要。第二,因为有了锁屏机制,所以FUZE卡片看起来比普通的信用卡更安全,但该漏洞却证明其实不然。
6.1 PoC
ICE9团队进行了概念验证,该验证可以在Linux系统上或通过虚拟机运行。我们使用BLE dongle,通过USB直通的方式在VMware内部的Debian Stretch中进行了测试。在此次尝试过程中,需要安装BlueZ。
首先,使用bluetoothctl扫描,并与设备进行配对:
启动bluetoothctl: sudo bluetoothctl
启用代理(用于配对): agent on
扫描设备: scan on
找到FUZE卡片后禁用扫描: scan off
与FUZE卡片配对: pair <bdaddr>
输入设备上显示的数字PIN码
断开与FUZE卡片的连接: disconnect <bdaddr>
在这里,可以使用gatttool,将命令发送到卡片:
启动gatttool:sudo gatttool -I -b <bdaddr>
连接到设备:connect
接收后续通知:char-write-req 1b 0100
发送命令:char-write-req 18 <命令数据>
以下的命令非常有用:
02c40101300000000000000000000000000000f4
02be01013030310000000000000000000000008f
其中,第一个命令可以绕过锁定屏幕,第二个命令将读取首选信用卡号码、有效日期和CVV。
6.2 漏洞处置与披露情况
ICE9团队第一时间通过电子邮件联系了BrilliantTS,关于此漏洞的时间节点如下:
2018-01-30 – 第一次将漏洞情况发送至info@fuzecard.com和support@fuzecard.com;
2018-01-31 – 再次发送邮件询问;
2018-02-04 – 第三次发送邮件询问;
2018-02-05 – 收到来自BrilliantTS(FUZE技术支持专员)的回复;
2018-02-06 – 将漏洞详情发送给FUZE技术支持专员;
2018-02-09 – 将后续进展发送给FUZE技术支持专员;
2018-02-13 – 继续尝试联系FUZE技术支持专员;
2018-03-22 – 到达披露期限。
我们发送给BrilliantTS的报告中,包括对漏洞的完整描述、PoC及EXP。根据ICE9的标准,披露期限为45天。在该时间之内,BirlliantTS没有进行任何答复,发布此文章时已经经过45天的披露期。
在撰写本文时,BrilliantTS尚未发布FUZE卡的固件更新。
6.3 破解加密
为了本文的完整性,我们发现,如果攻击者能够嗅探到配对的会话,那么就可以对数字PIN的配对模式(以及其它LE Legacy配对模式)进行有效攻击。我认为,这种情况不太可能在FUZE的使用场景发生。用户很可能会在一个安全的位置(比如家里)进行配对,该场景可以远离攻击者。而当用户使用该卡片时,移动设备会与卡片使用此前建立的加密密钥。在这一加密阶段,未发现任何已知漏洞或缺陷。
尽管如此,作为一个概念验证,我还是可以嗅探到配对对话,并使用crackle进行破解。
七、关于Coin的同类产品
本文的一些读者可能会有印象,FUZE并不是第一款尝试使用蓝牙通信的信用卡。早在2013年,Coin就宣布过类似的产品,并于2015年正式推出给用户。Fitbit在2016年收购了Coin,并在2017年结束该产品的研发和运营。
Adam Munich( http://adammunich.com/ )对Coin产品进行了X光拍照:
从X光片中可以明显看出,Coin的设计要比FUZE简单得多。
如同FUZE一样,Coin的大小和厚度同常规信用卡一致,并且使用蓝牙进行通信。它具有更为简单的TN LCD分段式屏幕,并且只有一个按钮。即便如此,它还是具有类似于FUZE的密码功能。但与FUZE不同的是,它的电池不可充电,用户大概要每两年更换一次卡片。
FUZE与其他产品的一大不同之处在于,它支持NFC和EMV。但是目前这两个功能还都不可用,因此这是一个有争议的问题。
因为我没有Coin设备,所以就无法对其安全性加以定论。但据我所知,目前还没有人通过蓝牙方式从Coin设备窃取过信用卡号码。但是,该产品目前已经停止支持,因此也不建议继续使用和研究。
八、结论
一些IoT设备的创意非常滞后,无论创意有多么糟糕,似乎都会有人去制作。蓝牙信用卡就是这一观点的最好诠释。随着Apple Pay、Google Pay和其他非接触式支付业务在支付行业产生巨大影响,我并没有看到蓝牙信用卡具有足够的价值。即使有了这些选择,在可预见的将来,我应该还是会选择携带普通信用卡出门。直到有一天,蓝牙卡片的风险能够真正降低下来。
如果您想了解更多信息,我将在当地时间2018年4月11日(周三)晚上8点在Mountain View逆向工程会议(举办地点为圣克拉拉)上介绍我对FUZE卡片的研究。