在游戏《最终幻想》中,来自兰迪斯共和国的全能战士巴修被称为最强之盾,他身经百战、勇猛果断,被子民视为英雄。而在区块链世界,Zcash、门罗币、零知识证明等存在,也被称为隐私的最强之盾,它们可以有效确保交易信息不被泄露,然而,这个世界真的存在密不透风的墙吗?
本期的学术分享,我们重点推荐斯坦福大学教授Dan Boneh等人最新的研究成果《针对匿名交易的远程侧信道攻击》。
而在硬核技术文章精选部分,我们还会看到zkSNARK 证明优化、Taproot/Schnorr升级、闪电网络局限性、Substrate等内容。
另外,在过去的一周当中,以太坊1.X、以太坊2.0以及Layer 2也迎来了众多技术进展。
比特币作为最大的加密货币,其交易其实并不是匿名的,众多学术研究已经表明,比特币的交易图可以被有效去匿名化,即使是很多所谓的匿名加密货币也是如此。
而对于那些希望在公共区块链上获得交易隐私的用户而言,像Zcash、门罗币(Monero)这样的匿名加密货币系统,因使用了相当高级的密码学原语,例如简洁零知识证明(zkSNARKs)和环签名(ring signatures),从而提供了更高程度的不可链接性。那使用这样的系统,用户可以高枕无忧了吗?
实际上,尽管它们拥有了强大的密码学原语保护,但还是会存在一些协议层的隐私攻击方式会对这些系统的隐私性构成威胁,这也是斯坦福大学教授Dan Boneh等密码学大牛最新的研究成果。
(注:研究者向Zcash和Monero安全团队披露了这些攻击,并且他们已在最新版本客户端中修复了相关漏洞。例如,Zcash v2.0.7-3版本客户端引入了初始修复,v2.1.1-1版本客户端为区块处理中的时间侧信道引入了进一步的修复。而Monero则在v0.15.0版本客户端中引入了修复。将客户端更新到最新版本的用户,将不易受到此类攻击的威胁。另外,由于攻击需要监视和参与Zcash或Monero网络,因此此类攻击并不能追溯以往的交易。)
1、1 匿名支付系统的架构
在描述相关攻击之前,我们先来了解下隐私加密货币(以Zcash和Monero为例)的一些核心设计概念。这些加密货币是建立在比特币的UTXO(未花费交易输出)模型之上的,即每笔交易会花费以前交易的输出,并产生新的输出。这些UTXO的集合会记录在区块链中,并表示流通中的总货币。
货币的每个用户都拥有一个或多个公钥(也称为地址),并且连接到P2P网络以发送和接收交易。
隐私目标:在比特币中,UTXO是一个(amount,pk)元祖(tuple),其中pk代表接收者的公钥。为了以后使用这个UTXO,接收者在相应的密钥下生成一个签名。这样,一笔交易就显示了所用货币的数量、资金的来源(即使用了哪些UTXO)及其目的地(即新UTXO所有者的公钥)。
此外,用户的公钥可链接至其向网络发送交易时连接到的P2P节点。
而Zcash和Monero等匿名加密货币,旨在提供以下更强的隐私保障:
1. 保密性:交易不披露交易金额;
2. 不可追踪性:当交易花费UTXO时,很难识别交易生成了该UTXO;
3. 不可链接性:给定两笔发送到网络的交易(最多有一笔是由对手发送),则对手无法判断它们是否支付相同的地址。此外,给定两个地址,对手无法确定它们是否属于同一用户;
4. 用户匿名:给定用户地址(即公钥),对手无法确定该地址的所有者如何连接到P2P网络;
而这些隐私保障,通常是通过密码学技术的组合来实现的,下面我们将简单地描述下这些技术:
1. 保密交易技术(CT)隐藏了交易资金的数额,一笔保密交易的UTXO形式为(Commit(amount), pk),也就是说,它们只显示交易金额的密码学承诺。交易还包括证明其总余额为0的一个证明。
2. UTXO匿名集通过隐藏交易输入的身份提供不可追踪性。具体来说,匿名交易不会显示它花费的UTXO,而只显示一个超级UTXO集,以及这个集合中某些UTXO所有权的零知识证明。
3. 混淆及多样化地址保证不可链接性。为了防止发送到同一地址交易的可链接性,匿名交易的UTXO包含一个“混淆”公钥(例如,Zcash中对该密钥的承诺)。多样化地址(或Monero中的子地址)使得用户能够匿名地与多个实体进行交易,而无需管理多个密钥。通过单个密钥sk,用户可以创建多个公钥pk1,…… pkn。这些密钥是不可链接的:很难确定两个公钥pk、pk0是否来自于同一个密钥。
区块链扫描是不可链接性的技术后果。由于匿名交易的UTXO并不会清晰显示接收方的公钥,因此用户必须扫描每笔新交易并执行各种密码学操作,以检查交易是否和它们有关。
用户匿名性由不可追踪性和不可链接性保证。由于交易不会显示发送方或接收方的公钥,因此用户的公钥不能链接至其用于发送或接收交易的P2P节点。
(1)用户的钱包创建一笔交易,这涉及到生成一个密码学证明。此计算可以在本地执行,也可以外包给远程服务。(2) 钱包将新交易发送到P2P节点,P2P节点将其广播到网络中。(3)P2P节点与连接的钱包共享接收到的交易,连接可以是本地的或远程的。在交易创建期间,对手1a可以计时外包的证明生成,以泄漏某些交易秘密。在处理一笔新交易时,钱包作为交易的收款人时,其行为可能会发生变化。如果钱包连接到远程节点,这可以由观察钱包和节点之间通信模式的对手1b,或控制该节点的对手3来推断。如果钱包和节点位于同一位置,则与用户的P2P节点交互的对手2,就可以推断钱包行为的变化。
匿名交易的生命周期。图1说明了如何通过P2P网络创建匿名交易,并与节点和钱包进行共享:
1. 为了发送新的交易,用户的钱包选择一些UTXO,并产生零知识交易有效性证明;
2. 交易被发送到连接至钱包并与网络共享的P2P节点。P2P节点将这些交易存储在它们的“存储池”(Mempool)中;
3. P2P节点与连接的钱包共享这些交易。钱包扫描每一笔新交易,以检查它是否是交易的收款人。一旦一笔交易被纳入区块当中,就会执行步骤2和步骤3。当一个区块被挖掘时,该区块及其包含的交易将被广播到所有P2P节点。然后区块的交易就和用户的钱包进行共享了。
1、2 攻击结果
了解完匿名支付系统的架构,我们来简单认识下研究者提出的攻击,究竟会带来什么样的后果。
据悉,这些攻击是利用了系统不同部分泄露的通信模式或时间信息,攻击者通过系统的方法,观察匿名交易在系统中的生命周期。在每一步,研究者都会寻找侧信道,并评估它们对用户隐私的影响。
在图1所示的匿名交易生命周期当中,攻击者可在这些步骤中的每一步观察侧信道信息,并尝试了解有关交易的信息,例如:预期收款人的身份(例如,他们的公钥或他们的P2P节点的IP地址)、交易转移的资金量或资金来源。
下面是研究结果:
1、在Zcash中,用户的钱包和P2P节点是在单个进程中运行的。钱包通过尝试使用它的密钥对其进行解密,以检查它是否是每个传入交易的收款人。而这导致了侧信道泄漏的两个来源:(1)如果解密成功并且解密的交易(称为Note纯文本)格式正确,则钱包将执行额外的Pedersen承诺校验; (2)如果解密成功,但是解密的交易格式不正确,则钱包会抛出一个异常,而该异常会传播到节点的P2P层。
在第一种情况下,执行额外Pedersen承诺检查所花费的时间,会导致P2P节点对后续网络消息的响应出现延迟。
因此,研究者提出了一种称为PING的攻击,攻击者可使用ping响应中的延迟,来推断节点是否为交易的收款人。这破坏了交易的不可链接性。
在第二种情况下,研究者提出了一种REJECT攻击,其中攻击者小心地处理格式错误的交易,在已知(但匿名)公钥下对其进行加密,并将其发送到目标P2P节点。如果解密成功,则会触发异常,并且目标节点将明确的“reject”消息发送回攻击者。
攻击者在收到此消息后,其就能知道所选的公钥属于目标P2P节点的所有者,而这违反了匿名性。
有关PING和REJECT攻击的详细信息,有兴趣的读者请参见原论文第四节。
2、对于Monero而言,其钱包和节点也在单独的进程中运行,研究证明,支付接收会更改钱包及其节点之间的通信模式。
如果钱包连接到远程节点(在移动钱包中很常见,或者在首次与网络同步时很常见),则被动网络对手可以推断该钱包是否是最近交易的收款方。(有关细节,请参见原论文第五节)
此外,即使用户的钱包和节点位于同一位置,研究者也表明,远程对手可引起和观察节点资源的锁竞争(Lock Contention),来推断钱包到节点的通信模式。
研究者在广域网中验证了这种时间攻击,一位位于伦敦的攻击方可推断受害者(在苏黎世运行的节点和钱包)是否收到了付款。
对于Zcash和Monero而言,这类攻击使远程对手能够通过识别每个交易收款人的P2P节点来链接匿名交易。如下面所述,攻击可进一步被利用于:(1)根据用户的公钥识别其P2P节点的IP地址;(2)打破属于同一用户的各种地址的不可链接性。
对于Zcash,这些攻击还能够:(3)在给定用户公钥的情况下远程导致Zcash节点崩溃,以及(4)在涉及用户长期秘密查看密钥的(非恒定时间)ECDH密钥交换上创建远程时间侧信道,这可能导致查看密钥的泄漏。
这些攻击可能会使关注隐私的加密货币用户处于危险之中。例如,将用户的匿名公钥链接到其P2P节点的对手,可以发现用户的真实身份或位置,一个打破不可链接性的对手,可以推断哪些P2P节点属于正在进行交易的用户。
3 zkSNARK生成中的侧信道,此外,研究者还观察到,在Zcash中,生成zkSNARK的时间不是恒定的,而是取决于交易金额的汉明权重(hamming-weight)等秘密信息。研究实验表明,目前的zkSNARK实现在实际中并非是零知识的:从时间泄露中收集的信息会使零知识属性失效。如果对手能够测量zkSNARK生成过程的运行时间,则可以提取此信息。当然,正如下文所解释的,在当前的Zcash系统中,可能很难利用这种泄漏。
1、3 攻击方式概述
了解完了攻击带来的后果,我们重点来认识下这类通用攻击方式,以及针对zkSNARK Prover的时间攻击,而针对Zcash和Monero的具体攻击方式,则省略不谈。
1、威胁模型
本文所描述的攻击属于远程侧信道攻击。因此其并不要求受害者的软件被替换,我们可以考虑这样一个远程对手,如图1所示:
1. 一个网络对手(图1中的对手1a和1b)监视受害者钱包和远程服务(例如节点或验证程序)之间的加密通信量。
2. 一个P2P对手(对手2)参与P2P网络。攻击者可能会偏离P2P协议。
3. 一个远程节点对手(对手3)控制一个第三方P2P节点,并监视受害者的钱包与该节点之间的(明文)通信。
2、攻击类型一:接收方侧信道
研究发现,最实用和最普遍的侧信道攻击,会影响图1所示的匿名交易生命周期的最后阶段(即钱包处理新交易时)。这些攻击使远程对手能够破坏系统的不可连接性和匿名性保证。
这种攻击利用了相关匿名加密货币普遍存在的设计缺陷,即用户的钱包会定期检查它是否是任何新交易的收款人。
目标:这类攻击针对的是交易不可链接性和用户匿名性。因此,攻击者的目标是:(1)确定两笔交易是否支付相同的地址,(2)确定已知地址的用户如何连接到P2P网络。
这种攻击针对的是钱包与P2P节点的常见部署,其实际目标是识别交易收款人正在使用的P2P节点。在多个用户将其本地钱包连接到共享远程P2P节点的设置中,网络对手或远程节点对手发起的攻击,可进一步识别出交易收款人使用的实际钱包。
这里考虑两种不同的攻击场景:
1. 对手知道一个匿名公钥,并向该密钥发送一笔交易,以确认密钥所有者用于接收交易的P2P节点(或钱包)。
2. 诚实的用户发送一笔交易,对手不知道预期的收款人或其公钥。对手决定交易的收款人使用哪个P2P节点(或钱包)。
实际上,后一种攻击场景包含了第一种情况,因为对手可以将精心编制的交易发送到已知公钥。后一种场景会直接导致交易不可链接性的中断。
给定发送到网络中的两笔交易,对手只需要确定两笔交易的收款人是否使用了相同的P2P节点还是钱包。此外,这两种攻击场景都代表了用户匿名性的中断,并且可被用于其它隐私侵犯:
1. IP地址恢复,对手可以将公钥链接到所有者P2P节点的IP地址(如果连接到远程节点,则可以链接到其钱包),除非所有者使用匿名工具(如Tor)。而此信息可被用于识别受害者,并对其进行地理定位。
2. 链接多样化地址,给定两个公钥,攻击者可以确定它们是否属于同一用户。攻击者向每个公钥发送一笔交易,并检查是否标识了同一节点或钱包。这打破了多地址的不可链接性。
3. 恢复私钥,这些攻击背后的漏洞,也为通过时间侧信道提取受害者的“查看”密钥开辟了途径。窃取此密钥,可以让对手将发送给受害者的所有交易链接起来(但无法窃取受害者的资金)。
攻击策略
研究者的攻击利用了加密货币钱包(收款人和非收款人)处理交易的方式差异。
这种钱包行为的差异,其本身并不是问题,因为远程攻击者无法直接与用户的钱包交互。然而,研究发现,由于各种设计缺陷,钱包行为的差异影响了钱包与其P2P节点之间的交互。反过来,这就使得远程攻击者可通过各种侧信道推断钱包到节点交互的变化。
对此,研究者提出了两种通用攻击策略:
策略1,钱包到节点通信的流量分析。如果钱包连接到远程节点,则网络对手或远程节点对手可观察钱包到节点交互的变化。
策略2,从P2P层推断钱包行为。如果钱包和节点位于同一位置,则远程对手无法观察它们的交互。然而,如果钱包行为的变化,影响了用户的P2P节点和远程对等节点之间的交互,信息仍然会泄漏给对手。
这两种策略,不仅适用于在创建交易并将其发送到P2P网络时,而且也适用于将其包含在区块中时。在这一点上,区块及其所有交易都与每个对等方共享,钱包重新处理交易以确保它们有效(例如确保它们没有双花)。
3、 攻击类型二 : 发送方侧信道
上面描述的攻击,打破了匿名加密货币交易的不可链接性以及用户的匿名性,这是利用了P2P客户端和钱包系统设计中的缺陷。因此,它们并不是直接针对协议密码学保护的攻击。为了扩大对匿名交易中侧信道漏洞的调查范围,研究者还对密码学工具展开了研究,而这些工具保证了交易创建时的机密性和不可追踪性,论文中特别提到的,便是当前加密货币行业使用最多的简洁零知识证明zk-SNARKs。
注意,这部分描述的攻击实际上更偏向于理论性质。虽然它们不太可能影响到当前的用户,但这类攻击的存在,再次说明了无侧信道密码学实现对于匿名系统的重要性。
攻击目标:负责确保交易保密性和不可追踪性的交易发送者。
正如下面讨论的,远程攻击最可能的目标是恢复交易金额,从而破坏交易的保密性。
然而,针对交易创建的远程侧信道攻击,实际面临着很多挑战:
1. 非交互性:用户可以在不与任何其他方交互的情况下创建交易;
2. 短暂秘密:许多交易秘密(例如交易金额,以及与UTXO相关的秘密)是一次性的。因此,即使存在一个侧信道,对手也可以尝试一次提取这些秘密;
3. 高熵秘密:用于创建交易的长期秘密(例如用户的密钥)具有高熵,并要求提取高精度的侧信道;
研究表明,对手理论上可以克服这些挑战,其目标是交易创建过程的证明阶段,并旨在(部分)揭露交易的保密金额。
我们知道,零知识证明是匿名交易的基本构建技术,在zk-SNARK协议中,证明者(prover)有一些秘密输入(称为witness),并使验证者(verifier)确信该witness满足给定的断言,而不透露关于witness的任何其他信息。在Zcash和Monero中,此类proof证明了交易的有效性,同时保留了交易的隐私性。例如,在Zcash中,证明witness包含已用UTXO的列表、接收者地址、交易金额,以及保证这些UTXO存在并且属于支出者,且所有资金都转移至接收者的证明。
zk-SNARK证明者中的时间侧信道。研究者的论题是,在当前的zk-SNARK实现中,生成证明所花费的时间,会泄露有关prover秘密witness的信息,特别是关于花费币的数量,然而,如上所述,由于交易创建的非交互性质,远程对手可能很难在证明生成过程中获得时间侧信道。而更糟糕的是,证明生成的时间可能不足以提取短暂或具有高熵的秘密。
尽管存在这些挑战,但我们在下文中指出,在某些部署方案中,对匿名加密货币的zk-SNARK prover进行远程时间攻击是可能的,并且演示了证明生成时间,可以泄露有关秘密交易额的重要信息。
关于非交互性,研究者提出了两个观察结论:
1. 如果弱客户端(例如移动钱包)将证明外包给远程服务,则网络对手可以计时prover。虽然证明外包的情况并不常见,但Zcash协议是支持这项功能的,远程证明服务是为早期版本的协议设计的,因而,会有一些用户可能会选择将证明委托给远程服务;
2. 更一般地说,对手可以通过监控P2P网络来获取有关交易创建过程何时开始的带外信息,并观察何时结束。例如,用户可以设置定期付款,其中交易是在固定时间创建的。对手还可以触发一笔交易,以作为某些外部协议的一部分。研究者为数字签名绘制了一个时间侧通道连接。虽然签名是非交互的,但使用它的协议(例如TLS)可以引入远程侧信道。
对于攻击者而言,攻击的目标就是交易量,这是一个非加密值,即使是粗略的近似值(通过单个时间测量泄漏)也构成了对隐私的侵犯。
攻击策略。研究者考虑了一种利用算术运算中的时间变化(取决于操作数的值)密码学时间攻击。
研究利用了这样一个事实:产生证明的时间与prover的witness值有关。由于witness包含交易金额,攻击的目标就是该金额与证明时间有关。例如,Zcash的证明将交易量分解为bit,并为每个非零bit计算一次椭圆曲线运算。因此,证明时间与交易金额的汉明权重是密切相关的,也就是说,证明时间与交易金额的值也是相关的。
1、4 关于zkSNARK Prover的时间攻击
下面,我们进入到zkSNARK Prover的时间攻击部分,按照上面描述的策略,我们的目标是从证明生成的单个时间度量中,恢复有关保密交易金额的信息。
在下面的部分当中,研究者演示了这种时间攻击如何揭示Zcash中有关交易量的信息。
而对于Monero中实现的特殊用途证明,类似的攻击则是无效的。
1、Zcash Prover中的时间侧信道
研究者表示,对于Zcash的zkSNARK系统,证明时间在很大程度上取决于证明者witness的值。也就是说,对于匿名交易,证明时间与交易的秘密值是密切相关的。
为了发送一笔交易,发送方创建两个证明,其中一个证明已花费UTXO的所有权,另一证明新的UTXO是结构良好的。
Zcash使用的是Groth16证明系统,对于攻击目的而言,只要知道证明者将witness编码为一个向量(a1,……,am)字段元素,并且证明者的主要计算是以下形式的“多重指数运算”:
其中Gi是固定的椭圆曲线点,重要的是,Zcash的实现优化了aiGi,其中ai = 0。因此,证明时间与证明者的witness中非零字段元素的数量相关。
由于witness中的交易量是二进制编码的,其汉明权重值就会影响证明时间。而且,由于二进制表示的权重,与数字的绝对值相关,因此证明持续时间泄露了有关保密交易金额的信息。
2、评估
为了评估时间攻击,研究者进行了一个实验。
下图显示了每个量的证明时间的平均值及标准差。结果显示,证明时间与交易金额具有很强的相关性(R=0.57)。虽然时间泄露只能得出金额的粗略近似值,但这足以让对手识别出价值巨大的罕见交易。
1、5 讨论和结论
与论文中提到的针对Zcash和Monero的攻击(已被修复)相比,上述时间攻击是不容易应用的,它要求对手可以对证明生成进行计时,这取决于用户的常用模式(例如重付款)或部署策略(例如,将证明外包给远程服务)。
如果确实存在计时机会,研究表明这种泄露会允许攻击者对私人交易金额进行粗略估算。
当然,本地侧信道攻击会是更加有效的,然而,Zcash明确地否认了这种威胁。
最终,这种攻击的存在,对于非恒定时间加密货币实现而言,可能会带来潜在的威胁。Zcash开发者正在开发一个更成熟版本的椭圆曲线算法,并可能在未来部署到主客户端中。
洒脱喜简评:这类攻击的提出,为匿名交易系统的设计带来了新的挑战。研究者希望这项工作能够提醒相关项目方及用户关于侧信道泄露的威胁,并推动开发诸如恒定时间的zkSNARK prover之类的密码学原语实现。
责任编辑;zl
评论
查看更多