2023年 12月 27日

一白帽黑客因披露SUI高危漏洞而获了5万美元的赏金

羊财神(yangcaishen.com)博客,2023年9月,一位名为F4lt的安全研究人员通过HackenProof披露了Sui的Bug Bounty计划的一个高危漏洞。该漏洞可能会导致攻击者破坏Sui区块链的验证器节点,从而造成相当大的破坏。因此:Sui团队发现问题后及时处理并解决,成功修复后,漏洞猎人获得了50,000美元的SUI代币赏金。

漏洞分析
正如 Sui文档中提到的,Sui 中的基本存储单位是对象。与许多其他存储以包含键值存储的帐户为中心的区块链相比,Sui 的存储以可通过唯一 ID 在链上寻址的对象为中心。智能合约是一个对象(称为 Sui Move 包),这些智能合约操作 Sui 网络上的对象:
Sui Move Package:一组 Sui Move 字节码模块。每个模块都有一个在包含的包中唯一的名称。包的链上 ID 和模块名称的组合唯一标识了该模块。当您向 Sui 发布智能合约时,包是发布的单位。发布包对象后,它是不可变的,并且永远无法更改或删除。包对象可以依赖于先前发布到 Sui 的其他包对象。

Sui Move 对象:由 Sui Move 包中的特定 Sui Move 模块管理的类型化数据。每个对象值都是一个结构体,其中的字段可以包含基本类型(例如整数和地址)、其他对象和非对象结构体。
发现的拒绝服务 (DoS) 漏洞可能允许攻击者通过专门设计的 CompiledModule 持续禁用整个网络。
攻击者可以通过以下步骤来实施此漏洞,总费用为 50 Sui:
攻击者在区块链上发布恶意的 CompiledModule,其中包含大约 1KB 的有效负载。
攻击者在已发布的模块中执行入口函数,最大gas费用为50隋。
执行该入口函数会导致Validator/Full Node上的内存消耗急剧增加。这种内存使用量激增持续大约 10 分钟,直到触发内存不足 (OOM) 异常。在此期间,节点无法处理新事务。
更有趣的是该问题的递归行为。测试证实验证器节点在重新启动后仍然无法处理新交易,这表明验证器网络受到持续损坏。
但它是如何运作的呢?
概念验证
为了重现该问题,我们设置了验证器节点(1 个完整节点和 4 个验证器,包括一个恶意验证器)

之后,我们需要发布一个恶意模块。
使用下一个模块创建一个新文件 poc.move:

保存该文件并发布它。使用sui clientpublish发布包,确保为gas-budget标志设置适当的值。控制台以发布的详细信息进行响应。

发布后,您将获得发布的$moduleID。
调用入口函数
为此,请使用sui 客户端调用以及上一步中的$moduleID和适当的Gas 预算

攻击者可能设计了一个能够绕过所有 Sui 检查并成功发布的模块。发布后,攻击者可以调用该模块内的函数。

该模块包含可能消耗大量内存的运行时对象。如 PoC 中所示,Struct0包含 32 个字段,每个字段都是一个向量。类似地,Struct1包含 32 个字段,每个字段都是一个Struct0。构造Struct1时,vector重复出现 32^2 次。在所有结构的构建过程中都会复制这种模式,从而导致大量的运行时内存占用。由于这些结构的嵌套结构,这种内存扩展呈指数级增长。因此,不需要创建大量结构来成功执行攻击。

为了确保构造在执行期间保持在最大 Gas 费的范围内,白帽发现可以通过将字段类型指定为长度为零的向量来实现。

当函数执行接近完成时,验证器触发了内存不足 (OOM) 情况。在这种情况下,如果验证器决定重新启动,该函数将重新执行,并且这种重复执行将继续触发 OOM 条件。因此,这种情况导致验证器进入重启和 OOM 事件的永久循环,从而导致节点完全关闭。
补救措施
为了进行正确的修复,Sui 团队更新了计算值大小的方式,以包含分配向量所涉及的元数据。