카테고리 없음

솔리디티 로우레벨 취약점

알파세 2018. 7. 17. 14:24




해당 컨트랙트에 Deposit 함수를 사용하여 계약 주소를

충전한 후 send()를 사용하여 계약 주소를 전송합니다


여기서 전송결과는 false라는 사실을 확인 할 수 있다.


즉 악의적인 컨트랙트로 이러한 기능을 보낼때 수신자가 컨트랙트이므로 계약서에 

폴백 기능이 있어야 한다.

그러한 기능이 없는 경우 컨트랙트는 정기적인 거래를 통해 ether를 받을 수 없다 


폴백기능

이더를 수신하려면 fallback 기능을 표시행헌더,

payable 

없다 


Contracts that receive Ether directly (without a function call, i.e. using send or transfer) but do not define a fallback function throw an exception, sending back the Ether (this was different before Solidity v0.4.0). So if you want your contract to receive Ether, you have to implement a fallback function.

경고 - 

ether를 직접 받는 (즉 함수 호출없이 send 또는 transfer을 사용하는 ) fallback 함수를 정의하지 않고 ether를 받는 계약은 계약서에 ether를 받기 위해선 대체 기능을 만들어야한다 .






여기서 반환체크가 수행되지 않으므로 

다음 줄의 코드가 계속 되고

최종 금액은 이전되지 않았으나 잔액이 차감되게 됩니다.



취약점 방어 방법 -

또는 취약한 함수 send를 사용하지 않고 

transfer 함수를 통하여 롤백시킨다 .