攻击面梳理
市面上的主流硬件钱包形态各异,几乎都标榜自身具备严密的安全设计。然而,这些所谓的安全设计未必真的如宣传所言,甚至可能在某些情况下引入新的安全隐患。虽然硬件钱包通过离线签名、简化功能等方式收束了许多攻击面,但是这并不意味剩下的攻击面的安全性就会得到保障。
由于硬件钱包的离线特性,在实际交易过程中,需要外部(如浏览器、手机APP等)向钱包发送待签名的数据、并将签名结果广播至区块链或提交给其他应用使用。还有一些小屏(甚至没有屏幕的)钱包仅在APP侧提供设置页面,具体参数的配置也依赖APP传输给钱包。
基于对主流硬件钱包的分析,我们梳理了钱包与外部常见的连接方式及其暴露的安全风险。
首先是三类双工通信的方式——USB、NFC、蓝牙。
这三类方式在数据通信协议、数据处理中均可能存在漏洞风险,会导致内存破坏、敏感信息泄漏等问题。当攻击者具备物理接触设备的条件时,这类通信接口可能会引入安全风险:
USB :部分钱包可以将自己模拟为U盘,增大了攻击面;部分钱包能够进入bootloader模式,在此模式下可通过USB操作更多底层功能。 NFC:NFC通信容易受到中间人攻击,但对物理距离有限制。中间人嗅探数据后,可能解析出通信中的敏感信息。 蓝牙:蓝牙通信本身存在多种风险点,如配对劫持、中间人攻击、数据嗅探等,且其距离限制相比NFC宽松许多。
硬件钱包的SD卡模式
这几种通信方式将离线的钱包连接到联网的设备,因此也引起了一些用户的担忧:外部设备和钱包到底在传输什么数据?如果设备已沦陷,钱包是否还安全?又或者钱包与APP自带后门,建立连接后会悄悄上传钱包的数据?
为了打消这些顾虑,硬件钱包厂商提出了 "Air Gapped" 的概念,将联网设备与钱包物理隔离。主要有两种传输方式符合这个概念,它们都需要用户操作才能进行一次单向数据传输。具体操作流程和风险如下:
二维码:客户端首先将待签名的内容转换为静态或动态二维码,使用带摄像头的硬件钱包扫码获取数据并确认签名,最后再用客户端扫描硬件钱包上展示的二维码。在图片解析、二维码识别的过程中,可能会出现内存破坏问题。 SD卡:客户端和硬件钱包通过单张SD卡传输特定格式的签名请求和签名结果文件。在解析文件格式时,可能会出现内存破坏问题。
除了通信过程暴露的攻击面,部分硬件钱包还提供了固件升级接口(常见于USB、蓝牙、SD卡模式),升级过程中会计算hash和验证签名来确认固件的完整性和真实性,并判断版本防止回滚。如果升级流程实现不善,攻击者有可能能够向硬件钱包刷入恶意固件或包含漏洞的旧版固件。
固件升级过程
此外,虽然大多数硬件钱包使用了安全芯片来存储私钥,但其仍面临侧信道或硬件故障注入等物理攻击手段。
下文将从攻击者的视角梳理USB以及NFC两个攻击面。
许多硬件钱包可以通过USB接口与电脑或手机进行通信。基于底层USB HID协议,各硬件钱包又实现了专有的应用层协议,定义了各种指令、响应的格式。我们将以Cypherock X1钱包为例,梳理USB连接中的攻击面。
X1中运行的是实时嵌入式系统,系统会处理外界发起的USB请求。X1一次完整的USB命令调用由桌面端应用cySync发起,通过SDK提供的接口将请求序列化后通过USB发送给X1钱包,钱包侧响应请求返回数据包,重复这样的过程直到命令完成。
通过命令行与X1钱包进行USB通信
X1钱包内置多个applet。通过USB事件回调读取请求中的applet_id
后,X1调用对应的applet进一步处理请求。
从攻击者的视角来看,我们更关注在设备与外界通信的相关逻辑上:设备通过事件回调响应请求,将protobuf数据解析为结构化数据进行处理;请求数据处理完成后直接调用API向cySync返回响应。 在这个过程中,若X1钱包解析处理外界请求数据时缺少严谨的安全检查,就有可能被攻击者进行恶意利用。
NFC技术以其即触即用的特性便利了现代生活,部分硬件钱包同样支持NFC,相比于门禁普遍使用仅有存储功能的M1卡片,硬件钱包通常使用可以完成更复杂认证逻辑的CPU卡,下面介绍我们针对Tangem钱包中NFC模块的研究:
Tangem的NFC交互分为不加密、Fast加密、Strong加密三种模式,默认交互采用不加密模式,该模式下仅对数据进行序列化处理,只有在收到卡片的NeedEncryption响应后才切换到加密模式,这也给攻击者获取明文信息提供了便利。
在每次打开Tangem APP后,我们都需要进行两次刷卡操作。如上图所示,我们嗅探到第一次刷卡时NFC的交互数据。在流程化的SELECT_UID和SELECT_AID操作后,Reader侧发送了ReadCommand指令,卡片收到指令后返回card信息和walletData信息。
如上图所示,ReadCommand指令需要Pin、InteractionMode、TerminalPublicKey三个参数。但卡片对该指令的Pin参数并不进行校验,因此攻击者可以伪装成Reader,仅需轻“碰”一下卡片即可读取到card信息和walletData信息:
card=Card(cardId=AFXXXXXXX16XX383, batchId=AFXX, cardPublicKey=[2, 125, -88, -93, 112, -60, 90, 105, 85, -29, -21, -37, -100, -50, 83, 75, 106, 62, -84, 104, -35, 112, 104, 1, -109, -67, 55, 51, 100, -5, -59, -8, -25], firmwareVersion=, manufacturer=Manufacturer(name=TANGEM, manufactureDate=Fri Oct 18 00:00:00 GMT+08:00 2024, signature=[-17, -56, 106, 82, -107, 7, 25, 105, -126, -69, -110, -50, -105, -120, 123, -106, -18, -121, -37, -79, 2, -39, -18, -116, 105, 7, 102, 4, 113, 97, 93, 14, 30, 65, -69, -12, -67, -41, -60, -12, 68, -1, -6, 82, 121, 50, -61, 91, 93, -112, 75, -42, -66, -113, 118, -19, -102, -62, 75, 100, 101, -4, -62, -40]), issuer=Issuer(name=Tangem 2.0, publicKey=[2, -120, 89, -52, -60, 36, -73, -17, 103, 107, -110, -36, 3, 110, -122, 72, 43, -38, 8, 30, -50, 25, -23, -17, 38, 94, 5, -112, -20, 9, 54, -24, -32]), settings=Settings(securityDelay=15000, maxWalletsCount=20, isSettingAccessCodeAllowed=true, isSettingPasscodeAllowed=true, isRemovingUserCodesAllowed=false, isLinkedTerminalEnabled=true, isBackupAllowed=true, isKeysImportAllowed=true, supportedEncryptionModes=[Strong, Fast, None], isFilesAllowed=true, isHDWalletAllowed=true, isPermanentWallet=false, isOverwritingIssuerExtraDataRestricted=false, defaultSigningMethods=null, defaultCurve=null, isIssuerDataProtectedAgainstReplay=false, isSelectBlockchainAllowed=true), userSettings=UserSettings(isUserCodeRecoveryAllowed=true), linkedTerminalStatus=None, isAccessCodeSet=true, isPasscodeSet=false, supportedCurves=[Secp256k1, Secp256r1, Ed25519, Ed25519Slip0010, Bls12381G2, Bls12381G2Aug, Bls12381G2Pop, Bip0340], wallets=[], attestation=Attestation(cardKeyAttestation=Skipped, walletKeysAttestation=Skipped, firmwareAttestation=Skipped, cardUniquenessAttestation=Skipped), health=0, remainingSignatures=null, backupStatus=Active(cardsCount=1))
walletData=null
这两个信息本身并不包含过多敏感数据,于是我们又对第二次刷卡进行了嗅探。
在第二次刷卡时,Reader侧发送了ReadWalletsList指令。卡片在接收到该指令后会校验其中的Pin参数,成功后返回所有的CardWallet信息,失败则返回6A F1的错误码。
如此看来,通过返回数据爆破Pin是一个可能的攻击场景。幸运的是,厂商也同样识别到了这种风险,为了缓解该风险,厂商在卡片的固件中增加了security delay逻辑:在6次失败后,每多失败一次,都会导致卡片的响应时间增加1秒。不过据客户端源码中的注解所述,该逻辑是在1.21版本中才被引入。但由于Tangem没有为卡片实现固件升级功能,这也意味着该版本前购买的Tangem硬件钱包在卡片失窃的情况下更容易被爆破出关键的Pin信息。
Tangem共提供了33个自定义的NFC功能,除了功能逻辑上出现的问题外,卡片侧可能存在的内存问题同样是潜在的攻击面。
结语
区块链世界的资产迁徙永不停歇,而硬件钱包所承载的,早已超越物理芯片与加密算法的简单叠加,它是人类将‘信任’托付给代码的终极实验。
当攻击者开始以手术刀般的精度剥离硬件防护层时,这场实验的残酷性才真正显现:一处未被觉察的缓冲区溢出、一颗未彻底物理隔离的安全芯片、甚至一行注释失误的固件代码,都可能成为颠覆整个信任体系的致命支点。这场关乎万亿资产的攻防战里,DARKNAVY的研究不会止步。
参 考:
[1]https://www.certik.com/zh-CN/resources/blog/hack3d-the-web3-security-report-2024
[2]https://www.cypherock.com/
[3]https://tangem.com/
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...