林定康,颜嘉麒,巴·楠登,符朕皓,姜皓晨
(南京大学信息管理学院,南京 210023)
经济和技术全球化程度越来越高,世界和区域之间的差距越来越小,犯罪分子正在采用新的货币形式(例如加密货币)来逃避监管[1],进行跨国的非法交易,并提高其非法活动的匿名性[2]。这种新型的犯罪形式,绕开正规金融机构的监管,成为恐怖分子融资、洗钱、毒品交易的温床[3]。例如,圣战分子和恐怖组织的支持者正在积极寻找并促进使用新兴技术,例如比特币、大零币、门罗币(Monero)等,来减轻与传统资金转移方法相关的监管风险[4]。在暗网和匿名数字货币技术的助推之下,毒品交易格局日益复杂。比特币等匿名交易方式,打破了毒品交易双方必须在同一地点交易的限制,绕开了正规机构的监管,使暗网毒品销售网络日益庞大[5]。很多网站也在利用用户的浏览来操纵他们的计算机帮助不法分子进行门罗币的挖矿[6]。
自2009 年比特币[7]诞生以来,它已成为最具代表性的密码货币,占有最大的市场份额。比特币的成功不仅在于它最早产生,也在于比特币声称的匿名性。比特币声称具有匿名性,但实际上比特币提供的匿名性是相对的,因为交易的信息向任何人公开,比特币的金额和流向可以完全确定。不仅如此,研究发现可以通过将地址进行聚类来确定用户集群来揭示用户的身份,挖掘出集群之间的资金流向,从而破解这种匿名性[8]。为了增加交易的匿名性,人们提出了新的数字货币方案,其中具代表性的是运用了环签名技术的门罗币[9]、运用coinjoin 技术的达世币[10]和运用了零知识证明技术的大零币[11]。本文对门罗币的匿名技术和追踪技术进行了整理和评价。
门罗币是一种基于CryptoNote 加密协议的隐私加密货币,它试图解决比特币中的可追溯性和可链接性问题。门罗币的代号为XMR,XMR 也是门罗币的货币单位,1 XMR 就是一个门罗币。截至2021 年1 月,它在最受欢迎的匿名数字货币中占到第16 位,市值约为140.44 亿人民币[12]。比特币是第一个也是目前最大的加密货币,它明确地标识了交易中使用了哪枚硬币,而门罗币允许用户通过包括被称为“mixin”的交易输入来模糊交易的真正输入[2]。门罗币交易示意图如图1 所示。本文用Tx 表示一个交易,key 表示输入输出的公钥地址,假设有3 个交易Tx1、Tx2、Tx3,每一个交易各有一个交易输出key-a、key-b、key-c,创建一个新的交易Tx4 将key-b的TXO(Transaction Output)转给key-d,门罗币根据某些策略将其他两个输出地址key-a、key-c都标记为Tx4 的输入,这样真实的输入key-b就被隐藏起来。人们不知道key-a、key-b、key-c哪一个才是真正的输入,其中用来混淆真实输入的输出地址key-a、key-c就被称为mixin。
图1 门罗币交易示意图Fig.1 Schematic diagram of Monero transaction
门罗币隐私问题要求货币确保以下两个属性[13]:
不可链接性(unlinkability)对于任何交易,都不可能证明它们是由同一个发送方发送的。即使是一个无限强大的对手,能够访问无限数量的交易,也不能以优势猜测他的身份,也不能将事务链接到同一个发送者[14]。
不可追踪性(untracability)给定交易输入,被花费的实际输出应该在一组其他输出中匿名[15]。
门罗币的匿名技术保证了交易的不可链接性和不可追踪性[9]。为了保证不可链接性,门罗币通过设计引入了一次性随机地址的概念,其思想是:交易的每个发送方都为收件人生成一个新的一次性随机地址,这种方式只有收件人可以使用长期秘密密钥来花费它。如果每个地址都是使用新的随机性生成的,并且只使用一次,那么对手很难链接两个地址。为了保证不可追踪性,门罗币使用名为环签名的加密技术。环签名让发送人原本的输入混合在其他的输入中一起,发件人代表一组其他用户匿名签名交易信息。因此,被花费的实际输入在多个签名中被隐藏,无法判断到底哪个是真正的输入,从而实现了不可追踪性[15]。
本文介绍保证了不可链接性的一次性随机地址、保证了不可追踪性的环签名加密技术以及为提高匿名性的各个版本更新中技术的演进,并介绍针对这些技术和门罗币交易的特征而进行追踪的各种对策。通过对门罗币的匿名技术及其追踪技术的研究,本文主要得到如下4 个结论:
1)门罗币的匿名技术和追踪技术呈现出相互促进的特点。
2)RingCT(Ring Confidential Transactions)的应用是一把双刃剑,它既使从币值出发的被动攻击方法失效,也使主动攻击方法更加容易。
3)输出合并攻击和0-mixin 攻击(Zero Mixin Attack)具有互补作用。
4)门罗币的系统安全链条仍待理顺。
门罗币匿名技术的核心是环签名加密技术。在密码学中,环签名是一种可以由一组各自具有密钥的用户组中的任何成员执行的数字签名。因此,具有环签名的消息被特定人群中的某一个人认可,但是确定使用哪个组内成员的密钥来生成签名在计算上是不可行的,这也是环形签名的安全属性之一[16]。环签名最早由Rivest 等[17]在2001 年提出。该概念类似于组签名的概念,但是无法识别环签名交易的实际签名者,并且可以在环签名中包含任意数量的用户,而无需任何其他设置。最初的概念是使环签名成为一种泄漏机密信息的方法,特别是从高级政府官员那里泄漏机密信息,而实际上不透露出签名者是谁。
环签名使用了基于椭圆曲线离散对数问题的EDDSA(EDwards-curve Digital Signature Algorithm)算法[18]。一次环签名由密钥生成算法(key GENeration algorithm,GEN)、签名生成算法(SIgnature Generation algorithm,SIG)、签名验证算法(signature VERification algorithm,VER)和链接性验证算法(LiNKability verification algorithm,LNK)四种算法组成[9]。
GEN 签名者选择一个随机秘密密钥x,计算公钥P=xG和密钥镜像I=HP(P),其中HP是确定性哈希函数。
SIG 签名者获取一个消息m,一组公钥S′的{Pi}i=s,并输出一个签名σ和一个密钥集S=S′∩{Ps}。
VER 验证者检验签名。
LNK 验证者检查I是否在过去的签名中使用过。
每个交易都有一个环签名,可以识别哪个mixin 是真实的,而不透露任何关于它的信息;同时,每个mixin 以及实际输入都有一个唯一的密钥镜像,所有节点都可以检查是否有任何密钥镜像在此之前已经显示[19]。
一次性随机地址保证了门罗币的不可链接性。与比特币模型相反,用户拥有唯一的公钥、私钥对对应于地址,在门罗币中,发件人根据收件人的地址和某种随机性生成一次性公钥[20]。从这个意义上说,发送给同一个收件人的交易实际上是发送给不同的一次性公钥(而不是直接发送到唯一地址),只有收件人才能收回一次性私钥及花费金额。
Noether 等[21]详细地讲解了一次性随机地址的数学原理,门罗币的一次性随机地址的实现代码在github 上公开[22]。举例说明它的作用过程:当一个用户Alice 希望向另一个用户Bob 付款时,她获得Bob 的长期公钥pk-long。然后,她为Bob 生成一次性公钥pk-onetime。因为只有Bob 知道长期私钥sk-long,只有他才能得到sk-onetime。然后,Alice创建了一个交易,她支付给Bob 的一次性公钥pk-long。一次性密钥作为Bob 的一次性使用的支付地址。由于地址总是随机性生成,并且只使用一次,因此发送方和接收方以外的任何人都很难将两个地址链接到同一个用户。
如果有多个输出支付给同一个收件人,则每个输出生成一个新的一次性公钥。因此,每个事务输出(Transaction Outputs,TXO)都可以通过其相应的一次性公钥进行标识。
门罗币使用环签名来确保不可追踪性,使用了Fujisaki等[23]提出的修改版本的环签名。环签名允许用户代表用户的“环”签名消息,签名者只需要知道自己的签名密钥。在签署消息后,签名者提供环中所有用户的公钥。验证者(verifier)能够验证示证者(prover)确实在环中的公钥中,但不能确定到底是哪一个,因而就不能确认身份[24]。
例如,用户Alice 希望发送10 XMR 到另一个用户Bob。她首先获得Bob 的长期公钥pk-long,然后根据该公钥创建一个一次性的随机公钥pk-onetime。现在,Alice 没有像比特币那样签署交易,而是在价值10 XMR 的区块链上获取其他一些TXO,表现为一些一次性随机公钥。本文将这个集合表示为S={P1,P2,…,Pm},S还包括Alice 自己的输入,其中Pi=xiG(i∈[1,m])。她的输入Pi在S中隐藏,Alice 能够创造一个环签名并签署交易。
当其他人看到交易信息时,只能获知真实的花费在几个TXO 中,但无法确定哪个是真正的TXO[19]。Alice 在S中包含的其他输入密钥称为mixin。由于Alice 的实际输入密钥在S中的密钥中是匿名的,所以使用的混合输入mixin 数量越大,实现的匿名性就越好。显然,环签名提供了门罗币内部的内置混合服务,每个用户都可以自主地混合mixin[25]。
1.4.1 最初版本
在2016 年1 月1 日版本之前,在最初的Monero 实现中,mixin 是从所有具有与所花费的硬币相同面额的先前TXO 集合中统一选择的,因此,选择较早的产出比选择较新的产出更频繁。门罗币的mixin 选择Cryptonote 引用实现包含了统一的选择策略,由于交易输入中引用的所有TXO 必须具有相同的面额(即0.01 XMR 输入只能引用0.01 XMR 输出),因此客户端软件维护可用TXO 的数据库,按面额索引。mixin 是从这个有序的可用TXO 列表中采样的,除了它们在块链中的相对顺序外,不考虑任何时间信息[25]。
1.4.2 mixin 选择策略
在2016 年1 月1 日升级之后,引入了一种新的策略,用于选择基于三角形分布的混合策略[26],有利于较新的硬币作为混合币而不是较旧的硬币。这一变化是为了对抗最新猜测攻击,防止由于总是较新的TXO 为真实输入而暴露。在2016 年12 月13 日版本之后,对mixin 选择策略进行了更改:更多从新产生的TXO 中选择了mixin,即在过去5 d 内创建的输入,效果是确保事务中25%的输入从最近的区域采样。
1.4.3 最低mixin 要求
在2016 年3 月,门罗币开始要求每个输入至少2 个mixin,禁止了0-mixin 交易的存在。至少2 个mixin 的规定是为了抵御0-mixin 攻击,防止因为0-mixin 的级联效应而暴露多mixin 交易的真实输入。这在2017 年9 月增加到4 个,2018 年4 月增加到6 个;从2018 年10 月起,所有交易的mixin数量已固定在10 个[27]。更多的mixin 意味着更高的匿名性。
1.4.4 RingCT 更新
2016 年9 月19 日之后,应用了RingCT[28],允许用户隐藏其硬币的面额,避免了将可用TXO 分割成不同面值以防止基于面值的推理攻击[25]。RingCT 交易直到2017 年1 月10 日硬叉之后才被认为有效[29]。由于面值被隐藏,mixin 的选择从原来必须选择相同面额,到现在可以随机选择;并且由于它是在2-Mixin 最小值生效后部署的(版本0.9.0),因此没有0-mixin 在RingCT 输入造成0-mixin 攻击的威胁。
RingCT 增加了哈希的次数,但是减少了一半签名的长度,对于数字货币来说,这无疑就提升了很大的竞争力,因为签名的缩短不仅减轻了网络负载,同样还减小了交易的大小;对于按字节数来进行计算交易费的机制来说,也就减小了每笔交易的交易费[19]。
目前,门罗币的追踪技术主要有4 类:基于输入输出关系而进行的追踪,如0-mixin 攻击、输出合并攻击、封闭集攻击等;基于统计得出总结规律的追踪,如最新猜测攻击等;通过某些方法使得部分公钥已知以进行追踪,如泛洪攻击、钱包环攻击等;利用门罗币安全机制漏洞进行的追踪,如恶意远程节点攻击等。下面对这些追踪技术逐一进行介绍。Kumar 等[30]是在门罗币的追溯性领域开创性的研究,最先提出了0-mixin 攻击、输出合并攻击、最新猜测攻击。Kumar等[30]首先定义3 个名词,用来解释以下的追踪技术,本文将沿用这3 个定义以便解释各种追踪方法。
定义1有效匿名集大小。假设一个交易的某一个输入有m个mixin 来产生环签名,如果其中的k个mixin 是可追踪的,那么有效匿名集大小为m+1-k。
定义2可追踪输入。假设一个交易的某一个输入的有效匿名集大小为1,那么该输入为可追踪输入。
定义3可追踪交易。假设一个交易的每笔输入都是可追踪输入,那么该交易为可追踪交易。
以下两个启发式0-mixin 攻击和输出合并攻击的目的就在于减小有效匿名集,寻找可追踪输入进而确定可追踪交易。
Kumar 等[30]首次提出了0-mixin 攻击,此攻击基于这样一个原理:当一个密钥key-a为交易Txa输入i的真实输入时,它就不可能被再次花费,那么在其他的交易Txb中输入j再次出现的key-a就不是j的真实输入。根据定义2,一个0-mixin 的输入的有效匿名集大小是1,那么0-mixin 的输入都是可追踪输入。也就是说,这些输入都是没有使用mixin 来进行混合的,在一个输入中的唯一密钥就是这个输入的真实输入。而当已知此密钥为这一输入的真实输入,就可以在其出现在其他输入中时剔除掉它,以减小有效匿名集的大小,增加可追踪性[30]。
例如,在图2 中,第一个交易Tx1 中有一个输入,而这个输入为0-mixin,可以确定,这个输入key-a就是它的真实输入。当key-a出现在另一个交易的输入Tx2 中时,认定key-a不是交易Tx2 的真实输入,那么Tx2 的真实输入就在其余的密钥中产生,而恰巧这个输入剩下的密钥只有一个,该输入的有效匿名集的大小为1,可以确定,key-b就是Tx2 的真实输入。通过这样的重复过程,不断消减其余交易中输入的有效匿名集大小,确定新的已知密钥,就可以达到追踪的目的。
图2 0-mixin攻击示意图Fig.2 Schematic diagram of zero mixin attack
0-mixin 攻击方法的成功是基于大量的0-mixin 交易的存在,得到了许多的已知密钥。文献[30]采集的数据是从2014 年4 月18 日到2017 年2 月68 日,区块高度为1 240 503。其中65%为0-mixin 交易,使用此方法破解出了另外22%交易的匿名性,使得87%的输入可追踪。
2018 年,Möser 等[31]使用同样的数据进行了再次实验来验 证0-mixin 攻击的 有效性。Möser 等[31]的贡献 在于将0-mixin 攻击运用到不同改进阶段的门罗币交易数据,探寻该方法在各个不同阶段的有效性。通过再次验证,Möser等[31]发现在2-mixin 的强制要求版本之后,可追踪性急剧下降;而在RingCT 推出的版本之后,可追踪性更低了。这说明版本的改进,特别是RingCT 的应用使得门罗币的匿名性极大增强。事实上,即使是在此之后发表的论文中,很少有能够真正破解RingCT 的攻击办法。
使用越多的mixin 确实可以提供更多的匿名性。实验的结果显示,无论是2-mixin 的强制要求出现之前还是之后,RingCT 出现之前或之后,该方法的有效性大致随着mixin 数量的增多而递减。
2020 年Ye 等[32]对这个方法进行了再次验证,将输出合并攻击(Output Merging Attack)应用于整个区块链,从创始区块到2020 年4 月15 日的第2077094 区块。在算法迭代到无法推断任何更多的输入时,部分或完全可推断的交易的百分比已经近零超过两年,这表明RingCT 和增加mixin 的组合在减少门罗币交易的可追溯性方面相当成功。
如图3,Tx1 是一个使用多个mixin 的输入的事务,它有两个输出key-a和key-b。TX2 是另一个事务,它有两个由I1和I2表示的输入。每个输入都有多个mixin,I1和I2都包含TX1 的输出。如果满足以上条件,那么使用虚线表示的输入密钥key-a和key-b是在TX2 中使用的真正密钥,也就是Tx2的真实输入。
图3 输出合并攻击示意图Fig.3 Schematic diagram of output merging attack
这个攻击方法成立的前提是假设选择同一个交易的mixin 时,算法被设计为不会选择同一个交易的输出。如果算法没有能够避免这种情况,那么很可能出现同一个交易几个mixin 来自同一个交易输出的情况,那么毫无疑问会降低门罗币的匿名性。Kumar 等[30]通过实验证实了这一假设,并验证了这个方法的正确性。
可以看到这种方法是可以运用在RingCT 出现之后的版本上进行攻击的,因为这种攻击并没有从交易的金额出发。但是这样的方法并没能在文献[30]实验中得到验证,因为2017 年RingCT 刚刚应用,使用RingCT 的区块还不是很多。该方法并没有受到后续研究的重视,在文献[31]中没有提及,而文献[32]中也没有再次验证。但是就实验结果而言,这个方法不同于前面的方法,输出合并攻击对于更多mixin的输入影响更大,且正确率很高。
由于0-mixin 攻击的正确率可以认为是100%,可以使用0-mixin 攻击追踪的结果来验证其他正确性稍弱的攻击方法。本文定义这3 个概念,以便于对实验结果的解释。
定义4TP(True Positive)。代指由被验证攻击破解出来的真实输入和由0-mixin 攻击破解出来的真实输入一致的交易。
定义5FP(False Positive)。是指由被验证攻击破解出来的真实输入与由0-mixin 攻击破解出来的真实输入不一致的交易。
定义6UP(Unknown Positive)。是指由被验证攻击破解出来的真实输入,但是没有办法得到0-mixin 攻击破解验证的交易。
研究验证了输出合并攻击的准确性和在多mixin 样本追踪情况下的优越性。0-mixin 的攻击破解结果可以看作一定是正确的,而实验发现两个攻击方法不一致的FP 非常少,即证明了输出合并攻击的有效性。0-mixin 攻击具有弊端,对较多mixin 混合的样本攻击有效性极大降低,可破解出的多mixin 样本的数量也减少,导致能够得到验证的输出合并攻击的多mixin 破解样本无法得到验证,产生了很多的UP。而这些大量的UP 显示了输出合并攻击对于多mixin 样本破解相较于0-mixin 攻击的优越性,输出合并攻击可以追踪出0-mixin 攻击可追踪的交易范围之外的很多交易,甚至在多mixin 交易的情况下表现优于0-mixin 攻击[30]。
基于前面两种方法的结果,Kumar 等[30]经过统计分析又提出了最新猜测攻击(Guess-Newest Attack)。即给定一组用于创建环签名的输入密钥,实际使用的密钥是具有最高块高度的密钥,其中它显示为未花费的TXO。也就是说,算法选择的mixin 大多来自更早之前的输入,而非最新的输入。这个攻击的猜测是基于这样的推断,即最新的输入可能是在最新的100 个区块里面,而更多更早的输入则存在于100 000个之前的区块中,显然,旧的输入被抽中当作mixin 的几率要更大。
Kumar 等[30]用0-mixin 攻击的结果对最新猜测攻击进行了测试,TP 的占比为98.1%。这说明截至2017 年门罗币的绝大多数交易输入的最新输入密钥是其中真正真实的输入。门罗币的开发人员为了避免这个问题,自2015 年4 月5 日以来决定从三角分布中抽取混合样本[26]。三角形分布给较新的TXO 提供了比旧的更高的概率,而非像之前混合输入是从一个均匀的分布中采样的,因此可以抵御最新猜测攻击。
图4 最新猜测攻击示意图Fig.4 Schematic diagram of guess-newest attack
Möser 等[31]运用蒙特卡罗模拟(Monte Carlo Simulation)来检验最新猜测攻击的正确性。他们使用门罗币所使用的mixin 抽取策略从0-mixin 攻击已经推断出来的交易数据中抽取mixin 来作为模拟的交易,并统计最新猜测攻击的正确性。结果是比较好的,总的正确性达到92.33%。
值得注意的是,2020 年文献[32]中对这个方法进行了再次验证,结果显示,在RingCT 后(2017 年1 月)的交易,最新猜测攻击的准确性急剧下降。对于具有10 个混合素的输入(其中包括自2018 年秋季以来的所有输入,当每个事务的mixin 数量固定在10 时),可以看到该方法的正确性下降到仅剩三成,从大约90%下降到大约30%。这说明三角分布策略和RingCT 的使用对于最新猜测攻击是十分有效的,极大保护了匿名性。
几个因素导致了最新猜测攻击的准确性下降。首先,RingCT 使得输入和输出金额被隐藏[28]。这意味着现在可以使用任何RingCT 输出作为mixin。在RingCT 之前,只能使用与实际TXO 相同的TXO,这极大减少了可以从mixin 中选择的TXO 集。第二,mixin 的选择策略已经发生了改变,三角分布选择mixin 使得近期的mixin 的权重增大,更容易被选为mixin,也减小了最新的一个输入密钥为真实输入的几率。
Yu 等[27]首先提出了封闭集攻击(Closed Set Attack),这种攻击是基于这样一个事实,即n个交易输入将必须使用n个不同的公钥作为实际输入,因为每个公钥只能被真实地使用一次。如果一组输入的数量等于包含的不同公钥的数量,则这一组输入称为封闭集。出现在封闭集中的密钥被视为已经花费的真实输入,那么这些密钥再次在封闭集之外的其他输入中出现,就一定是mixin 了,可以直接被剔除以减小有效匿名集[2]。这种攻击就是找到所有可能的封闭集,并把在封闭集之外出现的与封闭集中相同的公钥都剔除,以不断减小有效匿名集大小,增加可推断性。
如图5,假设有这样4 个交易,每个交易都只有一个输入,Tx1 的输入包括{key-1,key-2,key-3},Tx2 的输入包括{key-2,key-3},Tx3 的输入包括{key-1,key-3},Tx4 的输入包括{key-1,key-2,key-3,key-4}。Tx1、Tx2、Tx3 的交易的输入数量为3,在这3 个交易中使用的公钥的数量为3,与输入数量相同,也就是说,Tx1、Tx2、Tx3 这3 个交易的输入构成了一个封闭集。由于有3 个输入,那么必须要有3 个真实输入的公钥,而封闭集中总共只有3 个公钥,key-1、key-2、key-3 无论在哪个交易中被花费,都可以确认为已经被花费了。那么可以推断,Tx4 的输入中key-1、key-2、key-3 都为mixin,而真实的输入密钥就是key-4。
图5 封闭集攻击示意图Fig.5 Schematic diagram of closed set attack
封闭集攻击的优点在于,对于RingCT 是可用的,因为不涉及面值;但是封闭集攻击的效果并不太好,对于级联效应攻击后的数据集,只能进一步跟踪0.084%的输入。而这种攻击的攻击代价是很大的,理论上可行,但是实际来说对于一个如此大的数据集,这样的计算量是不可接受的。如果数据集中输入密钥数量的平均数为m,找到所有的封闭集需要的算法复杂度经过优化后最小为O(m*N2)[27]。
泛洪攻击(Transaction Flooding Attack)由Chervinski 等[33]首先提出,其核心很简单,掌握尽可能多的已知密钥以便将这些密钥从不可能的交易中剔除来缩小有效匿名集确定可追踪输入。可确定的密钥有两种:一种是已知已经在之前某些交易中被花费的密钥,第二种是在手中却没有被花费的密钥。成功的泛洪攻击的主要挑战是拥有足够的密钥作为已知的密钥库,以便系统从攻击者的一组密钥中选择输入的所有混合。要拥有输出密钥,攻击者必须使用有效的事务来淹没网络,最好是使用非常低的成本,从而使攻击可行。如图6,当攻击者在链上通过制造很多交易获得大量已知密钥,用这些已知密钥去检验链上的其他交易,若交易中的key-1 和key-2 都在已知密钥集中,则可以排除在此交易中花费,那么剩下的key-3 就是真实的输入了。
图6 泛洪攻击示意图Fig.6 Schematic diagram of transaction flooding attack
门罗币的系统从过去1.8 d 产生的输出键中选择50%的mixin,其余50%的mixin 是从旧的事务输出中选择的。要创建自己的输出密钥,攻击者必须向自己的地址发送付款。这些事务将生成新的输出密钥,这些密钥将由攻击者拥有。每个事务输出只用花费1 piconero(10-12XMR)。对于攻击者来说,创建有效交易的成本主要是交易费用。文献[33]探索了采用每个交易多少个输入时经济和时间成本最低,探索了制造多少交易与最终可破解的交易占比之间的关系,探索了该方法在不同的门罗币版本上的成本和效果。
相较于一些高成本的计算和门罗币本身的价值而言,泛洪攻击的成本非常低。实验发现,攻击者仅需要花费9.253 XMR 或582.19 美元的交易费用,就可以在一年内控制50% 的输出密钥。导致这一结果有两个原因:一是RingCT 使用后币值不再显示出来,因此mixin 的选择可以不需要选择相同币值的mixin,这样就降低了泛洪攻击的成本,使得创建一个新的输入变得十分便宜,可以低成本地建立起一个已知的密钥库;第二,门罗币的级联效应,在掌握一些已知密钥的时候,可以推断出更多的密钥,而这些新的密钥又增加了已知密钥库,从而便于推断出更多的密钥。
事实上采用如此低廉的手段,可以使得如此高比例的门罗币交易可追踪,对于整个门罗币网络的匿名性打击是致命的。显然,门罗币的设计者认为这样的攻击成本很高以至于不可实现,但是他们没有考虑到RingCT 对这一成本的完全摒弃。RingCT很好地解决了0-mixin攻击等可以从币值上出发来进行破译的方法[9],但是却被泛洪攻击这样的攻击破译。泛洪攻击几乎是目前所有的攻击中对RingCT真正有效的方法。
远程恶意节点攻击(Tracing Attacks from Remote Nodes)由Lee 等[34]首先提出。文献[34]不仅提出了攻击的方法,还设计了如何抵御这种攻击的机制。
2.6.1 门罗币客户端与远程节点运作方式
在解释攻击之前,首先描述门罗币客户端和远程节点的运作方式,Cao 等[35]详细解释了门罗币的网络结构。当门罗币客户端启动交易时,它首先查询远程节点以获得有关块链的信息。接收到的信息中包括最大全局索引,钱包将使用该索引来确定交易中包含哪些mixin。钱包对候选输出(按全局索引)进行采样,以用作mixin。为了避免揭示哪一个是真正的输入,客户端还将mixin 的索引和真正的输入一起包含到请求中,尽管这些冗余数据已经由钱包存储[36]。输出请求通过 get_outs.bin 的应用程序接口(Application Programming Interface,API)端点发送到远程节点,该端点将返回每个请求的所包含的密钥。当收到get_outs.bin 的响应时,客户端执行部分验证:如果客户端的这些密钥(已经存储在钱包中)不在返回的响应中,则事务被中止,并向用户显示错误。在钱包接收到所有的密钥后,它从这些密钥中统一选择最终的mixin 数量,并将它们与真正的密钥一起形成事务。在确认交易之后,客户端将这些输出标记为已花费状态,并将交易传输到远程节点,如图7 所示。
图7 门罗币客户端与远程节点运作方式示意图Fig.7 Schematic diagram of operation mode between Monroe client and remote node
2.6.2 恶意远程节点攻击原理与举例
首先对上面描述的客户端行为进行观察:如果远程节点返回无效响应并在客户端触发异常,则客户端中止交易并向用户显示消息。如果用户再次尝试启动相同的交易,客户端软件将重新开始处理,包括采样所有要作为mixin 使用的新输出。最终的结果是将两个查询发送到远程节点,而这两次请求中包含的几个密钥中相交的那个,就是真实的输入。
如图8,假设第一次客户端发出请求,消息中包含L1={key-1,key-2,key-3,key-4};当节点返无效响应,用户再次启动相同的交易,客户端采集了不同的mixin,发送的消息中包含L2={key-1,key-5,key-6,key-7}。那么可 以推断 出,L1 ∩L2={key-1},key-1 就是真实的输入。
图8 恶意远程节点攻击示意图Fig.8 Schematic diagram of tracing attacks from remote nodes
2.6.3 恶意远程节点攻击有效性评价
恶意远程节点攻击是利用了门罗币系统消息传递的不安全性和节点间通信的验证漏洞。目前节点间的通信还使用简单的明文HTTP(Hyper Text Transfer Protocol)来传输JSON(JavaScript Object Notation)文件[34],没有使用加密的可信信道,因此恶意节点可以没有障碍地获得信息,从而从获取的信息中推断出真正的输入。但是保密学发展十分完备,这些问题如果得到门罗币开发人员的重视,可以在新的更新中应用加密、握手协议等很容易地解决。
钱包环攻击(Monero Ring Attack)由Wijaya 等[37]提出。由于Monero 系统只检查提交的事务的有效性,环签名的构造完全由钱包处理[38],Wijaya 等[37]使用自己编写的钱包完成攻击。钱包环攻击包括3 个阶段:
准备阶段 攻击者需要有一些未使用的输出TXO,数量要大于系统允许的环签名的最小尺寸。
启动阶段 假设有r个密钥属于集合L,那么创建r个输入,也就是r个环,r个密钥的TXO 在r个输入中被消耗。每个环的mixin 的选择也都从集合L中来。
攻击阶段 被动攻击:当其他的输入选择到L中的密钥作为mixin 时,可以很容易得知这几个mixin 不是真实的输入,可以把这几个mixin 剔除,从而减小了有效匿名集大小。主动攻击:让被攻击者使用一个恶意的钱包,这个钱包创建的交易所选择的mixin 都是从L中选择的。由于这些密钥已知已经被花费,所以真正的输入就是在L集合外的那个密钥。
如图9,先准备5 个没有花费的输出L={key-1,key-2,key-3,key-4,key-5},在交易Tx1、Tx2、Tx3、Tx4、Tx5 中分别把这5 个输出作为输入,并为每一个输入创建1 个5 密钥的环,其余的4 个mixin 都来自L,那么就确保了这5 个密钥都是已经被花费了的输入。被动攻击类似封闭集攻击,事实上启动阶段的过程就是在创造封闭集的过程,输入的大小和密钥的个数都是5,那么当在其他的交易输入中出现的时候,就可以判断是mixin 而非真实的输入予以剔除。如图9 中Tx6,由于key-1、key-2 已经被花费,这个交易的真实输入只能从key-6、key-7、key-8 中产生,由此有效匿名集的大小减小为3。主动攻击则是使用一个恶意的钱包,这个钱包的功能是实现在创建环的时候,选择的mixin 都来自L,如图9 中Tx7,创建一个新的输入时,除了真实的新的输入,其余的密钥都来自L,那么那个唯一不来自L的key-6 就是真实的输入,从而实现了追踪。
图9 钱包环攻击示意图Fig.9 Schematic diagram of Monero ring attack
Wijaya 等[39]提出了一种可以缓解钱包环攻击的方法,利用哈希函数来检测出重复出现多次的mixin,并提出改进门罗币守护进程,增加鉴别限制mixin 重复使用多次的机制,来防止钱包环攻击。Wijaya 等[39]还提出了钱包环攻击的改进方法,来躲避他们前面提到的鉴别,在创建环的时候有规律地分布各个公钥以达到既全部花费又减少公钥被重复的次数。
钱包环攻击方法中的主动攻击确实可以100%确定真实的输入从而实现追踪,而且如果掌握的密钥越多,破解的可能性越大。而且由于RingCT 的应用,币值不再是问题,可以只使用小额的输入来创建为了攻击的交易,降低了这个方法的使用费用。钱包环攻击主动攻击的前提是这个钱包被追踪人所用,而要达到这个目的却非常难。要是通过被动攻击方法,则需要创建大量的交易输入,在区块中加入自己已知的密钥,而每加入一个密钥,就需要相应产生一笔输入并创建一个环。要真正实现在成千上万个区块中达到现实的可追踪性,那么需要创建数以万计的输入才能实现,无论是从时间还是经济成本来说都不是一个简便的方法。
目前对于门罗币匿名技术和追踪技术的评价和讨论的综述性文献比较少,评价大多还来自每个提出新方法的研究前列出的相关研究。但Yu 等[15]对门罗币追踪技术和门罗币的不可追踪性进行了总结和反思。Yu 等[15]认为文献[30-31]只考虑了一个只能观察区块链公共信息的被动攻击者,并没有总结和评价文献[33,37]主动攻击方法的优劣。他们还讨论了如何评价不可追踪性,提出要从个体不可追踪性和全局不可追踪性两个角度来思考的方法。Hinteregger 等[40]也总结了除了钱包环攻击和远程恶意节点攻击之外的追踪技术,并且对Kumar 等[30]的方法进行了跨链的验证。除此之外,Borggren 等[41]尽管没提出新的方法,但是引入了机器学习的方法,该技术可以用来辅助识别个人和群体。
本文通过前面部分的综述得到如下几点结论:
结论1 门罗币的匿名技术和追踪技术呈现出相互促进的特点。0-mixin 攻击的出现迫使门罗币提高mixin 使用的最低限度,也降低了使用mixin 的成本以诱导用户使用mixin。最新猜测攻击的出现也使得门罗币改变了mixin 的选择策略以避免最新的TXO 总是成为真实的输入[26]。为了防止从币值出发的各种方法,也为了提高mixin 可选择的范围,RingCT成功隐藏了币值,使得从币值出发的追踪方法彻底失效。同时这些匿名技术的进步也催生了新的追踪技术。
结论2 RingCT 的应用是一把双刃剑,它既使从币值出发的被动攻击方法失效,也使主动攻击方法更加容易。RingCT 出现使得被动攻击方法失效。RingCT 的应用使得传统的0-mixin 攻击、最新猜测攻击等失效,Ye 等[32]对这些方法验证后发现,新区块上可追踪的交易占比几乎降至0%。RingCT 的出现使得主动攻击方法变得更加有效。RingCT 的出现极大降低了泛洪攻击的成本使得泛洪攻击变得可行,不难想象,如果有对于门罗币追踪的商业性质的需求,泛洪攻击或许会成为攻击者针对RingCT 的有力攻击武器。诸如钱包环攻击等的方法,也因为RingCT 隐藏币值使得mixin 可以从任意其他交易地址中选择的特性而变得成本很低。
结论3 输出合并攻击和0-mixin 攻击具有互补作用。实验证明这两种方法的追踪准确性很高,且具有互补的优势。0-mixin 攻击在较少mixin 的交易中有效性更高,而输出合并攻击在高mixin 的交易追踪中具有优势,可以追踪出0-mixin 攻击追踪范围之外的交易。如果单纯利用传统的被动攻击方法,将两者集合起来使用,可以最大限度提高被动攻击方法的有效性。
结论4 门罗币的系统安全链条仍待理顺。恶意远程节点攻击的成功和钱包环攻击的成功说明门罗币的体系存在安全漏洞。恶意远程节点攻击的成功是基于门罗币的远程节点和客户端之间的通信是公开的、未经加密的,这些交易信息相当于在传输中透明。钱包环攻击的成功基于门罗币系统放任门罗币钱包自己产生环而不加严格的检查,这种宽容性对门罗币的应用有利,但是破坏了门罗币的安全性。Lee 等[34]已经将恶意远程节点攻击的漏洞通报给了门罗币社区,目前该漏洞已经修复。
目前来说,大多研究都从门罗币交易信息等外部特征出发,很少有从门罗币本身机制出发的追踪探索,目前只有恶意远程节点攻击使用了密码学的相关知识来进行追踪。而匿名数字货币作为密码学知识的一种应用,从密码学角度出发的本身机制的探索可能会提供更加有力的科学的追踪方法。未来对于门罗币追踪的研究突破,可能存在于从内部机制或者运营系统等角度出发的追踪方法。