[마스터링 이더리움] 스마트 컨트랙트 보안 - 패턴13 생성자 이름

in #busy5 years ago

생성자 관리

  • 최근 솔리디티는 컨트랙트 이름으로 생성자를 생성하지 않는다. 컨트랙트 이름과 생성자 이름을 다르게 한 경우, 그 함수는 그냥 보통 함수가 되어 호출가능하게 된다.

취약점

  • 이전 버전의 솔리디티로 컨트랙트 구현할 때, 컨트랙트 이름과 생성자 이름을 다르게 쓰기 쉽다.
  • OwnerWallet 컨트랙트
1 contract OwnerWallet {
2   address public owner;
3
4   // constructor
5   function ownerWallet(address _owner) public {
6     owner = _owner;
7   }
8
9   // Fallback. Collect ether.
10  function () payable {}
11
12  function withdraw() public {
13    require(msg.sender == owner);
14    msg.sender.transfer(this.balance);
15  }
16 }
  • 위 코드는 컨트랙트 이름과 생성자 이름이 다르다! 첫글자가 소문자이다.
  • 특히 위 생성자라고 생각되는 함수에서 매우 중요하게 입력 파라미터로 owner를 설정한다!
  • 이 함수를 호출하는 누구든지 이 컨트랙트의 오너가 될 수 있는 위험에 있다!

예방기법

  • 솔리디티 0.4.22부터 생성자는 constructor라는 키워드를 사용한다.
  • 생성자이름을 컨트랙트 이름과 동일하게 사용하지 말라!

Coin Marketplace

STEEM 0.31
TRX 0.11
JST 0.034
BTC 65139.82
ETH 3206.69
USDT 1.00
SBD 4.16