区块链 智能合约安全 对关键状态变量的意外更改

Posted 软件工程小施同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链 智能合约安全 对关键状态变量的意外更改相关的知识,希望对你有一定的参考价值。

合约有状态变量,其中一些可以在合约创建时由创建者实例化,这些在之后是不能更改的,而那些在创建合约时没有实例化的内容可以在之后修改。

由于这些变量可以在之后更改,因此如果该变量对合约的安全性至关重要,那么则需要采取适当的谨慎措施。

以下合约模仿了一个发生在名为Parity的多重签名钱包上的攻击,攻击者盗取了3100万美元。

请注意,实际的攻击涉及的内容要更广泛,但这个简化版的实例展示了它的核心内容。

合约有一个owner,它不是在创建时实例化的,而是在后来通过函数initowner()进行的。

在实例化后,owner可以调用transferTo()并将合约中指定的_amount转给特定的_recipient。

contract UnsafeContract2{

    /* Define the contract owner*/

    address owner;


    /* This function sets the owner of the contract */

    function initowner(address _owner) { 
        owner = _owner; 
    }

    
    /* Function to transfer the funds in the contract */

    function transferTo(uint _amount, address _recipient) {

        if (msg.sender == owner)

            _recipient.transfer(_amount);

    }

}

显然,owner是一个关键的状态变量,应该以适当的方式实例化。

不幸的是, initowner()函数允许任何包括恶意的用户调用,并将owner设置为他选择的任何地址。一旦owner被设置,owner就有可能盗取资金并将其转给任何收款方recipient()。

实例3:终止合约

我们来扩展一下前面的实例,一旦设置了关键变量owner,攻击者就可能调用除transferTo()之外的函数。例如,如果合约为owner提供了一个接口来终止合约,那么整个代码可能会与其他任何状态变量一起被删除。

contract UnsafeContract3{

/* Define the contract owner*/

address owner;

/* This function sets the owner of the contract */

function initowner(address _owner) { owner = _owner; }

/* Function to destroy the contract */

function kill() { if (msg.sender == owner) suicide(owner); }

}

类似的攻击最近发生在Parity上,结果攻击者(或很有可能是一个好奇的新手,信息来源:https://blog.springrole.com/parity-multi-sig-wallets-funds-frozen-explained-768ac072763c?gi=c41592bf2d43)冻结了大约1.5亿美元。



作者:Zilliqa爱好者中文社区
链接:https://www.jianshu.com/p/5379e44280f5
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于区块链 智能合约安全 对关键状态变量的意外更改的主要内容,如果未能解决你的问题,请参考以下文章

区块链BaaS云服务(21)腾讯CCGP”安全沙箱“

简述如何实现区块链中的JVM

区块链 智能合约安全 重入攻击(re-entrancy attack)DAO incident

区块链:Hyperledger Fabric智能合约(链码)

区块链:Hyperledger Fabric智能合约(链码)

[区块链安全-Ethernaut]区块链智能合约安全实战-连载中