导语:此博客文章介绍了由Blaze Information Security执行的智能合约的安全审计结果,并代表客户Jury.Online公布细节。
介绍
此博客文章介绍了由Blaze Information Security执行的智能合约的安全审计结果,并代表客户Jury.Online公布细节。这篇文章包含了2018年3月底发布的报告中的相同信息和结果。
审计由Victor Farias(项目负责人)和Blaze Information Security的Julio Fort执行。
免责声明:本文介绍了审计范围内智能合约的安全审计结果。作为一个有时间限制的练习,不能保证智能合约中没有其他安全问题。审计结果不应被视为投资建议。
报告
本文介绍了审计团队为Jury.Online的智能合约所做的安全审计的结果。这种参与旨在验证智能合约是否只执行了预期要做的事情,并发现在合约部署到区块链网络之前可能对项目产生负面影响的安全漏洞。
Jury.Online旨在创建一个平台,以促进不同方之间的交易。该平台将自己置于交易中间并作为托管服务工作; 它调解给定的交易,如果所有各方都对交易的结果感到满意,则交易成功。作为托管服务,它还可以调解交易双方之间的争议。
Jury.Online提供法官,仲裁员和争议解决协议各方之间的互动。它使用基于以太坊ERC20的令牌,合约是用Solidity编写的。有关Jury.Online的详细信息,请参阅白皮书。
本次的安全分析侧重于发现与代码实现相关的漏洞、由架构和设计错误所引起的问题、以及文档和代码之间的不一致。
对于不符合以太坊令牌标准或合约规范的每一个代码模式,以及评估期间发现的编码最佳实践与漏洞产生的偏差,Blaze Information Security团队将对风险进行评级,从而得出风险等级,并在有可能的情况下验证漏洞的存在并利用漏洞。
评估的主要目标如下:
· 确定智能合约中存在的主要安全相关问题
· 评估项目中存在的安全编码实践的级别
· 获取每个漏洞的证据,并在可能的情况下利用可用的漏洞
· 以清晰易复制的方式记录用于复制问题的所有程序
· 为分析中发现的每个缺陷推荐缓解因子和修复方案
· 基于现实威胁模型为实际风险情景提供背景信息
执行摘要
参与计划在6个工作日内完成,包括撰写报告。智能合约安全审计于05/03/2018开始,于18/03/2018结束,完成了本报告的初步版本。
在23/03/2018,Blaze Information Security报告的所有调查结果均由Jury.Online做了相应修改。这些问题不再出现在合约代码中,并在提交 3f5f707cfeec36e174702b46be0c8f6850e6a12b 中得到修复。
审计是在自动化工具的帮助下完成的,并进行了人工审计。在此评估中未检查生成的EVM代码。
在此次约定的审计合约中只发现了一个小问题。该问题被认为不会给合约带来直接的安全风险,但应被视为改善其安全性并使其面向未来的建议。
对范围内合约的审计没有发现可能导致token丢失,陪审团偏见的问题,也没有发现可能对Jury.Online的预期运作产生重大影响的问题。
Jury.Online有防御性安全编码模式,并遵循许多推荐的Solidity编程良好实践。整体而言,代码质量被认为非常好,因为代码很清晰,注释写的很好且易于理解。
审计范围
此安全审计的范围包括以Solidity编写的智能合约。
· 项目名称:juryonline
· 提交:986aca6ca9c666a34632e4e0ed10d2c78d1fa245
文件名/代码行
ERC20Token.sol / 237 JuryOnlineExchanger.sol / 28 JuryOnlineICOContract.sol / 204 JuryOnlineInvestContract.sol / 226 Migrations.sol / 23 Pullable.sol / 38
审计的代码是开源的,可以在https://github.com/juryonline/contracts/tree/playground (Playground分支)找到
智能合约安全审计方法论
我们以安全为导向的智能合约审计遵循有组织的方法,旨在从有动力,技术能力和持久性的对手的角度确定合约范围内最大数量的漏洞。
特别关注智能合约的关键领域,例如令牌的燃烧和多签名的运作。我们的流程还研究了导致诸如可重入性,算术溢出和下溢,与燃料相关的拒绝服务等问题的其他常见实现问题。
Blaze的智能合约审计方法涉及自动和手动审计技术。使用诸如linters,程序分析器和源代码安全扫描程序之类的工具对应用程序进行一轮动态分析。
合约的源代码手动检查安全漏洞。这种类型的分析能够检测自动扫描器和静态分析器遗漏的问题,因为它可以发现边缘情况和业务逻辑相关的问题。
技术摘要
智能合约的描述
· ERC20Token.sol:与ERC20标准令牌签订合约,使用SafeMath和approve_fixed等安全增强功能进行修改,后者的创建是为了防止可能导致双重撤销的众所周知的ERC20竞争条件。
· JuryOnlineICOContract.sol:负责筹集资金。该合约定义了每个里程碑的资金目标以及项目花费的总工作量和持续时间。
· JuryOnlineInvestContract.sol:该合约负责管理各方之间潜在的利益纠纷。例如,在本合约中,投资者可以针对项目里程碑向开发商提起争议案件,并由陪审员投票决定是否
为项目的继续分配资源和资金。
· Pullable.sol:此合约具有InvestContract中用于进行异步转账的辅助方法。
漏洞
1.部分合约中没有算术下溢和溢出检查
· 受影响的点:JuryOnlineICOContract.sol和JuryOnlineInvestContract.sol已
在提交3f5f707cfeec36e174702b46be0c8f6850e6a12b中修复
· 严重性:低
在审计期间,我们发现合约实施了一系列有关数学运算的措施,以防止并有效的减轻uint32变量的算术下溢和溢出。
但是,Blaze Information Security注意到JuryOnlineICOContract.sol和JuryOnlineInvestContract.sol中的合约的某些部分没有应用这些对策,使得在这些合约中执行数学运算的变量和函数可能容易受到这种攻击。
下面的代码说明了没有SafeMath或其他函数和库来防止算术溢出和下溢:
尽管在此评估期间没有发现使用下溢或溢出的可行开发方案的证据,但是为了使这种攻击无法进行,提前实施缓解是很重要的,即使它们在代码中以某种方式被发现或者由角落案件触发。
参考文献
· https://ethereumdev.io/safemath-protect-overflows
· https://openzeppelin.org/api/docs/math_SafeMath.html
修复方案
· 作为一般的良好实践并且与项目中已经存在的相同安全对策总体一致,建议将在合约的其他部分中实施的相同缓解应用于上述Solidity文件。
· 考虑使用OpenZeppelin的SafeMath,因为它是最受欢迎的库,具有增强的安全数学运算安全性检查。然而,据了解,在合约中增加这些算术保障措施可能会增加其燃料使用量。
结论
安全评估的最终目标是提供修复建议,以更好的说明企业或组织的风险,并帮助其理解并验证其安全态势,以应对其业务的潜在威胁。
考虑到这一点,Blaze Information Security提供了以下建议,我们认为这些建议应作为进一步增强智能合约安全状况的后续措施:
· 解决报告中提出的所有问题,并考虑备注部分中的意见;
· 执行另一轮审计以验证修复;
· 考虑建立一个bug赏金计划,因为它在智能合约和区块链领域的公司中变得越来越普遍。