Allbridge Core协议在4月初遭受攻击,损失约65万美元。通过与合作伙伴合作,大部分资金已追回并用于赔偿受影响用户。文章分析了导致攻击的流动性池问题,并介绍了修复方案,包括改进流动性计算、引入储备金和重新平衡机制、限制每条链一个资产池、自动和手动关闭机制等。此外,Allbridge Core将开源其EVM和Tron合约。
在4月1日至2日的晚上,Allbridge Core 协议在一系列攻击中遭到利用。攻击者从 BNB Chain 流动性池中耗尽了大约 65 万美元,之后桥被关闭。
通过与我们的合作伙伴合作,我们能够追回大部分被盗资金,并使用它们向所有提交申请表的受影响用户提供赔偿金。同时,我们调查了攻击背后的原因,并为 Allbridge Core 实施了新功能,以防止未来发生此类漏洞。
在本文中,我们将分析导致漏洞利用的早期版本流动性池的根本问题,以及我们如何修复它们。即使本文深入探讨了 Allbridge Core 内部逻辑的一些复杂细节,但本文并不要求你具备任何技术知识。如果在阅读完本文后仍有任何疑问,我们的支持团队将很乐意为你提供帮助。
每个 Allbridge Core 流动性池本质上都是一个兑换合约,类似于现有的去中心化交易所,如 Uniswap 或 Curve Finance。但我们池的不同之处在于,流动性仅以一种代币提供(不像常规的 DEX 需要两种代币)。
当流动性被存入时,我们通过铸造相同数量的 vUSD 代币*来匹配存入的金额。此代币用作在池之间转移价值的媒介(无论是在同一区块链内还是在两个不同的区块链之间)。
*vUSD 代币是 Allbridge Core 生态系统中使用的抽象概念。从技术上讲,它不是代币,因为它永远不会作为实际代币进入用户余额。但是,使用这种“代币”类比来解释 Allbridge Core 的工作原理更容易。
例如,如果你将 BNB Chain 上的 BUSD 桥接到 Tron 上的 USDT,首先我们将 BUSD 兑换为 vUSD,然后通过跨链消息传递协议将 vUSD 的价值转移到 Tron,然后在 Tron 上将 vUSD 兑换为 USDT。在这种特定的兑换方向上,BUSD 到 vUSD 的内部价格会降低。同时,USDT 到 vUSD 的价格更高,鼓励其他参与者以盈利的方式朝相反的方向桥接。
到目前为止,我们已经介绍了存入流动性和兑换,那么提取呢?提取类似于存入,但在这种情况下会销毁相同数量的 vUSD 代币,因为我们会将其返还给用户。
当池平衡时(具有相同数量的流动性和 vUSD)很容易做到这一点。但是,我们必须兑换代币之间的差额以抵消不平衡。因此,池越不平衡,用户在提取流动性时获得的代币就越少*。
*我们的流动性提供者在 2023 年 3 月 USDC 暂时脱钩时注意到了这种影响。即使 USDC 池中的 USDC 多于 vUSD,用户能够提取的代币也少于最初存入的代币(直到池再次相对平衡)。
至此,我们已经介绍了所有基础知识,但在我们可以继续讨论导致漏洞利用的问题之前,我们需要了解一些兑换池的基础知识。
我们将更深入地了解代币兑换通常如何运作。如果你熟悉此主题,则可以跳过此部分。
当存入代币时,池需要衡量添加到池中的流动性数量。不同的池使用不同的公式(或曲线)来计算流动性*,但它们都需要这样做。用户收到所谓的 LP 代币,以换取向池提供代币。它们衡量了用户对流动性池的贡献(并且也与流动性增加成正比)。
*例如,经典的 Uniswap V1 和 V2 池以及许多类似的 DEX 使用金额的数学乘积来计算流动性。因此,如果将第一个代币的金额 X 和第二个代币的金额 Y 添加到池中,则流动性增加 X * Y。Allbridge Core 使用更复杂的公式,但基本原理是相同的。
继续进行兑换,当兑换代币时,池会收到用户的一个代币,并且需要计算需要发送回多少第二个代币。这是使用相同的流动性计算公式完成的,但方向相反:流动性需要在兑换完成后保持不变。这就是为什么流动性的这个度量被称为不变量。
最后,流动性提取。当提取流动性时,池需要通过销毁与用户想要提取的流动性池份额成比例的 LP 代币来计算用户应该收回的代币数量。
在 Allbridge Core 流动性池方面,存在一些明显的差异。主要区别在于池中只有一种代币;第二种是虚拟代币(vUSD),它不存在。我们逻辑中的错误是假设我们应该在存款和取款时铸造和销毁相同数量的 vUSD。虽然它在平衡池中运行没有问题,但它导致了池极度不平衡时的漏洞利用。
由于我们旧的、有缺陷的逻辑,提取的流动性可能多于销毁的 LP 代币数量。提取本身仍然是无利可图的:如果你将 10 万美元存入平衡池并尝试从不平衡的池中提取所有资金,你将收到的会更少。但是,流动性耗尽会使池进一步失衡,并使其容易受到下一步的影响:以非常小的代币数量兑换非常大的代币数量。
这就引出了攻击本身。
在4月1日至4月2日之间的夜晚,攻击开始了。我们逐步介绍攻击者的操作:
所有操作都在一个交易中完成。结果,池变得非常不平衡,桥用户开始通过从其他链桥接来重新平衡池。在桥关闭之前,执行了第二次类似的攻击,导致了约 16 万美元的较小损失。
我们关闭了 Allbridge Core UI 和桥的后端,但这不足以阻止未来的攻击(因为攻击者直接与同一链上的智能合约交互)。因此,我们将桥上的手续费提高到 100%,使这些类型的漏洞利用变得不可行。
攻击终于结束了,但恢复之路才刚刚开始。
攻击发生后,每个链上的每个池都存在流动性不足的情况。攻击直接影响了 BNB Chain,而其他池则受到用户将资金从其他网络桥接到 BNB Chain 以抵消人为不平衡的影响。
我们能够从第一次攻击中追回大部分被盗资金,第二天重新开放了池以提取流动性,并为那些无法提取流动性或提取造成损失的人启动了恢复计划。
在最初的几周,我们的首要任务是处理后果并支持流动性提供者。同时,我们的开发人员和安全顾问正在研究重新启动 Allbridge Core 的修复方案。
我们做的第一件事是修复存款和取款时的流动性计算。我们实施了几项根本性的变更:
经过这些更改后,逻辑变得更加简化,并且进行了广泛的测试,以确保流动性提供者提取的流动性永远不会超过销毁的 LP 代币(这是最初逻辑的主要缺陷)。
但是,还有一个小的更改来激励正确的用户行为。
例如,当池平衡时,为 LP 铸造的 LP 代币数量始终与提供的流动性数量相同(当你存入 10 万美元的 USDT 时,你将收到 10 万个 LP 代币)。如果池不平衡,你将收到更少。
但同样的逻辑也适用于提款:在新逻辑下,从不平衡的池中提取流动性是有利可图的,因为你获得的稳定币多于销毁的 LP 代币。我们为了解决这个问题所做的是将提款上限设置为销毁的 LP 代币数量。因此,如果你有 10 万个 LP 代币,你可以保证从池中提取 10 万美元,不多也不少。
除了跟踪池代币和稳定币外,我们还必须跟踪池储备金。我们考虑以下示例。
有两个池,USDT 和 USDC,每个池都有 10 万美元的流动性。将 1 万美元的 USDT 转移到 USDC 后,流动性仍然为 10 万美元。但是,池余额(我们将其称为储备金)分别为 11 万美元 USDT 和 9 万美元 USDC(实际上,它们略有减少,但我们将在本示例中忽略滑点,使其更易于理解)。
虽然第一个池允许 LP 提取所有流动性,但第二个池的储备金赤字为 1 万美元。资金仍然存在,但储备金本质上会在常规桥接操作期间在区块链之间迁移。
大多数时候这不会被注意到;储备金将由 Allbridge Core 用户重新平衡(他们也将能够获得再平衡激励)。但是,在极端情况下,我们需要一种自动执行此操作的方法。
这使我们引入了再平衡授权机构。这是一个特殊账户,可以使用桥,并且无需向系统或流动性提供者支付手续费。它仅保留用于特殊情况,并且允许我们在紧急情况下在区块链之间转移储备金。
为了防止闪电贷攻击的可能性,我们将在每个区块链上部署一个流动性池。因此,将无法在单个交易中执行漏洞利用。一旦我们完成了对代码的更广泛审计,我们可能会在未来恢复到多个资产的概念。但就目前而言,我们保持安全。
我们实施的另一项安全措施解决了极端池不平衡的情况。
在新变更之后,将不可能使池失衡超过某个阈值。受影响的池仍将处于半运营状态,可以进行反向兑换和再平衡,但不能以其他方式进行。
此外,这将为流动性提供者提供更好的保护,使其免受未知攻击。如果桥上的其中一种稳定币失去其锚定,池将自动关闭。
即使智能合约在攻击期间被关闭,但直到操作完全停止,还是损失了一些宝贵的时间。我们计划通过添加新的授权机构来提高我们在出现意外问题时的反应速度。他们将能够在异常行为的最初迹象时立即停止桥接操作。
我们的支持团队将能够使用他们特殊的的新账户选择性地停止个人池的存款、取款和兑换。这些账户将无法重新启动活动或管理费用,当然也无法访问用户资金(即使合约所有者也没有此类权限)。
你可以将此新功能视为一个紧急停止按钮,如果需要,可以快速暂停桥接活动。
我们认为透明度对于任何 DeFi 协议都至关重要。为了提前识别潜在的漏洞,我们不仅验证了区块浏览器上的所有合约来源,还发布了一个公共存储库,其中记录了 Core 的 EVM 和 Tron 合约以及我们的测试。
一旦完成 Solana 的内部测试,我们也会将其添加到公共存储库中。我们邀请独立的白帽研究人员审查我们的桥合约并分享他们的发现,以防止潜在的漏洞利用。
随着我们即将重新启动,我们决定借此机会分享 Allbridge Core 即将推出的一些重大更改。我们仍然致力于通过改进的安全协议提供最佳的用户体验。请关注我们的社交渠道,以了解有关重新启动日期的更多信息。
- 原文链接: allbridge.medium.com/all...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!