🔑 코인 투자 추천 링크 🔑
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
테스트
참고문서
댓글