【摘要】 Mimblewimble 的隐私保护功能从根本上是有缺陷的。我只需每周支付 60 美元的 AWS 费用,就能实时发现 96% 的 Grin 交易发起者和收款者的确切地址。
Mimblewimble 的隐私保护功能从根本上是有缺陷的。我只需每周支付 60 美元的 AWS 费用,就能实时发现 96% 的 Grin 交易发起者和收款者的确切地址。
这个问题是 Mimblewimble 所固有的,我认为没有办法予以修补。这意味着,当涉及到隐私时,Mimblewimble 不该被视为 Zcash 或门罗币 (Monero) 的可行替代品。
在过去的两年中,作为一种新兴的轻量级隐私协议,Mimblewimble 越来越受欢迎。Mimblewimble 是 2016 年由一个化名为 Tom Elvis Jedusor 的黑客发明的,他在一次 IRC 聊天中抛出了此协议的文字描述,然后就人间蒸发了。此后,Mimblewimble 最著名的几个应用包括所谓「公平发布」的隐私代币 Grin、由 VC 支持的 Tari 以及 BEAM 项目,甚至有人考虑将它集成到莱特币中。
已经有一些研究人员假设过 Mimblewimble 可能存在的隐私弱点。我的贡献在于:展示执行攻击的精确方法,证明其在实时网络上的可行性,并量度其有效性。在对 Grin 的真实测试中,我发现,揭开交易流信息的成功率达到 96%。因此,现在显然不能指望 Mimblewimble 能提供健壮的隐私保护。
这里是对 Mimblewimble 实施攻击的一个技术性深度研究,包括开源代码、可复现的数据和技术类常见问答。通过下文,我将对可链接性提供一个高层次的直观解释,介绍如何发起攻击,以及它对隐私技术的意义。
什么是可链接性?
非常重要的一点是,理解此次攻击意味着什么、不意味着什么。
这种攻击没有让我们得出人们收取款项的具体金额。Mimblewimble 使用普通椭圆曲线加密(佩德森承诺)成功地混淆了支付金额。但这种攻击确实能让我们找出谁给谁付款。换句话说,它让我们将各笔交易链接起来,并确认支付流。
为什么这是一个大问题?可能需要展开解释下。
假设 Coinbase 知道某个地址属于一个叫 Daniel 的委内瑞拉人,而你作为一个美国用户,想在 Coinbase 上兑换现金。但在揭开了被混淆的交易图之后,Coinbase 知道了,你从 Daniel 那里收到了钱,尽管他们不知道你收到了多少。基于 OFAC (海外资产管理办公室)关于委内瑞拉的政策,Coinbase 将关闭你的账户。
交易所当然会对交易图有很多了解,因为它们拥有那些将加密币兑换为法币的用户的 KYC 信息。
再举个例子,假如某个威权政府知道,某个特定的地址属于一位政治异见人士。你向这位异见者捐了一小笔钱。稍后,当你用 Mimblewimble 协议将钱发送到本地的交易所时,该交易所将与政府共享你的交易数据。因为政府可以看到交易图的全貌,他们现在知道,你支持过一个政治异见人士。
这种类型的攻击在 Zcash 是不可能实现的。因为 Zcash 是「不可链接」的,换句话说,每一笔 Zcash 交易都有一个庞大的匿名集。匿名集本质上是一组交易,你的交易无法从中分辨出来。可以把它想象成混入人群:匿名集越大,你的交易就会混入到更大的「人群」中。
在 Zcash 中,每笔交易的匿名集包括所有获得了屏障防护的币。从信息论的角度来看,这是可能做到的最大匿名性。
在门罗币中,每笔交易的匿名集是所有(可信的)诱饵交易的集合。虽然门罗币客户端允许你指定诱饵集的大小,但当前的缺省值为 11。门罗币在安全采样诱饵方面也有自己的问题,但我认为它基本可行,看怎么取舍了。
人们本以为 Mimblewimble 的匿名集看起来是这样的:
但实际上,它是这样的:
这将 Mimblewimble 的匿名集缩小到仅一个地址。
需要说明的是,我并没有指责 Grin 的意思。我非常尊重 Grin 社区和核心开发人员,在听取了我的问题后,他们提供了极大的帮助。
和比特币或其他非隐私币相比,Grin 仍然提供了更强大的隐私模型,毕竟其交易金额是安全加密的。但与 Zcash 或门罗币相比,Mimblewimble 提供了一个从严格意义上来看较弱的隐私模型,这使得它不足以满足许多实际的隐私用例。
关于此次攻击的高阶概述
那么,在 Mimblewimble 中,将交易图「去匿名化」到底是怎么做到的呢?
我注意到,尽管对支付金额进行了加密,Mimblewimble 仍然会留下一个可链接的交易图。但是协议设计者意识到了这一点,所以 Mimblewimble 使用两种主要的技术来对抗可链接性:第一种是全区块直通聚合 (full-block cut-through aggregation),第二种是蒲公英协议 (Dandelion)。
区块直通背后的思路是,当交易在一个区块内积累时,这些交易将聚合为一个「超级交易」。这种「超级交易」基本上就像一个巨大的代币混合 (CoinJoin)——本质上,所有的输入和输出都被丢进一个巨大的桶里,没法轻易确定这个桶里谁付钱给了谁。只是一堆输入变成了一堆输出,金额被模糊了。
听起来没毛病,对吗?只有一个问题:这个混币(CoinJoin)必须一次构建一个交易。由于交易不断地被创建并从各个不同的地方广播,如果你运行一个嗅探器节点来在直通聚合完成之前获取所有的交易,那么解开 CoinJoin 就很简单了。任何嗅探器节点都可以检测网络,并在各交易聚合之前记录原初的交易。将你在 P2P 网络中检测的所有消息归档,其实是非常容易的一件事情。
等等,真的吗?就这些?
Grin 团队其实提出了另一条防线:蒲公英协议。蒲公英是 CMU (卡耐基梅隆大学)研究人员开发的一种网络技术,它试图模糊交易的发起方。
通常,在像比特币这样的加密货币中,交易的发起方只是向所有的对等方大声宣告他们的交易,然后通过 P2P 网络迅速传播。但在蒲公英协议中,每一笔交易的广播都是从一个秘密的电话游戏开始的。发起方只向一个对等点悄悄发布交易,而这个对等点又向另一个对等点悄悄发布,就这样链式传递。在随机跳了几次之后,最后一个对等点会像在比特币中一样宣告交易。但是这个对等点离发起方实在太远了,任何观察者都不可能分辨出谁是链条的起点。
这对于混淆交易者的 IP 非常有用。但是蒲公英协议在 Grin 中还有第二个功能:它恰好可以击败嗅探器存档节点。因为每一笔交易都是从一个蒲公英链开始的,只要两笔交易在其蒲公英链中交叉,它们就会更早被聚合。如果发生这种情况,那么在将交易广播给所有观察者时,嗅探器节点已经无法拆解它们了。它们已经被混币了(CoinJoined)。
这是 Grin 针对嗅探器节点以防御可链接性的主要措施。但是有一种简单的方法可以破解它。
默认情况下,每个 Grin 节点连接 8 个其他对等点。但是通过猛增对等点的数量,我可以将我的嗅探器节点连接到网络中的所有其他节点。假设我在线时间足够长,最终几乎每个节点都会连接到我,使我成为一个超级节点。
一旦我成为超级节点,很有可能任何一笔交易的蒲公英路径都会经过我。我基本可以在交易聚合之前捕捉到它:唯一不可能的情况是,在我看到它们之前,两个交易已经在蒲公英路径上相交。如果我在它们聚合之前看到其中的某一笔交易,我就可以使用一些简单的代数把它们拆解出来。
在我发起的攻击中,我能够连接 96% 的交易,而且在 Grin 网络中的总共 3,000 个节点中,我只连接了 200 个节点。如果我多花点钱,我可以很容易地连接到 3,000 个节点来分解几乎所有的交易。做这件事时我也不需要成为一个单一的超级节点;通过启动 3,000 个具有独立 IP 的节点(每个节点仅连接到一个对等节点),可以实现相同的攻击。我只要嗅探所有交易数据并将其转储到一个中央主数据库中,攻击就同样有效。
那么 Mimblewimble 还有救吗?
看情况啦。我相信,正如目前所设想的那样,Grin 没有明确的途径通向不可链接性。就像我在这篇技术文章中讨论的那样,仅仅提高蒲公英因子,并不足以应对一个雄心勃勃的攻击者。
但除了可链接性,Mimblewimble 仍然具有独特的价值!它支持直通聚合,这是一种针对完整节点的有效压缩技术,并可有效隐藏交易的金额。如果你需要较高的隐私保护,你可以将 Mimblewimble 与其他使交易图模糊化的协议结合使用,例如在以太坊 9¾ 中,它将 Mimblewimble 与一种 Zerocash 风格的承诺无效器方案结合在一起。
但很明显,Mimblewimble 本身还不够强大,不足以提供健壮的隐私保护。
比特币问世已经有 11 年的历史了,但加密货币仍处于起步阶段。就在不久之前,在 Zcash 和门罗币中都发现了毁灭性的 bug。这是意料之中的事情——大多数有趣的技术仍然处在基础科学阶段。
但这就是科学进步的方式:我们提出新的理论,然后不断推翻它们,直到剩下的理论经受住时间的考验。(撰文:Ivan Bogatyy)