本体网络智能合约安全与漏洞分析:跨合约调用攻击

当前位置:首页 > 币圈百科 > 本体网络智能合约安全与漏洞分析:跨合约调用攻击

本体网络智能合约安全与漏洞分析:跨合约调用攻击

2022-12-06币圈百科223

上一期我们介绍了在本体上开发智能契约时可能存在的安全威胁,即跨契约调用攻击。对于如何防范这种智能合约漏洞攻击,相信大家都有一定的了解。本期将介绍在本体上开发智能合约时可能遇到的另一种安全威胁及相关防范措施。

image.png蓑衣网小编2022

在介绍这个安全威胁之前,我们先简单介绍一下在发块节点将交易打包形成块后,本体区块链中交易执行的过程和费用收取的方式。这个过程大致可以分为以下四个步骤:

1。区块通过协商一致进行验证和确认;

2。块中的事务在本地执行;

3。收取每笔交易的手续费,手续费不足则执行失败;

4。如果执行成功,则将执行的交易状态保存在本地账簿中;否则,已执行的事务状态将被丢弃。

可见,在分块过账过程中,分块执行交易先于收取交易手续费用。另外,我们都知道本体使用ONG作为交易费用,每笔交易至少收取0.01 ONG作为交易费用。这个block的过账流程和交易费用收取方式的正常执行逻辑没有问题,但是对于一些特殊情况,如果不注意智能合约的准备,可能会面临一个新的安全威胁:强制交易失败攻击。

强制交易失败攻击

本体区块链采用ONT和ONG双令牌体系,支持OEP-4、OEP-5、OEP-8等各种同质或非同质令牌。DApp通常使用代币作为流通代币,如ONG。如你所见,ONG不仅用作流通代币,也用作交易费。在这种特殊情况下,开发人员需要特别注意智能合约的开发,因为它可能会面临强制交易失败攻击。

我们举个简单的例子。有一个简单的dApp实时竞猜游戏,用户使用ONG参与竞猜并发送竞猜交易。如果用户赢得了竞猜,他将获得一定的ONG奖励,否则他将失去他的ONG。用户将为每次测验交易支付一定的ONG作为手续费。下面是这样一个智能合约代码片段:

def?猜(账号,ongAmount,号):'''?param?账号:用户地址?param?ongAmount:有多少ONG人参加了这个测验?param?数字:竞猜值:返回:'''?如果?CheckWitness(账户)?==?假:回归?假的?randomNumber?=?_ rollANumber()?如果?号码?=?randomNumber:require(_ transferONGFromContact(account,3*ongAmount))?#?如果?号码?=?randomNumber?那个?账号/玩家?威尔。输?全部?他的?钱?回归?True

在这个蓑衣网小编2022契约段中,使用_ rollANumber方法得到一个随机数。如果用户的猜测值等于这个随机数,他将获得三倍的收益。

根据本体区块链中区块的过账逻辑,先执行用户的竞猜交易,再收取用户竞猜交易的手续费。最后根据交易执行结果决定是否保存交易状态。在上面的例子中,一个恶意用户将使用他帐户中的所有ONG来参加测验。如果成功,他将获得奖励,并支付手续费。但是,如果用户在测验中失败,因为所有的ONG都参与了测验,并且没有足够的ONG作为处理费,则测验交易将失败,并且用户不会失去他的ONG。显然,恶意用户总是赢家。

防范强制交易失败攻击

智能合约开发者如何防范这种合约攻击?一个可行的方案是在合约调用开始时判断是否有足够的ONG作为手续费。在上面的示例代码中,智能合约开发者可以通过在合约中添加一定的限制来解决这个问题,即用户不能使用全部ONG进行猜测,留下足够的ONG作为手续费。

具体代码如下:

on address?=?bytearray(b ' \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x02 ')#?0.1?ONGMinInvokeFee?=?100000000def?猜(账号,ongAmount,号):'''?param?账号:用户地址?param?ongAmount:有多少ONG人参加了这个测验?param?数字:竞猜值?返回:'''?如果?CheckWitness(账户)?==?假:回归?假的?#?#===?避免?去哪?是吗?被袭击了?开始?===?米纳蒙特?=?ongAmount?MinInvokeFee?要求(_ avoidForceTxAbortAttack(account,minAmount))?#?#?===?避免?去哪?是吗?被袭击了?结束?===?randomNumber?=?_ rollANumber()?如果?号码?=?randomNumber:require(_ transferONGFromContact(account,3*ongAmount))?#?如果?号码?=?randomNumber?那个?账号/玩家?威尔。输?全部?他的?钱?回归?Truedef?_ 蓑衣网小编2022avoidForceTxAbortAttack(account,minAmount):param?=?状态(账户)?ongBalance?=?调用(0,ONGAddress,'的余额,param)?要求(ongBalance?MinAmount)returnTrue

可以看到,开发者在这个智能合约中加入了_avoidForceTxAbortAttack方法,用来判断用户是否有足够的ONG作为测验费和手续费。

在契约中,把这个方法放在执行逻辑的前面。如果用户账户中没有足够的ONG作为测验费和手续费,交易将无法直接执行。通过这种方式,智能合同开发人员可以防止恶意用户利用该漏洞攻击合同。

Postscript

上面我们解释了在本体上开发智能契约可能遇到的第二种安全威胁,并给出了相关的解决方案。我们将继续介绍其他智能合约安全威胁,让你知道如何在本体上开发更安全的智能合约。

本体智能合约开发者可以使用本体智能合约集成开发环境SmartX中深度集成的智能合约高度自动化形式化验证平台VaaS-ONT,“一键”精准定位风险代码位置,快速找出原因,有效验证智能合约或区块链应用的常规安全漏洞、安全属性和功能正确性,从而显著提升安全水平。

本体网络智能合约安全与漏洞分析:跨合约调用攻击 | 分享给朋友: