如果您是 Web2 或 Web3 开发人员,并且最终正在考虑在 Web3 中寻找 bug 的职业,那么我们为您服务。查看我们的终极区块链黑客指南,并开始从 Immunefi(Web3 领先的漏洞赏金平台)上获得 1.44 亿美元的奖励。
官网:https://immunefi.com/
白帽黑客 pwning.eth 于 4 月 26 日通过 Immunefi 在 Aurora 提交了一个严重漏洞。
该漏洞包含一个无限支出漏洞,如果被恶意用户利用,可能会导致 7 万 ETH 和 2 亿美元其他资产的直接损失。
值得庆幸的是,由于 pwning.eth 的高超技术,该漏洞被负责任地披露,而不是被利用。
没有用户资金损失,Aurora 迅速修复了这个错误,为每个人带来了积极的结果。
由于该漏洞被评估为严重级别,因此白帽公司已从 Aurora 获得 600 万美元的奖金,这是历史上第二大赏金支出。
Aurora 应该受到赞扬,因为它拥有运行良好的赏金计划、快速的响应时间和大量的漏洞赏金奖励,这些奖励激励了这类项目节省报告。
详细漏洞报告:
https://aurora.dev/blog/aurora-mitigates-its-inflation-vulnerability
Immunefi 很高兴使用我们的平台促进了这种负责任的披露。我们的目标是通过激励黑客负责任地披露错误并获得干净的金钱和声誉作为交换,使 Web3 更安全。
由于 Aurora 中受影响的部分——彩虹桥——是一座跨链桥梁,我们将首先简要讨论跨链桥梁的工作原理,然后再深入探讨无限支出漏洞本身。
有许多正在积极使用的区块链网络,例如 Ethereum、NEAR、Polygon、Fantom、Avalanche、BSC 或 Solana,每个都有自己的价值主张。随着用户(和资金)涌入 DeFi,对具有低交易费用和快速确认/最终确定性的区块链的需求呈爆炸式增长。
为了满足这一需求,L2 扩展解决方案和侧链出现了激增。但是,这些解决方案(通常)不能互操作和相互通信。许多 DeFi 协议是不同链的原生协议。例如,Aave 是以太坊原生的,但 PancakeSwap 是 BSC 原生的。
爆炸式增长的 NFT 空间也是如此,我们看到大量的收藏不仅在以太坊上推出,还在 Polygon、Solana 和 NEAR 上推出。但是,如果我们想将宝贵的 NFT 或有价值的代币从一条链转移到另一条链上怎么办?
这个问题的答案是区块链跨链桥技术。桥接器是连接两个或多个不同区块链并使用户能够在它们之间移动资产的一种方式。有不同的桥梁设计和方法。没有任何标准化的方式来设计您自己的桥梁。我们仍处于未知领域。
与“常规” DeFi 项目相比,桥接器还具有额外的“攻击面”。虽然收益农场或去中心化交易所可能拥有一系列智能合约和 dapp 网页,但桥接器通常需要监控节点、验证器密钥以及在这些合约和 dapp 之上的安全通信通道。这种增加的复杂性意味着更多的代码行可以隐藏错误,以及黑客入侵的更多方式。
将在一个网络上获得/赚取的代币转移到另一个网络的需求每天都在增加。流经桥梁的数量是巨大的。
大多数跨链桥接器都实现了所谓的 IOU(我欠你)的方法:
用户向桥接器协议发送资金,然后这些资金被桥接器智能合约锁定,而桥接器协议在来自第二个跨链桥智能合约的第二个网络。
通常,目标链上的代币被称为 IOU 代币或包装代币。例如,如果用户想通过彩虹桥将以太币从以太坊发送到 NEAR,以太币将被以太坊端的桥接合约锁定,用户可以从 NEAR 的桥接合约中兑换等价的代币。对于从一条链转移到另一条链的每一美元,桥必须将该美元保留在其“本机”链上,以防用户想要将资金转移回去。
可想而知,跨链桥中堆积如山的资金。
Aurora 是建立在 NEAR 网络上的 EVM 实现,它支持以太坊生态系统中可用的所有工具。除了 EVM,Aurora 还开发了 Rainbow Bridge,允许用户在 Ethereum、NEAR 和 Aurora 之间转移资产。换句话说,它允许用户将 ETH 和 ERC20 代币从以太坊主网存入 NEAR 的嵌套层,即 Aurora。
我们不会详细解释 Aurora 的工作原理。您可以在 Aurora 官方文档中阅读。我们将深入探讨 Aurora 如何处理从 Aurora 到 NEAR 以及 Aurora 和以太坊之间的取款。
Aurora 引擎中的两个合约对我们来说特别有趣:ExitToNear和ExitToEthereum. 简而言之,它们是特殊的内置(预编译)合约,用于处理来自 Aurora EVM 的提款请求。
在Aurora上映射ERC20代币的模板合约中,我们可以在以下代码中看到这两个合约的触发:
在这两种情况下,ERC20 代币的逻辑看起来都很好,因为调用这些函数将首先烧掉 ERC20 代币,然后再继续调用特殊的内置合约。这就是将 ERC20 代币从 Aurora 提取到 NEAR 或以太坊的方法。以太坊呢?
我们仍然称这些特殊合约,但方式略有不同。我们只需将 ETH 发送到一个特殊的合约,该合约就会生成一个事件ExitToNear,记录此退出的发送者、目的地和金额。在ExitToNear合约执行结束时,exit_event_log返回包含事件信息。
下面是合约代码信息:
https://github.com/aurora-is-near/aurora-engine/blob/5c8691ea6ea5f1b309ef227f7f5c719ffea45d28/engine-precompiles/src/native.rs#L198
主执行完成后,这些日志以及执行期间的所有其他日志将filter_promises_from_logs在aurora-engine/engine/src/engine.rs中进行检查。
只要使用硬编码的地址生成日志ExitTo(Near|Ethereum)::ADDRESS,log.data就会将其作为新的承诺进行处理。
但是,只要调用原生合约的代码,就可以生成这些转账承诺。
在以太坊中,合约调用主要分为三种类型:
常规CALL、STATICCALL和DELEGATECALL。
我们不会处理,STATICCALL因为它在 Aurora 引擎中被明确禁止。
我们将深入研究另外两个。
当合约 ACALL通过调用 对合约 B进行 a 时foo(),函数执行依赖于合约 B 的存储,并将msg.sender设置为合约 A。
这是因为合约 A 调用了函数foo(),因此msg.sender将是合约 A 的地址,并且msg.value将是与该函数调用一起发送的 ETH。
在该函数调用期间对状态所做的更改只会影响合约 B。
但是,当使用 进行相同的调用时DELEGATECALL,该函数foo()将在合约 B 上调用,但在合约 A 的上下文中。这意味着将使用合约 B 的逻辑,但该函数所做的任何状态更改foo()都会影响存储合约 Amsg.sender将指向首先拨打电话的 EOA。在 Aurora 错误的情况下,重要的是msg.value指向第一个调用上下文,而不是第二个。
换句话说,以太坊不被发送delegatecall。(参见示例 2)。
知道我们可以生成从 Aurora 到 NEAR 的传输承诺,通过ExitToNear直接调用内置合约,我们可以DELEGATECALL用来欺骗 Aurora 引擎,使其认为我们实际上发送了 Ether。为什么会这样?因为代码只检查是否LOG由内置地址生成,并且假设msg.value > 0实际上意味着 ETH 已发送到该地址。
如果我们使用delegatecall()调用原生合约,msg.value会继承原来的调用上下文,但是 ETH 不再传递给原生合约。下面的智能合约就是这样做的。
它从调用者那里获取 ETH 值,触发ExitToNear合约中的退出事件,然后将 nETH 发送回调用者。nETH 可以通过 Aurora Bridge 再次存入 Aurora EVM,有效地使攻击者的原始余额翻倍。
步骤:
1.使用彩虹桥(Aurora Bridge)将以太币从以太坊桥接到极光
2.在 Aurora 上部署恶意合约,使其成为delegatecall原生合约,ExitToNear即0xe9217bc70b7ed1f598ddd3199e80b093fa71124f
3.调用恶意合约的exploit函数。此时,Aurora 被欺骗,从 Aurora 桥接合约向 NEAR 上的调用者发送 nETH。
4.攻击者的平衡在 Aurora 上没有改变 攻击者然后将 nETH 存回 Aurora,使攻击者的余额翻倍
5.从第 3 步开始重复。需要注意的是,这个错误会导致 NEAR 和 Aurora 运行时的复杂集成逻辑,如果没有来自 pwning.eth 的深入分析,这样的发现是不可能的。
如果给定的地址与输入的地址不匹配,现在将返回退出错误,这将禁用调用合约的能力,DELEGATECALL类似于 Aurora 禁用STATICCALL。
Aurora 开发了一个测试来确保跟踪该漏洞,以防万一逻辑更改可能导致它再次出现。
PS:最近朋友圈也有一位国内的大佬在Imm上提交了一枚智能合约漏洞,收获了11万美金的赏金收入(为保护隐私,我就不放朋友圈截图出来了)
如果大家觉得目前的渗透和安全行业太卷了,不如去研究研究区块链安全,指不定你也可以成为下一个牛逼的区块链黑客大佬!
推荐阅读:
实战 | 记一次1000美金的TikTok盲打XSS的漏洞挖掘
作者:pwning.eth
原文地址:点击阅读原文即可跳转
有HACK学习翻译整理,如需转载请注明来源