Smart Contract 취약점 [9] Short Address Attack

Short Address Attack

불리는 다른 형태 or 관련있는 공격

  • off-chain issues
  • client vulnerabilities

해당 취약점은, 입력값을 제대로 검증하지 않아서 발생하는 취약점이라고 생각할 수 있다.

 

간단한 예를 들어보자.

내 지갑 address : 0xaabbcc00

요청할 amount : 0x10  (amount는 uint256이기 때문에 0x00000010으로 인식)

 

그런데, 나의 address를 입력할 때 0xaabbcc만 입력하고 transfer 함수를 호출했다고 가정하자.

 

그렇다면, transfer 함수 내에서는 아래와 같은 과정을 통해 transaction이 만들어진다.

signature = web3.sha3("transfer(address,uint256)").slice(0,10) 
=> 0xa9059cbb
arg1 = aabbcc
arg2 = 00000010

Transaction = a9059cbbaabbcc00000010

 

여기서 이상한 점이 하나 있다. 원래 signature은 4byte, arg1은 4byte, arg2도 4byte여서 Transaction의 길이는 12byte 여야 하는데, 위에서 만들어진 Transaction 11byte이다.

이런 경우, EVM 내부에서 자동 Padding 처리가 생겨서 뒤에 '00'이 더 붙게 된다.

Transaction = a9059cbbaabbcc0000001000

그렇게 되면, 거래소 내부에서 이를 통해 얻는 정보는 아래와 같다.

signature = 0xa9059cbb
arg1(address) = 0xaabbcc00
arg2(amount) = 0x00001000

결국, 0x10이라는 amount를 이용해서 0x100배 많은 0x1000이라는 amount를 받는 것이 가능해진다.

 

거래소에서는, 이런 일이 발생하지 않도록 입력받는 인자의 길이, 특히 address의 길이는 반드시 확인하여야 한다.

 

참고

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

https://wrkholic84.github.io/SmartContractVulnerabilitiesBasic2/

  Comments,     Trackbacks