CHE:一个案例说明高层属性形式化验证-ODAILY

验证软件功能介绍

01

Beosin-VaaS的业务逻辑验证软件,是一款用来检测智能合约上层业务逻辑漏洞的软件。

基于合约的白皮书,软件利用形式化方法,首先对单个函数进行属性的描述,在对单个函数进行属性的验证并通过后,基于这些已验证属性,抽取出高层的状态属性,进而对上层属性进行自动推理和验证,若属性不满足,则会返回一条反例路径。

案例介绍

02

我们可以以下面这个案例来举例说明。

声音 | 华夏时报总编辑:如果谁能用区块链做出比肩比特币的技术 也许就是下一个世界首富:据新浪财经报道,在第十二届中国经济媒体高层峰会上,华夏时报总编辑水皮表示,未来新技术的应用也许会出现我们意想不到的投资机会,那就是5G带来的区块链技术的应用,“区块链”三个字,由于局信息会上这么一堂课,又一次引起了全民的冲动。我们华夏时报前两年也干过两届区块链论坛,但这个东西技术上的确是有一定的难度,现象级的产品开发是需要过程的,到现在为止比特币是最成功的现象级的应用,有没有能跟比特币比肩的技术?如果谁能做出这个突破谁就牛大了,也许就是下一个中国首富、世界首富。[2019/12/1]

声音 | Coingeek创始人:交易所和运营平台勾结对加密行业是一个巨大打击:4月26日,Coingeek创始人Calvin Ayre,对Bitfinex被曝挪用Tether资金秘密弥补8.5亿美元损失事件发推称,“交易所和小规模运营平台勾结的丑闻对于加密行业是一个打击,我们现在需要把这些都清理干净。等到尘埃落定,将只有BCHSV这一个真正开放的公共平台留下。比特币缺乏实用性会变得毫无价值。”[2019/4/26]

这里我们考虑进行一次众筹,目标是在部署后deadline时间内,收集fundingGoal个以太币。如果在该期间收集到相应数额个以太币,则表明众筹成功,在这种情况下,受益人可以提取资金。否则,将认为众筹失败,并允许用户要求退款。众筹合约本身继承了token合约,并直接收集众筹期间投入的所有资金。

声音 | BK资本创始人:比特币的下一个目标将是6000美元:据CNBC消息,4月2日,BK资本创始人Brian Kelly在接受CNBC采访时表示,比特币的下一个目标将是6000美元。“市场情绪已发生改变。无论是基本面、技术面,还是我们所做的定量分析都表明,我们可能至少已经开始触底。”此外,其认为机构投资者是加密货币价格上涨的主要驱动力之一。[2019/4/3]

具体合约和函数说明

03

我们可以进一步得知,该项目包含了一个Crowdsale合约,继承一个token合约。

在众筹合约中,构造函数会初始化设置众筹的截止时间deadline,并添加众筹目标额度fundingGoal,并在合约中硬编码受益人的地址beneficiary;

声音 | 币安慈善基金负责人:区块链结合慈善是社会进步的一个必然产物:据币安创始人赵长鹏微博显示,现任联合国工业发展组织亲善大使,币安慈善基金负责人Helen Hai在谈到区块链结合慈善问题时表示,区块链结合慈善是社会进步的一个必然产物。区块链通过对传统慈善行业信任体系的重塑,将给慈善行业带来巨大变革。当被问及币安一亿基金如何进行慈善事业时,Helen Hai表示,币安基金定位于全球处在金字塔底部的人,将和更多国际机构合作推进慈善事业,并拿出一千万美元来打造透明的慈善平台,目前仍处于初期阶段。[2018/10/5]

然后会提供回调函数,提供给用户来参与投资,在开放众筹期间,只要未达到目标额度,就允许所有用户进行投资;

提供一个checkGoalReached()函数,如果达到众筹目标,或者达到了截止时间,就可以修改状态标识,关闭众筹;

然后会提供响应的transfer()和issue()函数接口,用于在众筹分配代币,以及能够进行代币的交易

提供一个safeWithdrawal()函数,如果众筹成功,受益人能够取出投资人的钱;

最后还提供一个safeClaimRefund()退款接口,如果众筹失败,用户可以通过该接口完成撤资。

结果分析和说明

04

我们这里已经完成了单个函数的属性验证,可以确认单个函数的功能是符合其属性规范的,在此基础上,编写上层属性进行验证。

以下,我们编写的上层属性有两条,一条是p1,含义是总是能够满足,一旦调用了safeWithdrawal()或者safeClaimRefund(),另一个函数就不能够被成功调用。

P1:

得到输出结果,可以看到属性2是满足的,而属性1并不满足。我们查看一下反例的可视化路径,可以看到,确实存在一条路径,safeWithdrawal()函数和safeClaimRefund()函数可以先后被执行成功。

回到合约中,根据所提供的反例路径,可以看到,发生该情况是调用回调函数一段时间后,当前时间超过了众筹的截止时间,众筹的资金总量没有达到目标fundingGoal,在checkGoalReached()关闭众筹之后,此时的合约状态,用户是可以调用safeClaimRefund选择退款的。

但是我们可以从结果中发现,此时依旧可以调用成功回调函数投资,那么就出现了后面的状态可能,在众筹失败之后,依旧有用户有意或者无意参与了投资,导致投资的总额超过了目标。

此时,能够再次调用checkGoalReached()函数结束众筹,改变状态标识,最终受益人能够在按原始需求,众筹失败的情况下,且有用户选择退款之后,依旧调用checkGoalReached()取出了所有的投资资金。

最终回到合约,我们发现,其实是由于用于投资的回调函数缺少了检查当前事件是否超过了截止日期,进而导致的合约漏洞。

可以看到,在该例子中,所有的函数其实是满足其自身的属性并实现了相应的功能的,但是由于在合约之间、函数之间的调用和关联关系,才导致出现了这样一个漏洞。而该属性验证工具的作用也在于此,它能够更加高效地发现逻辑属性漏洞。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:15ms0-0:999ms