在Solidity定点库上进行差异模糊测试

《Differential Fuzzing On Solidity Fixed-Point Libraries》

来源:0xNorman

介绍

安全是编写智能合约的最重要的方面之一。开发人员可能熟悉传统的单元测试来测试他们的代码,但这只提供了基本的覆盖范围来测试代码的功能和业务逻辑。然而,它们是在假设智能合约在给定条件下的表现符合预期的基础上运行的。为了进一步增强安全性,我们需要采用更高级的测试方法,如差异模糊测试(differential fuzzing)。 

差异模糊测试是一种测试类型,它涉及执行相同功能或函数的不同实现,并比较结果。这种测试允许我们验证不同实现之间是否是等价的,并且在提供无效或随机输入时表现一致。这与普通模糊测试不同,后者通常通过为单个实现提供广泛的随机输入范围并监控意外行为、崩溃或安全漏洞来进行测试。 

在这个项目中,我们使用 Foundry 对不同的定点库(OpenZeppelinSolmateSolady 和 Prbmath)进行差异模糊测试。请注意,在 Solmate 库的几个主要版本中,我们使用了最新的(v6)的代码库,因为我们认为大多数选择 Solmate 库的新项目会选择这个版本。我们希望检查不同代码库对于相同的函数实现是否有显著差异。在跑了一千万次测试后,我们发现这些库之间具有广泛的兼容性,但是在处理边缘情况和燃气费消耗方面存在一些差异。

具体差异

我们将通过以下示例来说明这些库实现上的差异。

在 Log2 函数(返回以 2 为底的对数)中,如果输入为 0,OpenZeppelin 和 Solady 的实现会返回不同的结果。OpenZeppelin 将直接返回 0,而 Solady 将返回 0x5be3aa5c(即 Log2Undefined() 的签名)。

因此,我们在测试用例中添加 if (num != 0) 来避免这种差异。

在 mulDiv() 函数中也出现了类似的差异。我们需要确保除数不为零且没有溢出。否则,OZ 和 solady 会报错。例如,Solady 将返回 0xad251c27,这是 MulDivFailed() 的签名,所以我们也添加了 if 语句。

如果你想要在测试中重现错误情况,请注释掉 if 语句,然后使用特定测试用例。

并请参考库实现来了解为什么他们会这样处理。

Gas 报告

由于这些库中的函数大多相互兼容,我们对它们的燃气费消耗进行了比较,来检测哪一个数据库是最省燃气费的。

燃气费快照可以在.gas-snapshot 文件中找到。为了更好的阅读性,我们附上了简化的燃气费报告(每个函数调用的平均燃气费消耗)。

在Solidity定点库上进行差异模糊测试

或者你可以运行这个命令来获取它。

在Solidity定点库上进行差异模糊测试

我们发现 OpenZeppelin 的燃气费消耗要远高于其他代码库的函数。特别是,像 OzLog2、OzLog2Up、OzMulDivDown、OzMulDivUp 和 OzSqrt 这样的函数消耗的燃气费比其他库中的对应函数更多。

在其余的库中,solady 是燃气费最优的一个。

solady 库中所有比较的函数的燃气费消耗相对较低,而且它提供了最全面的功能,这使得它成为高级开发人员的首选。但是,值得注意的是,只有 OpenZeppelin 和 Solmate 经过了外部安全团队的审计。

即使是 Solmate 也并不是设计之初就简单易用的,所以在你搬起石头砸了自己的脚之前,应该彻底阅读文档并理解代码库。

好消息是,Cantina 决定将 Solady 库作为公共项目进行审计,你可以在这里监控他们的审计状态。

足够的模糊测试 

为了确保模糊测试的正确性,我们进行了 9999999 次的模糊测试。通常,在开发过程中没有必要运行这么多次,但作为安全研究人员,我们希望覆盖尽可能多的随机输入。

你可以在 [foundry.toml]中更改运行次数。更多的运行次数意味着有更多的随机输入输入到函数中。如果你想要运行快速测试,例如用于持续集成,请根据你的需求调整配置。 

建立在我们的基础上 

在庞大的 Solidity 库中,定点算术只是其中一个方面。为了扩大这项研究的范围,我们可以比较处理不同功能的库,使用不同的 pragma 版本。这将为我们提供跨不同用例和 Solidity 版本的安全的更广泛理解。

此外,我们还可以记录 Foundry 使用的随机输入并进行分析。这将使我们能够判断这些输入是否真的随机,并确保对库进行公平和全面的评估。

结论 

 我们进行差异模糊测试的主要目的是揭示 OpenZeppelin、Solmate、Solady 和 PRB-Math 的 Solidity 定点库在输出结果方面的显著差异。虽然这些库在兼容性方面表现良好,但我们的测试发现它们在处理边缘情况时存在细微差别,尤其是在 Log2 和 mulDiv 函数中。

虽然这些差异可能看似微小,但它们可能导致智能合约出现意外行为,因此具有重要意义。

通过这项工作,我们希望为开发人员提供详细的见解,以指导他们在为智能合约应用程序选择库时做出决策。我们的研究没有发现这些库之间存在重大偏差。

然而,我们观察到的细微差异提醒人们充分测试和理解所使用代码的重要性。

区块链世界里,代码就是法律,确保代码的安全性至关重要。对 Solidity 库进行差异模糊测试是实现这一目标的一步,它提供了比单元测试更高级别的保证。我们期待看到一个更安全的加密生态。

原文链接

文章来源于互联网:在Solidity定点库上进行差异模糊测试

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策井自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场

上一篇 2023年7月1日 下午3:40
下一篇 2023年7月2日 上午1:42

相关推荐

  • Lendle:基于Mantle的借贷协议如何改变DeFi借贷体验?

    撰稿:Luccy,Bitbili 编辑:Jaleel,Bitbili 与传统的 TadeFi 不同,DeFi 借贷有着费用较低,透明度高,以及更容易获取的优势。然而,潜在的高波动性和智能合约错误或黑客攻击等风险往往给用户带来糟糕借贷体验。在 DeFi 世界中,没有可以借用的「信用」,因为人们可以很轻松销毁信用,换到另一个钱包上,因此大多数借贷协议都基于超额抵…

    2023年9月2日
  • SignalPlus宏观研报:Nvidia市值超加密货币总市值,DeFi TVL跌至较低水平

    《SignalPlus 宏观研报 (20230825)》 来源:SignalPlus 華語 最近各类风险资产延续调整势头,BTC,美股,A 股久违地走出强相关性。而各大风险资产对应的期权曲面则各自表现出不同的特征,数字货币期权曲面依旧在历史低位。而美股 VIX 和 A 股 IV 则呈现波动率曲面中枢上移的走势。期权波动率曲面是反应流动性去向的一大指标,不同风…

    2023年8月25日
  • 找到Solana真正优于Ethereum的核心

    编者按:据数据显示,Solana 代币 SOL 近一个月以来涨幅近 60%,无论 Solana 上有空投信息刺激的 LSD 协议,还是地板价悄然翻倍的 NFT 市场,Solana 在这轮小牛行情中走出了不俗的发展态势。于是,Solana「以太坊杀手」的称号又被搬出来讨论,社区博主_gabrielShapir0发表了一篇长推,讨论了以太坊和 Solana 之间…

    2023年12月4日
  • OKX Ventures:拥抱一切市场,RWA如何帮助DeFi吞噬世界

    本文内容由 OKX Ventures 研究员 Sally Gu 提供,不构成任何投资参考。引用请注明来源,转载请联系 OKX Ventures 团队。 引言 Primer 疫情影响加上鲍威尔接手耶伦后美联储接连降息,使得过去几年市场在高通胀低实际利率的情况下达到二战以来金融资产最大的泡沫阶段。但中美贸易战、俄乌对峙及欧洲民粹势力的抬头从根本上已经开始瓦解过去…

    2023年7月14日
  • IOSG创始人参会心得:项目方和VC都快没钱了,Token2049成为最后的融资希望

    《IOSG 创始人参会心得:项目方和 VC 都快没钱了,Token 2049 成为最后的融资希望》 作者:Jocy,IOSG 创始人 这个行业的规模仍然在进一步的增长,今年我已经参加了 ETHDenver/ETHCC/黑山 Zuzalu/Edcon 等不同的活动,这次 2049 仍然遇到非常多的老朋友,其实每一次这样的大会在行业里都会吸引非常多的参会者,很多…

    2023年9月19日
返回顶部