本研究针对接收者的隐私提出了一般的计时侧信道攻击和流量分析攻击。这些攻击使活跃的远程攻击者能够识别Zcash或Monero中任何交易的(秘密)收款人。这些攻击通过利用因实施不同系统组件而泄露的侧信道信息,从而违反了这些加密货币的隐私目标。具体来说,证明了远程用户可以通过测量该用户的P2P节点对某些请求的响应时间,来链接向该用户发送资金的所有交易。时间差异足够大,可以通过WAN远程进行攻击。本研究以负责任的方式向受影响的项目披露了这些问题,并已修复了漏洞。
进一步研究了计时侧信道对这些加密货币中使用的零知识证明系统的影响。注意到在Zcash的实施中,生成零知识证明的时间取决于秘密交易数据,尤其取决于交易资金的数量。因此,尽管证明系统具有零知识特性,但能够测量证明生成时间的攻击者可能会破坏交易的机密性。
本研究的攻击凸显了匿名加密货币中侧信道泄露的危险,并且需要系统地保护它们免受此类攻击。
比特币是最大的加密货币,不是私有的:几项研究显示,人们可以有效地得到比特币交易的去匿名化图谱。许多其他加密货币也是如此。
对于那些希望在公共区块链上实现交易隐私的人来说,诸如Zcash,Monero和其他几个系统对记录网络中所有交易的一方提供不同程度的不可链接性(unlinkability)。将本文重点放在Zcash和Monero上,因为按市值计算它们是最大的两种匿名加密货币。但是,本研究的方法更通用,并且期望其他匿名加密货币也遭受类似的漏洞的困扰。
Zcash和Monero使用相当高级的加密原语,例如简洁的零知识参数(zk SNARK)和环签名。尽管有这些强大的密码学保护,但仍发现了一些针对交易隐私的协议级攻击并已纠正。
在本文中,采用不同的方法来分析匿名交易的隐私保证。与其攻击抽象协议,不如说是由系统中不同组件的实现所泄露的侧信道结构。具体来说,看一下计时网络通道和流量模式,这是由远程网络攻击者测得的。本研究证明,尽管在这些系统中使用的抽象零知识协议可以向观察者隐藏信息,但这些协议很容易遭受侧信道泄露。任何信息泄露都可能使零知识财产失效,并削弱或破坏匿名交易的隐私担保。
1)结果
本研究在Zcashand、 Monero中描述了多种针对交易隐私的攻击,这些攻击利用了通信模式或系统不同部分泄露的计时信息。本文采用系统的方法,研究匿名交易在整个系统中的生命周期。在每一步中,都会寻找侧信道,并评估它们对用户隐私的影响。
匿名交易的生命周期:首先,可以在付款人的钱包中创建交易,可能借助远程服务器来生成必要的零知识证明以证明交易的有效性。最终,收款人的钱包接收到交易,可能需要在记录P2P网络中所有交易的远程P2P节点的帮助下进行。收款人的钱包必须扫描网络中的所有匿名交易,以查找收款人的交易。
攻击者可以在上述每个步骤中观察侧信道的信息,并尝试学习有关交易的信息,例如:预期收款人的身份(例如,其公钥或其P2P节点的IP地址),金额交易中转移的资金或资金来源。接下来,总结一下结果。
Zcash:在Zcash中,用户的钱包和P2P节点在单个过程中运行。钱包通过尝试使用其秘密密钥对其进行解密,以检查它是否是即将进行的每笔交易的收款人。这导致了侧信道泄露的两个来源:(1)如果解密成功,并且解密的事务(称为Note明文)格式正确,则钱包将执行额外的Pedersen承诺检查;(2)如果解密成功,但是解密的交易格式不正确,则钱包会抛出一个异常,并传播到该节点的P2P层。
在第一种情况下,执行额外的Pedersen承诺检查所花费的时间会导致P2P节点对后续网络消息的响应出现延迟。因此,本文展示了一种称为PING的攻击,该攻击将一个事务发送到节点,然后立即发出“ping”消息(Zcash的P2P网络中的标准保持活动消息)。攻击者可以使用ping响应中的延迟来推断该节点是否是交易的收款人。这构成了交易不可链接性的中断。
在第二种情况下,提出了REJECT攻击,其中攻击者精心制作了格式错误的交易,使用已知(但匿名)的公共密钥对其进行加密,然后将其发送到目标P2P节点。如果解密成功,则会触发异常,并且目标节点将明确的“reject”消息发送回攻击者。然后,收到此消息后,告知攻击者所选的公钥属于目标P2P节点的所有者,这违反了匿名性。
Monero:对于Monero,其中的钱包和节点在单独的流程中运行,证明付款的接收会改变钱包及其节点之间的通信模式。如果钱包连接到远程节点(在移动钱包中很常见,或者在首次与网络同步时很常见),如果钱包是最近交易的收款人,则被动网络攻击者可以推断出该钱包。此外,即使用户的钱包和节点位于同一位置,研究也表明,远程攻击者可以通过引起并观察节点资源上的锁争用来推断钱包到节点的通信模式。在WAN中验证这种计时攻击,攻击者(位于伦敦)推断受害者(在苏黎世运行一个节点和钱包)是否收到了付款。
对于Zcash和Monero,本研究的攻击都使远程攻击者可以通过识别每个交易收款人的P2P节点来链接匿名交易,可以进一步利用这些攻击来:(1)在给定用户P2P节点公钥的情况下,确定其IP地址;(2)打破属于同一用户的多个地址的不可链接性。对于Zcash,攻击还可以使:(3)给定用户的公共密钥,远程使Zcash节点崩溃,以及(4)在涉及非永久时间的ECDH密钥交换上创建远程计时侧信道。用户的长期秘密查看密钥,有可能导致该密钥的泄露。
这些攻击可能会使注重隐私的加密货币用户(例如,举报者或激进主义者)面临风险。例如,将用户的匿名公钥链接到其P2P节点的对手可能会发现用户的物理身份或位置。破坏了不可链接性的攻击者(并在它们进入P2P网络时监视交易)可以推断出哪些P2P节点属于彼此进行交易的用户。
本文发现和利用的漏洞比以前的工作中使用的加密计时侧信道更为深入,即使Zcash或Monero中的所有密码本原都是固定时间的,上述攻击仍将适用(ECDH密钥交换的启动时间除外)。这是因为本文的主要攻击在协议级别上缺乏恒定时间,而现有文献主要在较低级别的算法级别上研究密码学恒定时间保证。
zkSNARK生成中的侧信道:本文研究了交易创建时的计时侧信道,付款人在其中生成zkSNARK来证明交易有效。观察到在Zcash中,生成zkSNARK的时间不是恒定的,而是取决于秘密信息,例如交易金额的汉明权重。实验表明,当前的实现方式实际上不是零知识:从时序泄露中收集的信息使零知识属性无效。如果攻击者可以测量zkSNARK生成过程的运行时间,则它可以提取此信息。
2)披露和补救措施
本文中讨论的所有漏洞均已向Zcash和Monero公开,随后已修复为两个项目的最新版本。希望这项工作将有助于告知其他面向隐私的区块链项目有关匿名支付系统中侧信道泄露的危险。它还应激励诸如zkSNARK证明者之类的密码原语的恒定时间实现的发展。
本节介绍了一些针对隐私的加密货币的核心设计概念,例如Zcash和Monero。这些加密货币建立在比特币所谓的UTXO模型之上。每笔交易都花费先前交易的输出并产生新的输出。一组“未用交易输出”(UTXO)记录在区块链中,代表流通的总货币。
每个使用该货币的用户都拥有一个或多个公共密钥(也称为地址),并连接到P2P网络以发送和接收交易。
隐私目标:在比特币中,UTXO是形式(amount,pk)的元组,其中pk是收件人的公钥。为了以后花费此UTXO,接收者在相应的秘密密钥下产生一个签名。交易因此揭示了用掉的货币量,资金的来源(即,使用了哪些UTXO)以及目的地(即,新的UTXO的所有者的公钥)。此外,在将交易发送到网络时,用户的公钥可以链接到她所连接的P2P节点。
Zcash和Monero之类的货币旨在提供以下更强大的隐私保证:
•保密性:交易未透露交易金额。
•不可追踪性:当交易花费了UTXO时,很难识别产生该UTXO的交易。
•不可链接性:给定两笔交易发送到网络中(最多一笔交易由攻击者发送),攻击者无法确定他们是否支付相同的地址。此外,给定两个地址,对手无法确定它们是否属于同一地址给同一个用户。
•用户匿名:给定用户的地址(即公共密钥),对手无法确定该地址的所有者如何连接到P2P网络。
隐私技术:这些隐私保证是通过加密技术的组合来实现的,下面将对此进行正式介绍。
保密交隐藏了交易资金的数量。机密交易的UTXO的格式为(Commit(amount),pk),即,它们仅显示对交易金额的加密图形承诺。该交易还包括其总余额为零的证明。UTXO匿名集通过隐藏交易输入的身份来提供不可追溯性。具体而言,匿名交易不会显示其花费的UTXO,而只会显示一组超级UTXO,以及该组中某些UTXO所有权的零知识证明。
混淆和分散的地址保证了不可链接性:为了防止发送到同一地址的交易的可链接性,匿名交易的UTXO包含“混淆的”公共密钥(例如,对zcash中的密钥的承诺)。多样化的地址(或Monero中的子地址)使用户能够与多个实体进行匿名交易,而无需管理多个秘密密钥。用户可以从单个秘密密钥sk创建多个公共密钥pk1,…,pkn。这些密钥是不可链接的:很难确定两个公共密钥pk,pk’是否从同一个秘密密钥派生。
区块链扫描是不可链接的技术结果:由于匿名交易的UTXO不会明文显示收件人的公钥,因此用户必须扫描每笔新交易并执行各种加密操作,以检查交易是否适合他们。
用户匿名性由不可追踪性和不可链接性来保证:由于交易不会透露发送者或接收者的公钥,因此用户的公钥无法链接到她用来发送或接收交易的P2P节点。
软件部署:跨项目(以及使用相同货币的用户)的加密货币软件的部署有所不同。多种部署选择会极大地影响用户对本文提出的侧信道攻击的脆弱性。区分三种类型的软件:(1)节点是通过交换和验证交易和区块来处理区块链共识层的P2P客户端;(2)钱包(可能由硬件模块支持)存储用户的密钥和UTXO,并连接到节点以发送或接收交易。(3)证明者产生私人使用用户的UTXO所需的零知识(ZK)证明。考虑以下常见的部署模式,这些模式是指用户的钱包与P2P节点或证明方之间的交互。
1.集成:钱包,节点和证明方功能都是同一过程的一部分。这是Zcash官方客户端的当前设计。
2.本地:不同的组件在局域网中的不同进程中运行(这是钱包和节点的Monero默认设置)。一些硬件钱包还将代币证明的产生委托给本地软件。
3.远程拥有:由于计算能力或内存的限制,钱包可能会连接到用户托管的远程P2P节点或证明者。远程P2P节点通常在Monero或Zcash的移动钱包中使用。外包密码证明并不常见,但在Zcash的设计中明确启用了加密,并在较早的协议版本中实现了。
4.远程第三方:由于运行P2P节点的成本很高,因此用户可以将其钱包连接到第三方托管的节点。这在Monero中很常见:新创建的钱包连接到第三方节点,而本地节点下载区块链。ZK证明者不太可能进行这种部署,因为必须保证第三方证明者的隐私性。
匿名交易生命周期:下图说明了如何通过P2P网络创建匿名交易并与节点和钱包共享:
1.要发送新交易,用户的钱包会选择一些UTXO,并为交易产生零知识的有效证明。
2.交易被发送到连接到钱包的P2P节点并与网络共享。P2P节点将这些事务存储在其“内存池”(Mempool)中。
3.P2P节点与连接的钱包共享这些交易。钱包会扫描每笔新交易,以检查是否为该交易的收款人。
一旦将事务包含在块中,也将执行步骤2和3。挖掘一个块时,该块及其包含的事务将传播到所有P2P节点。然后,该区块的交易将与用户钱包共享。
1)威胁模型
本文描述的攻击是远程侧信道攻击。因此,永远都不会假定受害人的软件是受托的。根据前文中描述的软件部署,考虑以下远程攻击者。
1.网络攻击者(上图中的Adverary 1a和1b)被动地监视受害者钱包和远程服务(例如节点或证明者)之间的加密流量。
2.P2P敌手(Adverary 2)参加P2P网络。攻击者可能会偏离P2P协议。
3.远程节点的敌手(Adverary 3)控制第三方P2P节点,并被动地监视受害者的钱包与该节点之间的(明文)通信。
2)攻击类型I:接收方的侧信道
本研究发现的最实用,最普遍的侧信道攻击会影响上图所示的匿名交易生命周期的最后阶段-当钱包处理新交易时。这些攻击使远程攻击者可以破坏系统的不可链接性和匿名性保证。攻击利用了流行的设计缺陷,即用户的钱包会定期检查它是否是任何新交易的收款人。
攻击目标:攻击针对交易不可链接性和用户匿名性。因此,攻击者的目标是:(1)确定两个交易是否支付相同的地址,以及(2)确定已知地址的用户如何连接到P2P网络。
攻击是针对钱包和P2P节点的常规部署量身定制的。所有攻击所达到的实际目标是识别交易的收款人正在使用的P2P节点。在多个用户将其本地钱包连接到共享的远程P2P节点的情况下,网络攻击者或远程节点攻击者发起的攻击会进一步恢复交易收款人使用的实际钱包。
考虑两种不同的攻击情形:
•攻击者知道一个匿名公共密钥,并向该密钥发送交易,以确定密钥所有者使用哪个P2P节点(或钱包)接收交易。
•诚实用户发送了攻击者不知道预期收款人或其公共密钥的交易。攻击者确定交易的收款人使用哪个P2P节点(或钱包)。
后一种攻击方案包含第一种,因为攻击者可以将诚实制作的交易发送到已知的公钥。后一种情况直接导致事务不可链接性的中断。给定两个发送到网络中的交易,攻击者仅确定两个交易的收款人是否使用相同的P2P节点或钱包。此外,这两种攻击方案都代表了用户匿名性的破坏,可以针对其他违反隐私的行为进行引导:
•IP地址恢复:除非所有者使用匿名工具(例如Tor.3),否则对手可以将公钥链接到所有者的P2P节点(或如果其钱包连接到远程节点,则为她的钱包)的IP地址。此信息可用于取消匿名或对受害者进行地理定位。
•多种地址可链接性:给定两个公钥,攻击者可以确定它们是否属于同一用户。攻击者将交易发送到每个公钥,并检查是否标识了相同的节点或钱包。这破坏了多样化地址的不可链接性。
•私钥恢复:某些攻击的潜在漏洞也为通过计时侧信道提取受害者的秘密“查看”密钥打开了渠道。窃取此密钥可使对手被动地链接发送给受害者的所有交易(但不能窃取受害者的资金)。
攻击策略:本研究的攻击利用了钱包处理交易的方式不同(当钱包是收款人时,而不是收款人)。这种差异是由于执行了额外的加密操作以取回收到的资金所致。
钱包行为的这种差异本身就不是问题,因为远程攻击者无法直接与用户的钱包进行交互。然而,本文发现由于各种设计缺陷,钱包行为的差异会影响钱包与其P2P节点之间的交互。反过来证明了远程攻击者可以通过各种侧信道推断钱包到节点的交互变化。制定两种通用的攻击策略:
•策略1:钱包到节点通信的流量分析。如果钱包连接到远程节点,则网络攻击者或远程节点对手可以被动地观察钱包到节点交互中的变化。
•策略2:从P2P层推断钱包行为。如果钱包和节点位于同一位置,则远程攻击者手将无法观察到它们的交互。但是,如果钱包行为的变化影响了用户的P2P节点与远程对等方之间的交互,则信息仍然会泄露给攻击者。
这两种策略不仅适用于创建交易并将其发送到P2P网络中,而且适用于包含在区块中的交易。那时,该区块及其所有交易都与每个对等方共享,钱包重新处理了交易以确保交易有效(例如,他们没有花双倍的钱)。
3)攻击类型II:发送方的侧信道
前节中描述的攻击(破坏了交易的不可链接性和用户匿名性)利用了P2P客户端和钱包的系统设计缺陷。因此,它们并没有直接针对协议的任何加密保护。为扩大在匿名交易中对侧信道漏洞的调查范围, 本研究启动了对加密工具的攻击的研究,这些工具保证了事务创建时的机密性和不可追踪性特别简洁的零知识参数(zk-SNARKs)。
本节中的攻击具有更多概念性,尽管它们不太可能影响当前用户,但这些攻击再次说明了使用无侧信道的加密实现对确保未来的匿名性和深度安全性的重要性。
攻击目标:交易发送方负责确保机密性和不可追溯性。如下所述,远程攻击最合理的目标是恢复交易金额,从而破坏机密性。对事务创建的远程侧信道攻击面临许多挑战:
1.非交互性:用户可以创建交易而无需与任何其他方进行交互。
2.临时机密:许多交易机密(例如,交易金额和与UTXO相关的机密)是一次性使用的。因此,即使存在侧信道,攻击者也只能尝试提取这些秘密。
3.高熵机密:用于创建交易的长期秘密(例如,用户的密钥)具有高熵,并且需要提取高精度的侧信道。
研究表明,可以通过针对交易创建过程的证明阶段并且旨在(部分)收回交易的机密金额的攻击者来克服这些挑战。
匿名交易中的SNAR:零知识证明是匿名交易的基本组成部分。在zk-SNARK协议中,证明者具有一些秘密输入(称为见证人),并且使验证者确信该见证人满足给定谓词,而没有透露有关见证人的任何其他信息。在Zcash和Monero中,这样的证明可以证明交易的有效性,同时又可以保护交易的私密性。例如,在Zcash中,证明见证人包含已用完的UTXO列表,接收方地址和交易金额,并且证明可以保证这些UTXO存在并属于支出方,并且所有资金都将转移到接收方。
zk-SNARK产品中的计时侧信道:本文的观点是,在当前的实现中,产生证明所花费的时间会泄露有关证明者的秘密证人的信息,尤其是有关所花费的货币数量的信息。
然而,如上所述,由于交易创建的非交互性质,远程攻击者可能难以在证明生成过程上获得计时侧信道。更糟糕的是,计时生成证明可能不足以提取短暂的或具有高熵的秘密。尽管存在这些挑战,但在下面指出某些部署方案中,可能会对匿名加密货币中的zk-SNARK证明者进行远程计时攻击,并且证明生成的时间可能会泄漏有关秘密交易金额的重要信息。
关于非交互性,有两个观察结果:
•如果弱客户端(例如,移动钱包)将证明外包给远程服务,则网络攻击者可以为证明者计时。虽然证据外包并不常见,但是Zcash协议启用了此功能,而远程证明服务是为早期协议版本设计的。还建议将证明委托用于硬件钱包。一些用户可能选择将证明委派给远程服务。
•更一般而言,攻击者可能会通过监视P2P网络获得有关交易创建过程何时开始的带外信息,并观察交易何时结束。例如,用户可以设置定期付款,在固定时间创建交易。攻击者也可能具有触发交易的能力,这是某些外部协议的一部分。本研究为数字签名绘制了与计时侧信道的连接。尽管签名是非交互式的,但使用签名的协议(例如TLS)可能会引入远程侧信道。
由于许多交易机密的高度熵,攻击的目标是交易量,这是一个非加密值,即使是粗略的近似值(一次计时测量所泄漏的值)也构成了违反隐私的行为。
攻击策略:考虑一种加密计时,该计时利用算术运算中取决于操作数值的时序变化。已经针对许多密码原语研究了这种攻击,但在进行此工作之前尚未考虑zk-SNARK。
利用这样一个事实,即出示证明的时间与证明者的证人的价值相关。由于见证人包含交易金额,希望该金额与证明时间相关。例如,Zcash的证明将交易金额分解为比特,并为每个非零比特计算椭圆曲线运算。因此,证明时间与交易金额的汉明权重密切相关,而交易额的汉明权重又与其价值相关。
现在,评估前文中描述的对事务处理的侧信道攻击。首先展示针对Zcash的攻击
对Zcash的攻击采用了第二种策略,该策略利用了用户钱包与P2P节点之间缺乏隔离的特性,将钱包行为泄露给了远程P2P攻击者。在Zcash客户端中,这两个组件是单个进程的一部分,该进程顺序处理收到的消息(包括新事务)。本研究描述了利用这种紧密耦合的两个侧信道攻击。在本节中,经常使用术语“节点”来指代同时实现P2P客户端和钱包的单个过程。
1) Zcash中的不可链接性
为了理解本研究的侧信道攻击,首先描述Zcash如何保证不可链接性。不可链接性依赖于两个概念:(1)交易仅包含对收件人公钥的承诺,(2)用户可以从一个秘密密钥中衍生出多个不可链接的公钥(多种地址)。
Zcash的多样化地址是静态Diffie-Hellman密钥,私钥是标量ivk(传入的查看密钥)。多种公钥的形式为(Gd,PKd),其中Gd是椭圆曲线组中的随机点,而PKd = ivk·Gd。
付款到地址(Gd,PKd)包含以下格式的UTXO(票据承诺):
其中v是发送量,rcm是承诺随机性。为了以后使用此UTXO,接收者必须证明她知道cm的公开。
带内秘密分发:发件人使用El-Gamalencryption与收件人共享cm的开口。发送者对临时密钥esk进行采样,计算公钥EPK = esk·Gd,并得出共享密钥:
承诺cm的开头包含在Noteplaintext(np)中。发送者使用密钥k在经过身份验证的加密方案下对Note纯文本np进行加密,并将密文C和临时公共密钥EPK附加到事务中。
区块链扫描为了收回她的资金,用户使用她的私钥ivk扫描每笔交易。对于使用公钥EPK,Note密文C和Note承诺cm的交易,她计算:
也就是说,如果解密C成功(这意味着用户是交易的收款人),则用户将检查Note明文np是否包含Note承诺cm的有效开头。
2)本研究的攻击
本研究的攻击(PING和REJECT)使攻击者能够判断远程Zcash节点是否成功解密了交易的Note密文。由此,攻击者得知该远程节点属于交易的收款人。
两种攻击的设置有所不同(REJECT仅适用于攻击者制作的事务,而PING适用于任何事务),它们利用的是侧信道(REJECT的错误消息和PING的计时侧信道) 。
如前所述,识别交易收款人的P2P节点还可以使攻击者进行链接交易,恢复用户的IP地址,链接多样化的付款地址,甚至打开计时侧信道(原则上),从而可以远程提取交易对象。受害者的私人查看密钥ivk。
PING和REJECT攻击都利用(弱)形式的“解密预言机” ,这使攻击者可以了解节点是否正确解密了给定的密文。但是,本研究的设置与标准选择的密文攻击完全不同。确实,此类攻击通常依赖于向(单个)受害者发送任意密文,以及了解解密后的明文的某些谓词的能力(例如,明文的格式是否正确)。正如将看到的,在案例中,攻击者要么已经知道Note的纯文本(用于REJECT攻击),要么没有创建新的有效的经过身份验证的Note密文的能力(用于PING攻击)。本文的攻击并没有像传统的CCA攻击那样试图破坏语义安全,而是使用解密预言机来识别网络中哪个用户拥有解密交易的Note密文的密钥。
实验设置:在修复漏洞以响应本文的披露之前,评估了对Zcash版本2.0.7的所有攻击。对于在WAN环境中进行的实验,受害者在苏黎世的计算机上运行(四核Intel i7700 CPU @3.60GHz,带有8GB的RAM,运行Ubuntu 18.04.2),远程攻击者则在Google云上运行伦敦(N1标准实例)。测量的平均往返延迟为21毫秒,标准差为亚毫秒。
(a)PING攻击
本文的第一个攻击PING利用Zcash客户端中的钱包和P2P组件之间的紧密结合。更确切地说,利用Zcash客户端串行处理所有传入的P2P消息(包括包含新交易的消息)的事实。结果,处理事务所花费的时间会影响节点对其他消息的处理。因此,远程P2P攻击者可以建立一个计时侧信道,以防止节点成为交易的收款人。PING攻击适用于任何交易,即使是诚实用户发送的交易,而攻击者也不知道收款人的公钥。
事务处理中的计时侧信道:如果Zcash钱包成功解密了Note密文,它将检查Note承诺的打开是否有效(TrialDecrypt中的第6行)。这涉及到计算具有两个椭圆曲线标量乘法的Pedersen哈希。因此,解密成功时,TrialDecrypt调用会花费更长的时间(在台式机上大约需要一毫秒)。
P2P攻击者可以通过在收到新交易后立即向Zcash节点发送“ ping”消息来测量TrialDecrypt呼叫的持续时间。该节点的钱包首先处理该交易,并在该节点响应ping之前调用TrialDecrypt。直到收到ping响应为止的时间,泄漏有关Note解密成功的信息,并因此通知该节点是否是中继交易的收款人。
块处理中的计时侧信道:以上攻击适用于进入受害者节点内存池的未确认交易。同样的漏洞也适用于开采区块中包含的交易。
收到新块后,Zcash节点将顺序处理并尝试解密其中的每个事务。因此,验证区块的总时间取决于支付用户的交易数量。如上所述,远程攻击者可以在收到新的阻止后立即对受害节点执行ping操作,从而泄露此验证时间。
应用攻击:攻击者首先使用不支付目标费用的交易对目标节点运行PING攻击,从而建立基线(攻击者可以向自己发送资金)。对于解密失败的TrialDecrypt呼叫,执行基准ping响应的时间。然后,攻击者将此基准与从新交易攻击中获得的时间进行比较。
攻击需要可靠地测量节点的事务处理时间。请注意,对于诚实用户发送的事务,无法重复进行攻击以平均消除网络波动,因为一旦节点验证了事务,它将忽略包含该事务的其他消息。一种优化包括运行上述两种PING攻击变体,一次是在事务进入节点的内存池时发生,一次是在将其包含在块中时进行(钱包在开采时对事务进行重新处理)。攻击者因此获得了两个计时测量值,从而将网络引起的方差减半。
评估:在WAN中进行攻击,在苏黎世有一个受害节点,在伦敦有一个攻击者(三倍等待时间为21毫秒)。攻击者发送200笔交易,其中一半支付给受害者。上图绘制了受害者对攻击者随后的ping消息的响应时间,攻击者可以100%的精度区分这两种情况。
进一步验证了对块处理的攻击,攻击者将20个区块转发给受害者,每个区块都包含一个向受害者或另一个用户付款的交易。上图描绘了受害者ping反应的延迟。攻击达到100%的精度。通过将验证N个非付款交易的时间作为基准时间,攻击扩展到N> 1个交易的数据块。
(b)REJECT攻击
第二项攻击REJECT利用了处理某些格式错误的交易中的缺陷。它允许攻击者利用用户的公共密钥来发送交易,该交易导致用户的P2P节点以“拒绝”消息进行响应。REJECT攻击比PING弱,因为它仅适用于攻击者发送到已知地址的交易,同时REJECT攻击不依赖任何时序信号,因此更容易安装和更可靠。
攻击所利用的缺陷在于TrialDecrypt(第4行)中对Note纯文本的解析。明文的第一个字节编码协议版本(当前Sapling版本中为0x01)。如果版本字节不正确(即,对于Sapling事务而言不是0x01),则解析器将引发一个异常,该异常被客户端的主消息处理线程捕获,从而导致“拒绝”消息发送到共享该对象的对等方交易(请参见下图)。
这为P2P攻击者提供了一个oracle,指示成功解密了具有特殊格式的纯文本(例如,版本字节为0x02)的Note密文。
将公钥链接到节点:给定一个公共密钥(Gd,PKd),攻击者可以识别持有此密钥的Zcash节点。攻击者使用不正确的前导字节构建Note纯文本,并使用从(Gd,PKd)派生的密钥对其进行加密,然后将其添加到事务中。攻击者将交易发送到所有P2P节点,并检查哪个节点以“拒绝”消息进行答复。在本地测试网络中验证了此攻击。
潜在的问题是,接收到格式不正确的交易的对等方可以在攻击者自己的消息到达收款人之前将其转发给收款人。在这种情况下,收款人将向中继点发送“拒绝”消息,而忽略攻击者的后续消息。但是,当节点在中继交易之前验证交易时,攻击者的信息很可能会先到达收款人。如果攻击者确实没有收到“拒绝”消息,则可以简单地重复攻击。
(c)收件人发现之外的攻击
除了链接交易和取消匿名化公钥之外,还可以进一步利用上述攻击的潜在漏洞来实现对抗目标。
拒绝服务:REJECT攻击的一个奇怪结果是,一旦包含格式错误的Note明文的交易包含在已开采的区块中,则当试图验证区块时,交易收款人的客户就会崩溃。此缺陷是有害的。即使手动重新启动了Zcash客户端,它在验证块时也会立即重新崩溃。
如果攻击者获得大量Zcash用户的付款地址,则此缺陷可能导致强大的DoS攻击媒介。更糟糕的是,如果攻击者知道许多Zcash矿工的付款地址,则可能会利用这种DoS攻击来限制网络的采矿能力(例如,准备进行51%的攻击或消除采矿竞争)。
通过ECDH定时恢复密钥。在Zcash实施ECDH密钥交换时,PING和REJECT攻击还产生了一个远程计时侧信道,特别是TrialDecrypt(第1行)中的椭圆曲线乘法ivk·EPK。
Zcash团队意识到ECDH密钥交换不是固定的时间,并且这可能被同地攻击者利用。REJECT和PING攻击进一步打开了该侧信道被远程利用的可能性。
Zcash的“椭圆曲线”乘法例程确实不是固定时间的:它使用标准的两次加法过程,并且基础场运算也不是固定时间的。将计时攻击调整为Zcash的椭圆曲线乘法程序。对于固定的秘密ivk,在本地为100万随机点计时乘法。时序分布如上图所示,显然不是恒定的。
假设已经恢复了ivk的j个最高有效位,则通过将点倍增或点乘法的时间与总乘法时间相关联来恢复第(j +1)位。以恢复的所有先前位为条件,以98.4%的概率恢复后续位。使用适当的回溯机制来解决一些错误的猜测,因此可以用大约一百万个样本来恢复完整密钥。
这种攻击的查询复杂度很高。在“理想化”的设置中执行攻击,忽略了网络和事务验证所花费的时间,这会增加很大的噪音并进一步增加完全远程攻击的样本复杂度。当然,本研究的概念证明也证实了Zcash团队的怀疑,即位于同一地点的攻击者可能会利用计时侧信道来掩盖用户的秘密密钥。
3)补救
解决REJECT攻击很简单:将纯文本parsingfailure视为解密失败,并忽略有问题的密文。此修复程序已添加到Zcash的2.0.7-3版本中。
PING攻击利用了Zcash节点的P2P和钱包组件之间缺乏隔离的特点。2.0.7-3发行版通过将钱包重构为一个单独的线程来解决此问题,该线程会定期提取最近交易的列表并调用TrialDecrypt。TrialDecrypt调用的时间不再影响其他P2P功能的时间。但是,版本2.0.7-3仅将PING攻击修正为未确认的交易。重构节点对新块的处理更为复杂,最终在版本2.1.1中得到修复。
一个针对本文攻击类型的简单防御方法是运行两个Zcash节点,一个连接到P2P网络的“防火墙”节点,以及一个仅持有连接到防火墙的用户密钥的本地节点。此设置需要两次存储和验证整个区块链,但要阻止本文所有攻击-除了前文中的DoS攻击。
注意到,在Tor 上运行Zcash节点并不能阻止本文的攻击。与受害人的P2P节点具有有效Tor连接的P2P攻击者仍可以链接支付受害人的交易,或链接受害人的多种地址。
最后,认为Zcash应该为其核心密码原语提供抗侧信道的实现。考虑到Zcash协议主要是非交互性的,抗侧信道似乎似乎是次要问题。如本文的攻击所示,带内秘密分发例程中的单个错误无意中允许攻击者和受害者之间进行双向交互,从而在Zcash非交互式密钥交换机制上打开了潜在的远程计时侧信道。
虽然这种设计原则上更安全,但发现钱包操作仍然会通过网络流量和计时侧信道泄露给远程攻击者。首先,通过被动分析钱包和远程节点之间的流量来描述推断交易接收的攻击(策略1)。其次证明,即使用户的钱包和节点位于同一位置,本地钱包到节点的交互也会影响该节点的P2P行为,该行为会通过计时侧信道给远程攻击者。后一种攻击结合了前文中描述的两种攻击策略的各个方面。
1)门罗币中的不可链接性
首先提供有关Monero使用隐身地址的高级概述,隐身地址是一种用于为发送给同一收件人的每笔交易得出重新随机化的公钥的技术,以确保不可链接性。
Monero用户Alice具有以下形式的公共密钥:
其中G是椭圆曲线组的基点。标量对(a,b)∈
是爱丽丝的秘密密钥。为了从另一个用户Bob获得资金,Alice与Bob共享了她的公共密钥(A,B)。
当Bob将交易发送给Alice时,他通过Diffie-Hellman密钥交换与Alice的密钥的前半部分(A)产生了一个随机化的公共密钥,该密钥的后半部分又与密钥的第二半部分(B)混合在一起。目的是产生一个点P,使得只有Alice可以计算P相对于G的离散对数。
具体来说,鲍勃选择一个临时密钥r
并计算:
其中H:{0,1} *→Zq是一个哈希函数。公用密钥P和R = rG包含在事务中。请注意,P隐藏了爱丽丝的公钥(A,B)。
为了以后花费接收到的UTXO,Alice需要证明关于标量x的知识,使得P = xG。给定(P,R),她可以将该秘密计算为
带内秘密分发:与前文中所述的Zcash的带内保密分发一样,发送者将一些秘密信息作为事务的一部分发送给接收者。在门罗币中,接收方唯一需要的信息是交易资金的数量(隐藏在承诺中)。为此,发送方从共享机密P导出对称密钥k并加密k下的交易量。密文C附加到事务。
区块链扫描看到具有密钥(P,R)和密文C的交易后,具有私钥(a,b)和公钥(A,B)的用户首先进行计算:
并检查P‘ =P。如果积分匹配,则用户为交易的收款人。用户使用从P派生的对称密钥k进一步解密C。
2)Monero部署
在介绍攻击之前,将讨论正式的Monero客户的典型部署。尽管所有常见的设置都受到本文某种形式的攻击,但某些设置比其他设置更容易受到攻击。
远程节点:由于P2P节点的内存和计算要求,许多用户将他们的wallet连接到可能由第三方(例如,moneroworld.com)托管的远程节点。默认情况下,Monero钱包在创建时会连接到第三方节点,直到本地节点下载区块链(此过程可能需要几天时间)。
由于P2P节点无法访问钱包的密钥,因此原则上使用第三方节点是安全的。但是,某些隐私风险是已知的(例如,节点的主机了解钱包的IP地址,并且可以发起易于检测的攻击来跟踪钱包的交易)。但是,没有已知的攻击允许第三方节点链接交易,也没有对连接到远程拥有的节点或本地节点的钱包的任何已知攻击,本文展示了此类攻击的示例。
钱包类型:Monero客户端具有三个钱包实现,它们的独特刷新策略会影响本文的攻击。主RPC接口以及在其之上构建的GUI钱包以固定的间隔(每20或10秒)刷新,以从P2P节点获取新块和未确认的交易。命令行界面(CLI)钱包每秒刷新一次,但仅获取已确认交易的新块。尽管所有钱包类型都容易受到攻击,但是CLI钱包容易受到不同的攻击,本研究将重点放在RPC和GUI钱包上。
3)本研究的攻击
当钱包是新的未确认或开采交易的收款人时,攻击会利用钱包和节点之间的交互差异。如果钱包连接到远程节点,则网络攻击者(或恶意远程节点)可以通过被动监视钱包和远程节点之间的加密流量来推断已收到付款。
此外,即使用户的P2P节点和钱包位于同一位置,本研究也证明P2P攻击者仍然可以利用侧信道来推断钱包何时收到付款。展示了一种主动攻击,该攻击会将请求发送到受害者的P2P节点并计时响应,以揭示锁定受害者的P2P节点的资源,以指示已收到付款。
如在Zcash中一样,这些攻击还可以将已知的公钥链接到所有者的P2P节点或钱包的IP地址,以及链接用户的多种地址。
实验设置:实验设置类似于用于Zcash的设置。在修复漏洞以响应披露之前,评估了对Monero版本v0.14.1.0的所有攻击。在WAN环境中进行实验时,受害者在苏黎世的计算机上运行(四核Intel i7-7700 CPU@ 3.60GHz,运行8GB RAM,Ubuntu 18.04.2),远程攻击者在伦敦的Googlecloud实例(N1标准实例)上运行。测量的平均往返延迟为21毫秒,偏差标准为毫秒级。
(a)远程节点的流量分析攻击
首先描述利用钱包和远程节点之间的通信模式的攻击。自动刷新后,钱包首先从节点请求未确认交易的列表,然后接收哈希列表。然后,它请求主体进行两种类型的交易:(1)钱包之前未处理过的交易;(2)先前进行的以钱包为收款人的交易。
因此,恶意远程节点通过读取钱包的请求,可以轻松地了解哪些交易向钱包支付了费用。即使远程节点是受信任的,被动的网络攻击者也可以检测到钱包的交易请求(钱包和节点之间的通信很容易被指纹识别,因为钱包以固定的间隔刷新)。仅此请求的存在就可能泄露钱包是交易的收款人。由于2020年5月门罗币的流量(每天10,000次交易,或平均每9秒进行一次交易),在两次钱包刷新之间没有新交易进入内存池是很常见的。如果即使内存池没有更改,钱包也发出了交易请求,则该请求必须针对之前看到的尚未确认的支付钱包的交易。
在本地Monero网络中验证了攻击,但请注意,无论网络类型如何,攻击都能100%准确地成功,因为攻击仅取决于是否存在事务消息,而不依赖计时信号。
(b)远程节点的计时攻击
现在,除了钱包和节点之间交换的网络请求数量外,还显示请求之间经过的时间也泄露了是否支付了钱包。
对于每笔新交易,钱包都会检查其是否为交易的收款人。如果是这样,它将进一步解密所获得的值。结果,如果钱包是该交易的收款人,则处理交易将花费更多时间(台式机上的延迟约为2-3 ms)。
处理时间上的这种差异导致两个计时攻击。第一个目标是处理新块。刷新后,钱包会从节点上依次下载一个新块并处理其交易。因此,两个区块请求之间的时间会浪费第一区块交易的处理时间。第二次攻击针对未确认的交易。回想一下,钱包以固定间隔刷新(例如,RPC钱包每20秒刷新一次)。更确切地说,在刷新结束后,钱包会休眠一段固定的时间。因此,钱包唤醒并发送新请求的时间取决于处理在先前刷新中接收到的交易所花费的时间。
评估:上图绘制了当第一个收到的区块包含单个交易时,用户钱包进行区块请求之间的延迟。如果钱包是交易的收款人,则下一个阻止请求平均延迟3.4毫秒。当钱包处理其为收款人的交易时,在两个钱包刷新期间之间观察到类似的延迟。这些时序差异足够大,可以在WAN设置中可靠地观察到。
攻击扩展到N> 1个事务的块。,攻击者首先估算处理不支付钱夹的N次交易所需的时间,然后将此估算值与观察到的延迟进行比较。即使处理一次非支付交易的时间从一次交易到另一次交易略有不同,但与处理付款时所花费的毫秒级延迟相比,这种变化可以忽略不计。
(c)本地节点的计时攻击
前文攻击要求受害者的钱包连接到远程节点。现在描述一种更复杂的攻击,该攻击甚至适用于位于同一位置的钱包和节点。
在这种情况下,远程攻击者无法观察到受害者节点与钱包之间的通信模式。但是,本研究开发了一种攻击,让P2P攻击者推断这些通信模式。具体来说,表明攻击者可以检测到远程钱包何时向其节点发出交易请求。正如前文所述,此请求的存在(或两个请求之间的时间)泄露说,钱包是未确认交易的收款人。
攻击利用了Monero的P2P节点中的粗调锁定(overly-coarse locking),当处理交易请求时(由钱包或对等方通过get_objects消息发送),P2P节点在其内存池上获取全局锁定。因此,如果P2P攻击者在受害者钱包发出请求后立即发送get_objects消息,则P2P节点中的锁争用将延迟对攻击者的响应。当P2P节点在释放锁之前验证请求的事务时,锁争用的机会很高,这将导致在钱包请求时锁被保留数十毫秒。为了减少攻击者请求锁定钱包请求的风险,攻击者仅发送不存在交易的请求,因此锁定时间较短。观察响应延迟的大小会向攻击者指示钱包是否已向其节点发出了交易请求。这又告诉攻击者特定交易是否是向目标钱包的付款。
评估:锁定内容引起的时序差异取决于节点内存池的当前大小。在内存池中进行20个事务时,应钱包请求大约15-20毫秒即可获得锁定。
在WAN中进行了攻击,受害者的钱包和节点位于苏黎世,而攻击者位于伦敦。池包含20笔交易,其中一笔通过钱包支付。每隔10秒,钱包就会刷新并发送一个交易请求(因为内存池中有针对钱包的付款)。攻击者不断向受害者的节点发送
get_objectsmessages并计时响应。实验结果如下图所示。计时延迟和钱包请求之间的相关性非常清楚。
如所描述的,攻击假设在向钱包的支付进入池中之后至少两次刷新钱包(即,至少20-40秒)未更改内存池。由于Monero每17秒执行一次交易,每2分钟进行一次新交易,因此这种不活动状态很常见。
4)补救
本文攻击已在Monero v.0.15.0版本中修复。现在钱包只从其P2P节点请求看不见的交易,从而防止了前文中的攻击。钱包还分批请求和处理1,000个新块。因此,对块处理的计时攻击最多只能推断出某个钱包是由一批交易中的某笔交易支付的。如下所述,一种更有力的防御措施是按固定的时间表发出阻止请求。
将刷新时间与处理时间无关化:前文中对未确认交易进行处理的计时攻击是由于设计缺陷,在刷新后钱包在固定时间内睡眠。因此,Arefresh的开始时间会泄露前一个刷新周期的持续时间,后者本身会显示是否已处理付款。
这个问题是有害的,Zcash最近发布的mobileSDK也有相同的缺陷:移动钱包反复出现:(1)从远程节点请求新交易;(2)处理这些交易;(3)休眠一段固定的时间。
最初由Monero和Zcash提出的不完整修复程序将刷新后的睡眠时间随机化。此修复程序可能足以针对以诚实用户发送的交易为目标的攻击者手,因此仅限于单个计时度量。但是,针对已知公钥的攻击者,随机延迟是不够的。在这种情况下,攻击者可以为此公钥创建多次付款,并为每次交易刷新目标钱包之间的持续时间。如果钱包持有公钥,则平均刷新时间会更长。
更好的解决方法是将钱包刷新的开始时间和处理时间完全无关化。一种简单的方法是让钱包以固定的时间间隔(例如,每分钟开始)唤醒。由于攻击者可以知道刷新时间何时开始,而不能知道刷新时间何时结束,因此可以防止本文的攻击。Zcash和Monero均实施了该解决方案。
由于当前修补程序使用了上述不完全随机防御的一种变体,因此仅部分解决了本文对Monero CLI钱包的攻击。
前文描述的侧信道攻击通过利用P2P客户端和钱包的系统设计缺陷来避免不可链接性和匿名性保证。在本节中,将进一步研究这些系统中使用的一种基本密码原语中潜在的侧信道漏洞的可能性:简洁的零知识论点(zkSNARKs)。
遵循前文中概述的策略,旨在从单次生成证据的时间测量中恢复有关机密交易金额的信息。下一节证明了这种计时攻击会揭示有关Zcash中交易金额的信息,相反,在后文中表明,类似的攻击对于门罗币实施的特殊用途证明无效。
1)在Zcash Prover中计时侧信道
本文证明,对于Zcash的zkSNARK系统,证明时间在很大程度上取决于证明者证人的价值。特别是,对于匿名交易,证明证明时间与交易的机密价值密切相关。
为了发送交易,发件人创建两个证明,一个证明已用完的UTXO的所有权,另一个证明新的UTXO格式正确。在这两种证明中,见证人都是一个向量,其中除其他条款外,还包含交易价值的二进制分解。
Zcash使用Groth证明系统。对于本文的目的,足以知道证明者将证人编码为字段元素的向量(a1,…,am),并且证明者的主要计算是以下形式的“多幂”:
Gi是固定的椭圆曲线点。重要的是,Zcash的实现优化了aiGi whereai = 0的条件。因此,证明时间与证明人见证人中非零字段元素的数量相关。
由于交易量在证人中以二进制编码,因此其汉明权重会影响证明时间。而且,由于数字的二进制表示的权重与数字的绝对值相关,因此证明期限会泄露有关机密交易金额的信息。
评估:为了评估计时攻击,针对[t,64]中的t均匀随机选取了2个形式的200个事务量。请注意,证明见证人除数量外(例如承诺空缺)还包含其他短暂词,这也导致证明时间的可变性。因此,对于200个随机金额中的每一个,通过对所有其他临时见证人组件进行随机化来创建20个交易,然后为这4,000个交易中的每一个对证明者进行计时。
下图显示了每个量的证明时间的平均值和标准偏差。证明时间和交易金额密切相关(R = 0.57)。虽然时间泄露仅是金额的粗略估算,但足以自信地确定大笔稀有交易。
上图中最左边的证明时间对应于零的交易量。由于Zcash的“dummy Notes”,对这样的证据进行指纹识别特别有趣:要混淆交易中的UTXO数量,用户可以使用以下命令创建虚拟UTXO:零值。能够安排证明者时机的攻击者因此可以以较高的准确性重新识别虚拟UTXO。
讨论:上述计时攻击并不容易应用。它要求对手可以对举证的时间,取决于用户的常用用法(例如,定期付款)或部署的假设进行计时。策略(例如,将证明外包给远程服务)。如果存在时机,证明所产生的泄露允许对私人交易金额进行粗略的估算。
当然,本地侧信道攻击会更加有效。然而,Zcash明确打消了这种威胁,并没有对同位攻击者提出安全保证。
最终,此攻击可作为有关非恒定时间加密实现产生的潜在潜在危险的警告。Zcash的椭圆曲线算法的更成熟的实现正在开发中,将来可能会集成到主要客户中。注意到,使用恒定时间加密不需要引入大量的计算开销。例如,在上图中观察到最佳情况和最坏情况的证明者时间相差不到20毫秒,这不到总证明者时间的1%。因此,即使所有证明都花了恒定的最坏情况时间,开销也将保持很小。
2) Monero Prover中没有计时侧信道
与Zcash相比,Monero不使用通用的zk-SNARK系统。取而代之的是,Monero交易的花费者仅证明机密交易包含对[0,2 64]范围内的值的承诺。此“范围证明”基于Bulletproofs。
乍一看,可以期待Monero的证明能够展现出与Zcash类似的计时侧信道。确实,Mon ero的范围证明还对交易值的二进制分解执行了多次幂运算,类似于等式1。但是,一个关键的区别是Bullet证明不仅对值的二进制分解起作用,而且对值的二进制分解起作用。更具体地,给定交易量v∈[0,2^n),证明者计算向量aL∈{0,1}^ n作为v的二元分解,并设置aR = aL-1^n∈{−1,0} ^n 。证明者然后计算该形式的Pedersen承诺:
其中Gi和Hi是椭圆曲线组中的固定基点。所有进一步的证明者操作都依赖于v的随机值。因此,计算的椭圆曲线操作的数量是与交易量v无关的常数。注意到,此属性是Bünz等人描述的证明协议所固有的。
与前文中的Zcash实验类似,对于一系列随机交易值,对20个证明以及其他随机选择的见证人元素进行了计时(在门罗币的情况下,见证人由交易金额和随机盲向量组成)。上图显示,证明时间本质上与交易量无关(轻微的相关性可归因于测量噪声)。但是,确实观察到证明时间不是恒定的,证明时间之间的差异最大为0.5毫秒。这可以归因于以下事实:门罗币对椭圆曲线多幂运算的实现不是固定时间的,而是依赖于某些数据相关的操作和内存访问模式。但是,所产生的较小时序差异似乎不足以可靠地从单个远程时序测量中提取秘密信息。当然,进行本地攻击会简单得多。
进一步研究了在这些货币中使用零知识证明系统计时侧信道的影响。本文已经证明Zcash的实现通过证明生成的时间泄露了秘密交易数据。原则上,可以对证明进行计时的攻击者生成可以利用此泄露来提取有关交易额的信息,从而破坏交易的机密性。
- 结尾 - 精彩推荐 【技术分享】基于浏览器的密码管理器安全性评估 【技术分享】CVAnalyzer:自动发现互联车辆协议中的拒绝服务漏洞 【技术分享】针对以太坊Dapp攻击事件的全面评估 戳“阅读原文”查看更多内容 原文始发于微信公众号(安全客):【技术分享】远程侧信道攻击区块链匿名交易