本文探讨了 L2BEAT 对于跨链应用共享安全模型与孤立安全模型的分析与实验结果,指出孤立安全模型可能带来的安全风险。通过实验证明,如果应用程序可以随意定义安全政策,将给用户带来额外的风险。结尾提到 L2BEAT 将对使用 LayerZero 的每个应用进行安全风险警告,并呼吁更广泛的安全模型讨论。
从 L2BEAT 起步,我们投入了大量精力分析和理解与 L2 协议相关的风险。我们尽最大努力成为一个客观、独立的监察者,秉持着对用户和生态系统的最佳利益。我们不让个人对项目或团队的偏好干扰我们的判断。这就是为什么我们常常需要发出红色警报或指出我们对各种协议的担忧,即使我们重视特定团队对其项目投入的时间和工作。及早进行与安全相关的讨论能够使整个生态系统更好地为潜在风险做准备,并能够更早地对任何可疑行为做出反应。
今天,我们想就跨链应用的共享安全模型展开讨论。目前,有两种方法:共享安全与按应用安全。第一种,共享安全,例如,所有的 rollup 都使用这一模型。第二种,按应用安全,则被“全链”项目所使用。其中一个这样的项目就是 LayerZero。
所谓共享安全,我们是指在特定基础设施上运行的特定代币或应用不能随意选择其安全模型。相反,他们必须遵循基础设施施加的安全要求。例如,乐观回滚通常施加 7 天的最终性窗口——运行在这种回滚上的应用无法简单地忽略或缩短这个周期。这似乎是一个障碍,但这是出于一个原因而设定的障碍。它能够为用户提供一个安全保证,使他们可以期待被使用的任何应用会遵守这一约定,无论该应用的内部安全政策是什么。该应用可能只会加强回滚的政策,而不是削弱它。
而独立安全是指每个应用都有责任定义自己的安全,不受基础设施的制约。乍看之下,这似乎是一个好主意。毕竟,应用开发者最了解他们的应用可能需要什么样的安全措施。但与此同时,这将对评估与每个应用安全政策相关的风险的责任转移给最终用户。此外,如果应用开发者可以自由选择他们的应用政策,他们也可能在任何他们想要的时间更改政策。因此,评估每个应用的风险只是一次性的工作是不够的,每当应用的政策发生变化时都应该再次评估。
我们认为,独立安全模型会让每个应用可以自由地定义其安全政策,这就带来了严重的安全隐患。首先,它增加了最终用户的风险,因为他们必须分别验证他们打算使用的每个应用所带来的风险。
同时,这也增加了使用这种模型的应用面临的风险。独立安全增加了关于安全政策变化的额外风险——如果攻击者能够更改应用的安全模型,他们可能会简单地禁用它,从而提供提款资金或以其他方式滥用的可能性。应用上没有额外的安全层来防止滥用发生。
此外,安全政策能够随时即时更改,实际上使得日常监控应用并及时告知用户关于风险的事情几乎不可能。
我们认为这与智能合约的可升级性非常相似。我们已经在 L2BEAT 中对此进行了警告。我们会告知用户关于在智能合约中具有可升级机制的回滚和桥梁,以及在每种情况下管理可升级性的确切机制。这已经非常复杂,而独立安全模型则将这种复杂性在每个应用中乘以,使得有效跟踪几乎不可能。
这就是为什么我们认为独立安全模型本身就是一种安全风险,并且我们主张将使用这种模型的每个应用视为默认风险,直到被证明没有风险。
我们决定在现实世界中测试我们的假设,在主网中实验。LayerZero 框架被选定作为实验的对象,因为它是最流行的独立安全解决方案之一。我们部署了一个安全的全链代币,后来安全配置被更新,允许恶意代币的提取。该代币的代码基于 LayerZero 提供的示例,和许多在生产中部署的全链代币和应用非常相似或相同。
但在我们深入具体细节之前,让我们简要了解一下 LayerZero 的安全模型是什么样子的。
正如 LayerZero 的白皮书明确指出,其“无信任的链间通信”依赖于两个独立的参与者(预言机和中继者)共同作用以确保协议的安全。
LayerZero 在其网站上表示,其核心概念是它是一个“用户应用可配置的链上端点,运行在 ULN(超轻节点)上。”LayerZero 的链上组件依赖两个外部离线方来在链间转发消息——预言机和中继者。
当任何消息 M 从链 A 发送到链 B 时,以下两个动作会发生:
LayerZero 做了一个强假设,即中继者和预言机是独立且诚实的参与者。即使在他们的白皮书中,我们也可以看到,如果这个假设不成立,中继者和预言机可以串通,使得“由预言机提供的区块头和由中继者提供的交易证明均无效,但仍然匹配”。
LayerZero 声称“LayerZero 的设计消除了串通的可能性”。但事实上,这一说法并不成立(我们将在下面的实验中证明这一点),因为每个用户应用可以定义自己的中继者和预言机。LayerZero 的设计并不能保证这些组件是独立的,且不会串通。提供这些保证依赖于用户应用。而如果应用选择打破这些保证,LayerZero 的机制则无法阻止其做到这一点。
此外,默认情况下所有用户应用都能够随时更改中继者和预言机,完全重新定义安全假设。因此,仅仅检查某个应用的安全性一次是不够的,因为在检查之后它可能会随时发生变化,正如我们在实验中将要展示的那样。
在我们的实验中,我们决定创建一个简单的全链代币 CarpetMoon,同时在以太坊和 Optimism 上运行,使用 LayerZero 在两条链之间进行通信。
我们的代币最初使用 LayerZero 提供的默认安全模型,因此它与目前大多数(如果不是所有)部署的 LayerZero 应用非常相似。因此,通常来说,它与任何其他使用 LayerZero 的代币一样安全。
首先,我们在以太坊和 Optimism 上部署我们的代币合约:
https://ethtx.info/mainnet/0xf4d1cdabb6927c363bb30e7e65febad8b9c0f6f76f1984cd74c7f364e3ab7ca9/
然后我们设置路由,以便让 LayerZero 知道哪个合约对应于两条链上的合约:
https://ethtx.info/mainnet/0x19d78abb03179969d6404a7bd503148b4ac14d711f503752495339c96a7776e9/
所以代币已经设置好,外观上看起来与所有使用 LayerZero 的全链代币完全相同,采用的是默认配置,没有任何可疑之处。
我们给我们的测试用户——让我们称她为 Alice——提供测试代币,因此 Alice 在以太坊上拥有 10 亿 CarpetMoon 代币:
https://ethtx.info/mainnet/0x7e2faa8426dacae92830efbf356ca2da760833eca28e652ff9261fc03042b313/
现在 Alice 使用 LayerZero 将这些代币桥接到 Optimism。
我们在以太坊上将代币锁定到一个托管账户:
https://ethtx.info/mainnet/0xe4dc3757b86bfda8e7baddc088fb1a599e083ed77034c29e5dd8bd11f1e17771/
交易的消息通过 LayerZero 传递到 Optimism:
被桥接的代币在 Optimism 上被铸造,Alice 现在在 Optimism 上拥有 10 亿 MoonCarpet 代币:
好的,所以一切按预期工作,Alice 成功桥接了她的代币,并且看到以太坊上的托管账户中有 10 亿 MoonCarpet 代币,同时她在 Optimism 上的账户中也有 10 亿 MoonCarpet 代币。但为了确保一切正常,她将一半的代币(5 亿 MoonCarpet)转回以太坊。
所以我们从在 Optimism 上烧毁 5 亿代币的交易开始:
关于这笔交易的信息被传递到以太坊:
如预期,500 万 MoonCarpet 代币从托管账户交付回 Alice 的地址:
https://etherscan.io/tx/0x27702e07a65a9c6a7d1917222799ddb13bb3d05159d33bbeff2ca1ed414f6a18
到目前为止,一切正常,正如预期。Alice 检查到她可以在以太坊和 Optimism 之间转移代币,她对此并没有任何担忧。
但假设某些情况发生错误——例如,代币背后的团队被攻陷,恶意行为者 Bob 获取了我们的应用的 LayerZero 配置。
在这样的访问权限下,Bob 可以将预言机和中继者从默认位置更改为他控制的那些。
请记住,这是 LayerZero 的每个应用都提供的机制,这并不是任何形式的后门,而是标准机制。
所以 Bob 将预言机更改为一个由他控制的 EOA:
https://ethtx.info/mainnet/0x4dc84726da6ca7d750eef3d33710b5f63bf73cbe03746f88dd8375c3f4672f2f/
并对中继者做同样的操作:
https://ethtx.info/mainnet/0xc1d7ba5032af2817e95ee943018393622bf54eb87e6ff414136f5f7c48c6d19a/
现在奇怪的事情发生了。随着预言机和中继者被完全掌控,Bob 能够盗取 Alice 的代币。尽管在 Optimism 上没有任何操作(MoonCarpet 代币仍然在 Alice 的钱包中),但 Bob 能够说服以太坊上的 MoonCarpet 智能合约(通过 LayerZero 机制)他在其他链上烧毁了代币,从而能够在以太坊上提取 MoonCarpet 代币。
首先,他通过流氓预言机更新以太坊上的区块哈希:
https://ethtx.info/0xde2edee2cc7f070120e96c9df90d86696970befcfc221e18c6ac4168bb5b1d92/
现在他可以从托管账户中提取剩余的代币:
https://ethtx.info/0xda695f374b375d5372efeca37aae4c5a17f114d5a76db1e86edebb0924bcdcc7/
Alice 甚至不知道为什么以及何时发生了错误。突然之间,她在 Optimism 上的 MoonCarpet 代币不再由以太坊上的代币支持。
智能合约是不可升级的,按预期运作。唯一可疑的活动是预言机和中继者的更改,但这是 LayerZero 中内置的常规机制,因此 Alice 甚至无法知道该更改是否是故意的。即使 Alice 得知这个变化,已经为时已晚——攻击者能够在她反应之前排空资金。
而 LayerZero 在这里也无法提供帮助——这些都是他们机制的有效执行,已经无法再进行控制。理论上,应用本身可以阻止对预言机和中继者的变更,但据我们所知,到目前为止没有任何已部署的应用作出过这样的措施。
我们进行此实验以检查是否有人能够注意到这一点,但正如我们所预期的,没人注意到。有效地监控所有使用 LayerZero 构建的应用以确认其安全政策未更改并在这种情况下警告用户,几乎是不可能的。
即使有人能够抓住预言机和中继者在不安全的方式下变化,当发生时已为时已晚。因为新的预言机和中继者现在可以随意选择审查或简单禁用链间通信,用户通常对此无能为力。这在我们的实验中得到了清晰的体现,即使 Alice 注意到应用配置的变化,她也对桥接的代币无能为力——新的预言机和中继者不再在原始链上响应,因此无法将消息反向转发到以太坊。
正如我们所看到的,即使我们的代币是使用 LayerZero 构建,并按照预期使用其机制,我们仍然能够从代币托管处窃取资金。当然,这是应用(在我们案例中是 CarpetMoon 代币)的错误,而不是 LayerZero 本身的错误,但这证明了LayerZero 本身并不提供任何安全保证。
当 LayerZero 描述他们关于预言机和中继者的安全模型时,他们假设应用所有者(或持有其私钥的人)不会进行任何不理智的行为。然而,这个假设在一个对抗环境中是错误的。此外,它要求用户信任应用所有者作为受信任的第三方。
在实际情况下,由此产生的是,无法对使用 LayerZero 构建的应用的安全性做出任何假设——每个应用在被证明没有风险之前都应被视为有风险的。
实际上,这个故事对我们来说始于一则 PR,我们计划将所有全链代币包括在 L2BEAT 网站上——我们在评估它们的风险时遇到了困难。在分析风险向量时,我们想出了进行这项实验的想法。
对 L2BEAT 来说,后果是我们必须对所有使用 LayerZero 构建的应用发布上警报,警告可能的安全风险。但我们希望就安全模型进行更广泛的讨论,因为我们认为独立安全是一种反模式,应该被避免,特别是在我们的领域。
我们坚信,随着像 LayerZero 这样的独立安全模型变得越来越流行,将会有越来越多的项目滥用它们,造成许多损害,并引发对整个行业的怀疑。
- 原文链接: medium.com/l2beat/circum...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!