apr
智能合同安全审核

我们的客户是业务流程数字化领域的领先软件制造商和服务提供商。他们正在研究一种创新的区块链解决方案,使贸易合同和发票能够高效地集成到区块中。有了这个解决方案,他们的最终用户将能够安全地存储所有数据和文档,并公开透明地直接与所有业务合作伙伴联系。

为了为该项目筹集资金,我们的客户将在Ethereum网络上引入智能合同。这些合同旨在薄荷并销售新的加密货币,因此我们的客户希望避免其源代码中的任何可能的安全问题。

Apriorit专家被分配到智能合同的安全审计,并提供关于代码优化和改进的建议。

当我们收到这些合同时,它们还处于开发阶段。在这个阶段要求对智能合约进行独立审计是一个很好的做法,因为一旦它们被部署到区块链网络,它们的代码就会变得不可变。

工作范围

我们的客户给了我们四个智能合约。所有这些契约都是用solid编写的,并且基于OpenZeppelin库。

只有两个智能合约将部署到以太坊网络。第一次是铸造硬币,第二次是众卖。众卖合同的功能在两个辅助合同中实现。此外,众卖合同旨在允许代币所有者在接受任何加密货币支付或作为奖金后手动发行代币。

经过初步研究,我们同意进行以下测试和分析,作为全面审计的一部分:

  • 智能合约行为一致性分析
  • 测试覆盖分析
  • 渗透测试:针对我们的漏洞数据库进行检查,并模拟对合同的手动攻击
  • 静态分析
  • 手动代码审查和代码质量评估
  • GAS使用量分析
  • 关于主机网络的合约分析

我们使用Truffle测试框架和Siverity Compiler 0.4.25进行了审计。

相关服务

188abc金博宝

行为一致性和测试覆盖率分析

为了执行安全审计,我们要求客户为他们的智能合约提供一张白色或黄色的纸。我们的客户对这个要求感到非常惊讶,因为之前没有人提出分析他们的合同逻辑和预期行为。然而,我们总是这样做,以确保在ICO或任何隐藏函数期间没有意外行为。

白皮书可以帮助审计师理解智能合约的初始期望是什么。

不幸的是,我们的客户无法提供一份智能合约规范的白皮书。然而,我们的专家设法重建了最初的要求,并将它们与合同的实际行为进行了比较。要做到这一点,我们必须依赖源代码、单元测试和源代码存储库中可用的注释。

我们分析了每个合同功能的行为,以查看它们是否符合最初的预期。结果显示,在合同中没有意外或潜在的恶意行为的迹象,他们的行为没有不一致的迹象。

所提供的单元测试对智能合约的覆盖是充分的,但还不完整。我们发现单元测试没有问题,因为所有重要的功能都被覆盖了。代码的暴露部分大多是未使用的函数或在某些情况下的负面情况。我们向客户解释了为什么单元测试不能覆盖代码的这些部分以及如何处理它们。

还读:
内部安全审计清单增加产品质量

渗透测试

渗透测试(或笔测试)是我们的强项之一。它使我们能够为客户提供可靠和全面的安全报告。我们对这个项目的笔测试包括根据我们的漏洞数据库检查合同,并对合同执行手动攻击。

由于笔测试,我们的团队没有发现智能合同的关键问题,但我们发现了两个需要减轻的漏洞:

  • 部署期间失去所有权

在将代币合同部署到网络后,其所有权将转移到代币众卖合同。众卖完成后,原硬币合同的所有者需要获得某种功能来停止铸造新硬币,但这是不可能的,因为失去了所有权。因此,铸造代币将永远被允许。为了避免这种情况,我们建议我们的客户添加一个函数,允许返回硬币智能合约的所有权。

  • 短地址攻击漏洞

如果交易参数包含的字节少于必要的字节,以太坊虚拟机将自动添加零字节。黑客可以很容易地利用这个漏洞,跳过交易参数末尾的零,让用户发送更多令牌。为了保护硬币和众卖智能合约,我们建议我们的客户端在引用脆弱函数时在前端处理参数检查。

静态分析

我们使用我们的分析工具对合同进行了静态分析。我们对智能契约的全部范围执行了自动化的静态分析,包括来自OpenZeppelin库的基础契约。这确保了继承的函数不会引入任何漏洞。

我们的团队证实,OpenZepelin库非常适合本申请,因为没有发现任何关键问题。但是,我们仍然向我们的客户提出了关于如何处理小错误的建议。

代码评论

我们的专家对智能合约进行了代码审查。在分析结果后,我们向客户提供了以下建议:

1.避免使用已弃用的构造函数定义

硬币智能合同将其构造函数定义为具有与合同相同的函数。这种方法被弃用并潜在危险,因为它允许任何人执行构造函数,这通常包含关键代码,例如用于设置合同所有者。

2.使用一致的代码风格

在整个智能合约中,代码风格有点不一致。这使得代码更难理解和支持。干净一致的代码风格也会让合同看起来更专业。

3.避免留下注释代码

在代码中留下注释会使智能合约更难阅读和理解。在我们的例子中,我们建议我们的客户端从OpenZeppelin中删除智能合约的不必要部分,这是这些合约的基础。

4.避免未使用的代码和不必要的继承

Crowdsale合同的继承层次反映了原始OpenZeppelin实现的层次结构。但是,在特定蜂窝的定制实现的情况下,很少需要多级继承。在我们的客户的情况下,基本合同的代码仅使用一次,因此两个辅助智能合同没有真正需要。Crowdsale的功能很容易适合单一智能合同。

5.使用固定版本的稳定性编译器

使用固定的编译器版本被认为是最佳实践。如果不固定,则可能在部署期间使用与开发期间使用的不同的编译器版本。这可能会由于更新版本的编译器中的更改而导致意外错误和可能的漏洞。这也使得契约更难以重用,因为不同的开发人员可能有不同版本的编译器。

6.更新编译器版本

Solidity编译器正在不断地被改进。当契约正在积极开发时,使用最新稳定版本的编译器是很重要的。新版本的编译器有重要的安全更新,并有助于避免过时的实践。

7.增加直接从合同账户检索Ether的可能性

我们采取了充分的措施,以确保合同中任何Ether都不会在正常使用时卡住。但支付功能并不是将Ether交付到合同账户的唯一方式。这并不存在与此相关的安全漏洞,但同样的,以太将永远被卡住。添加一个通用功能,允许检索受信任帐户中的任何被卡住的Ether,这种情况并不少见。

GAS使用量分析

我们的Apriorit专家建议如何减少硬币分配期间的气体消耗。特别是,我们发现可以通过以下方式实现天然气节省:

  • 通过限制事件的数量。这将大大减少GAS的使用买卖众卖合同的功能。在客户端实施过程中,触发了三个事件:众卖合同的TokenPurchase事件和代币合同的Transfer and Mint事件。一个事件就足以通知客户成功购买。
  • 通过分批发送硬币。这将为每个投资者节省额外的基础交易成本GAS。但是,这种方法需要限制批大小,以避免在单个批中意外添加太多客户时拒绝服务。

相关服务

188abc金博宝

关于主机网络的智能合约分析

我们还分析了与以太坊网络相关的智能合约。众所周知,以太坊现在很容易受到拒绝服务攻击,所以一些智能合约可能会受到这种攻击。幸运的是,我们的专家透露,我们客户的智能合约没有时间限制,也没有其他依赖于网络状态的易变功能。

最终结果和建议

我们的审计结果显示了我们客户的智能合同没有关键问题。但是,我们建议我们的客户对合同代码进行一些优化和改进。

我们客户的团队分析并实施了我们的所有建议,现在已经完全准备好将他们的智能合约部署到以太坊网络。

虽然我们的客户对我们进行了合同行为分析,但我们认为这是安全测试的重要组成部分。安全审核的整体成功取决于以下内容:

  • 及时执行安全测试,因为在部署契约之后,不能实现任何代码更改
  • 合同白皮书的可用性因此审计人员可以验证智能合约中没有意外行为
  • 只有进行所有提到的测试和分析可以确保测试结果的完整性

在开发智能合约时,雇佣独立的渗透测试人员是常见的做法。Apriorit的测试人员对智能合约的内部流程以及整个区块链网络都有很好的理解,所以他们能够发现智能合约代码中最不明显的缺陷,这些缺陷在开发阶段是很微妙的。此外,我们的审核员提供了关于如何提高代码质量和效率的有用建议。

跟我们说说你的项目
向我们发送提案请求!我们将通过详细信息和估算回复您。

浏览
点击发送时,您会同意处理数据

预订探索性呼叫

请不要为我们提供任何特定的任务,但我们的技能似乎有趣?

获得一个快速的Apriorit介绍,更好地了解我们的团队能力。

联系我们

  • + 1 202-780-9339
  • (电子邮件保护)
  • 美国DE Wilmington Silverside Road 3524 Suite 35B邮编:19810-4929
  • D-U-N-S号码:117063762
Baidu