Smart Contract 취약점 [4] Unchecked Return Values For Low Level Calls

Smart Contract에는 몇몇 Low Level 함수들이 존재한다.

  • call
  • callcode
  • delegatecall
  • send

 

만약 위의 함수들을 실행하는 과정에서 오류가 발생하면 어떻게 될까?

다른 행위 없이, 그저 False를 반환한다고 한다.

그렇기 때문에 Low Level 함수들의 반환 값을 확인하지 않는다면, Bug를 유발할 수도 있다.

 

예시 코드를 살펴보자

function withdraw(uint256 _amount) public {
	require(balances[msg.sender] >= _amount);
	balances[msg.sender] -= _amount;
	etherLeft -= _amount;
	msg.sender.send(_amount);
}

위 코드를 보면, Contract 내부 전체 ether를 etherLeft라는 전역변수로 관리함을 알 수 있다.

이 때, msg.sender.send(_amount)가 정상적으로 수행이 안되면서 False를 반환하게 되는 상황을 가정해보자.

ex) payable fallback 함수가 없는 경우

 

그렇다면 send는 제대로 이루어지지 않겠지만, etherLeft 값은 계속되어 줄어들게 된다. 

결과적으로, etherLeft 변수의 값이 이상하게 세팅되며, 이는 곧 다른 Bug로 이어질 수 있다.


즉, 개발자들은 반드시 low level 함수들의 반환값을 확인해야하며, 만약 False를 반환할 시 Contract에 이상이 생기지 않도록 복원하는 코드를 구현해야 한다.

 


참조

https://dasp.co/#item-4

  Comments,     Trackbacks