DeltaPrime 协议在 7 月 23 日遭受攻击,导致 13 个 Prime 账户损失 100 万美元。攻击者利用配置错误非法转移账户所有权,偿还贷款并提取抵押品。在48小时内,DeltaPrime 团队检测到攻击,重新审计代码并修复漏洞,攻击者归还了 90 万美元,并从 DeltaPrime 稳定池中使用了 10 万美元,所有受影响的用户都得到了补偿。
7月23日,攻击者通过一个配置错误问题,获得了从13个不同的Prime账户中盗取1,000,000美元的权限。这个配置错误允许攻击者非法地将Prime账户的所有权转移到自己的地址,从而偿还他们的贷款并提取他们的抵押品。
在48小时内,攻击被检测到,代码经过重新审计,漏洞被修复,所有受影响的用户都得到了补偿,其中900,000美元由攻击者归还,100,000美元来自DeltaPrime稳定池。
17:23–19:33
19:33
22:15–22:33
23:50
00:09
00:10
00:23–01:41
01:54–01:57
https://x.com/DeltaPrimeDefi/status/1815536737206026346
04:22
05:45
10:26–19:46
12:04–12:23
12:23–17:30
关于支付赏金的重要说明: 虽然在这种情况下,为了迅速解决问题,我们最终同意支付赏金,但我们不太可能再次这样做。漏洞赏金专门用于负责任地报告漏洞,而不是通过勒索来要求。鉴于该漏洞的潜在影响,如果该黑客填写漏洞报告,他本可以获得相同的赏金,而无需冒着我们先发现他的身份,可能摧毁他的生活的风险。我们将致力于尽可能地让我们的用户得到补偿,当我们可以利用法律的全部力量时,我们不会承诺为此向攻击者付款。我们会考虑并接受资金追回的潜在延迟。
18:00
20:30
21:06
DeltaPrime使用DiamondBeaconProxy (DBP) 模式,该模式允许它同时执行所有Prime账户的升级,并保持PrimeAccount部署成本的轻量化。
DBP——作为EVM代理模式的一种——使用一种架构,其中合约可以粗略地分为两种类型:
- PrimeAccounts充当存储合约——它们存储所有状态(智能合约的存储),并拥有账户内所有资产/头寸的所有权。
- 实现合约 (facets) ——它们持有可在PrimeAccount中使用的方法的实现代码。
在PrimeAccount存储上调用各种方法时,它使用EVM .delegatecall()(而不是标准的 .call()),这允许在PrimeAccount的存储上下文中执行实现合约的方法(而不是实现合约)。
为了让PrimeAccount知道特定方法的实现的地址是什么,它与架构的核心——DiamondBeacon合约进行交互。
DiamondBeacon是一个单例合约,它将支持的方法选择器(每个方法唯一的4字节标识符)映射到它们各自的实现合约地址。
在所有EVM代理模式中,一个重要的考虑因素是确保各种实现合约(或者在只有1个实现合约的情况下,甚至是同一合约的新版本)使用机制来避免存储布局冲突,这将导致覆盖已经存在的存储变量,这可能会导致无法预料的结果。
避免此类存储冲突的一种方法是使用自定义存储槽,而不是EVM默认存储布局。合约的存储分为²²⁵⁶个槽——每个槽32个字节。
可以从任意(但唯一)的字符串中计算出keccak256哈希,并将结果用作指向存储中特定槽的指针。这种方法以足够的概率保证,使用keccak256函数生成的每个存储在唯一槽中的结构都不会与已经使用的其他槽重叠。
作为设计的一部分,合约可以使用多个自定义存储槽,以便将它们划分为服务于特定目的的更连贯的部分。在协议中使用的许多存储槽中,有两个槽对于理解最近漏洞的流程至关重要。
第一个槽(0x8d5bb42e0ac1496a2c326edc9c00758985246e6c2bb146d6c2f4a0d509e0960a)用作PrimeAccounts一般状态的存储槽,其中包括地址所有者变量以及bool _initialized变量。Owner指定哪个地址是合约的所有者,_initialized确保合约只能初始化一次。
第二个槽(0xc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c)用作特定于DiamondBeacon的变量的存储槽,包括bytes4选择器 -> 地址映射以及bool _initialized变量。
按照设计,代理合约在部署时通常会使用起始值进行初始化,其中包括设置合约所有者。
对于DiamondBeacon,初始化的方法是init() -> ( bytes4 selector 0xe1c7392a ),对于PrimeAccounts,则是initialize() -> ( bytes4 selector 0xc4d66de8)。
DiamondBeacon的init() ` 方法用于在部署协议时首次初始化Diamond,并且在完成部署和初始配置后应将其删除(尚未执行)。由于Prime Account没有此方法的实现,因此它向DiamondBeacon请求逻辑。DiamondBeacon向Prime Account提供了` init() `的逻辑(这是开发人员无意的场景)。
为了更好地可视化漏洞的流程,让我们使用其中一个漏洞txs流程作为示例:
这两种初始化方法都确保合约只能初始化一次,并且只能初始化一次。
导致违规的原因是,尽管两种实现都检查了_initialized标志,但它们使用了两个不同的存储槽。
在上面的流程图中,在第1点)我们可以看到攻击者在PrimeAccount合约上使用了0xe1c7392a init() 方法。在第2点)我们可以看到逻辑检查了合约是否已在0xc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c槽(特定于DiamondBeacon)下初始化,而不是0x8d5bb42e0ac1496a2c326edc9c00758985246e6c2bb146d6c2f4a0d509e0960a。这允许绕过重新初始化检查,并在第3点)导致合约所有者更改保存在0x8d5bb42e0ac1496a2c326edc9c00758985246e6c2bb146d6c2f4a0d509e0960a存储槽中,该槽用于(除其他外)定义合约的当前所有者。
在利用此途径后,攻击者可以在劫持的帐户上执行Prime Account特定的方法。在任何时候,他都受到其他Prime Account Safeguards(如偿付能力检查或提款保护)的限制,因此他必须解除头寸并偿还向池借入的金额,然后才能继续提款(耗尽抵押品)。
在确认这种攻击向量后不久,DeltaPrime的团队部署了一个交易到时间锁,以从DiamondBeacon中删除` init `方法,以禁用此未经授权的路由,并与审计员一起检查协议中是否存在类似的场景。
在没有发生事故的情况下存在了18个月之后,许多人已经开始将Prime Account视为他们自己坚不可摧的DeFi堡垒。我们理解,Prime账户得到全额补偿并不能自动重新获得对其安全性的所有信任。我们对事件的发生深感遗憾,并将尽一切努力重新获得失去的信任。
以下是采取的第一步。我们将随着我们的成长继续改进和扩展我们的安全实践。
1. 更改所有者方法的存在是为了允许用户在发生需要的情况下将其Prime Account迁移到不同的钱包。通常,此事件是其帐户上的drainer,导致每个token自动被发送走,或者助记词被泄露(我们有多个实例,其中钱包的攻击者在合法所有者使用此功能来保护其资金之前未能从Prime Account中删除资金)。一旦所有者被更改,添加一个时间锁来提取资金,这允许我们在造成任何损害之前收到先前所有者的警报/或分类适当的内部警报。
2. 到目前为止,DeltaPrime已经进行了7次代码审计。其中许多是由Peckshield完成的。拥有占主导地位的审计师,存在确认偏差的风险。虽然添加新的审计师来审计完整的代码库成本很高,但新鲜的视角可以对所有代码进行批判性审查,而不仅仅是新添加的代码。这意味着可能隐藏了很长时间的错误有更大的机会被发现和解决。
3. 到目前为止,一个关键漏洞可以奖励的最高漏洞赏金为稳定币中的10万美元。随着我们最近推出token,我们也可以奖励$PRIME。对于较大的赏金,token会被归属,并且为这些赏金预留了一定的百分比,DeltaPrime能够为正确报告的关键漏洞提供更大的赏金。这导致了更高的激励来报告漏洞,而不是冒着DeltaPrime,其用户和攻击者自由的风险来换取更大的奖励。如果我们耗尽了为此分配的$PRIME,我们将从市场上购买$PRIME作为归属的奖励。
4. 允许调用序列白名单。
攻击者使用了一种不寻常的途径来执行所有权劫持。在漏洞利用中,通常会执行一些未被开发团队,审计员和白帽黑客忽视的意外操作序列。幸运的是,随着当前区块链网络安全的发展,这些情况可以得到显着缓解。允许的调用跟踪到DeltaPrime协议的链上白名单将包含在DeltaPrime智能合约中。该白名单将通过历史交易训练到DeltaPrime合约和测试用例,并与DeltaPrime的开发和添加的新功能一起扩展。当交易命中不在白名单中的路径时 - 它将被恢复。每个新的调用跟踪都将在网络安全团队的帮助下进行链下检查,并且在确定安全后,该路径将以透明的方式添加到白名单中。该解决方案将减轻许多攻击媒介,而不会增加中心化风险或影响我们用户可以执行的当前操作。
在过去的几年里,我们见证了来自各种不同协议的相当多的黑客攻击和漏洞利用。一般来说,社区的反应是可以理解的,都是一样的:1)潜在漏洞的首次报告发布,2)投资者争先恐后地退出,直到池被暂停 3)Discord/X 充斥着焦虑的问题、rug猜测和冲突。
可能,攻击者的一个常见策略是利用这种混乱来迫使团队做出轻率的决定。毕竟,谁愿意看到他们的社区陷入混乱?所以我们的攻击者也是如此,在周二下午4:27发出了这条消息。
然而,你们一直是我在漏洞利用期间见过的最冷静的社区。储蓄池在整个过程中都开放用于存款和取款,但我们的TVL达到了历史最高水平。此外,在攻击者试图向我们施压,声称你们不耐烦的确切时间,这是在Discord的主要频道中进行的对话。
正如你可以想象的那样,攻击者试图操纵适得其反…… 看到你们的“不耐烦”加强了我们的决心,而不是削弱了它。
当我们与攻击者谈判时,我们在Discord和X上在线。在我们与你们交换的以及关注的数千条消息中,只有一条评论可以被认为是负面的(一条引用转发说“我就把这个留在这里”,向我们展示了我们讨论我们广泛的安全措施)。除此之外,每条消息要么是关于情况如何发展的诚实问题,要么是支持和积极性,要么就像是另一个星期二一样的随机玩笑(如上面的屏幕截图所示)。
虽然通常不可能理解这种支持在这样的时期有多重要,但我们希望上面的屏幕截图显示了你们对具有挑战性的情况的积极结果的影响。你们在攻击之前、期间和之后表现出的信任是无价的,我们非常自豪能成为你们社区的一员。
让我们再次让那些Prime账户变得密不透风。
- 原文链接: medium.com/@DeltaPrimeDe...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!