📢 대니월드 공식 홈페이지가 'TradingRoom'으로 변경되었습니다
모든 최신 시황과 교육 자료를 가장 빠르게 받는 방법!
지금 아래 버튼을 클릭해 이메일 구독을 완료해 주세요.
payable.transfer(), send()의 부적절한 사용
이스탄불 하드포크에서 EIP1884가 시행된 이후, SLOAD 작업의 가스 비용이 증가함으로써 일부 기존 스마트계약이 손상됨.
ETH를 수신자에게 전송할때, 솔리디티의 transfer() 또는 send() 매서드를 사용하는 경우 특정한 결함이 발생할 수 있는데, 특히 수신자가 스마트계약인 경우임.
이러한 결함으로 인해 ETH를 스마트계약 수신자에게 성공적으로 전송할 수 없게 될 수 있음.
구체적으로 스마트계약이 다음중 하나를 만족할때 전송은 반드시 실패함.
1 . 지불 가능한 fallback 함수를 구현하지 않은 경우.
- 지불 가능한 fallback 함수가 2300 이상의 가스 단위를 소비하는 경우
- 2300 이하의 가스단위를 소비하는 지불 가능한 fallback 함수를 구현하지만, 이 함수가 2300을 초과하는 호출을 발생시키는 프록시를 통해 호출되는 경우.
조치방안
Re-entrancy 가드와 함께 반환된 불리언을 확인하는 call을 사용하는 것이 권장됨.
코드취약부분

테스트소스
https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/payable-transfer.sol
테스트

참고문서
댓글