BlockChain

Solidity 취약점 #7

부산대보금자리 2022. 1. 19. 18:11

1. 외부컨트랙트와 interaction 간 취약성 

1-1) 내부로직취약성

Reentrancy, DelegateCall

=> 취약성을 모르고 배포한 컨트랙트는 악의적인 외부의 컨트랙트를 호출하고 이는 악의적인 Fallback Functioninvoking하거나 delegate Call활용하여 공격을 시도한다. 

 

1-2) 컨트랙트 호출 기반 진행 취약성

(Frozen Ether), Dos by external contract, Require violation

=> 외부 컨트랙트 호출을 기반 코드가 진행된다. 호출 컨트랙트가 제대로 코드 진행을 못하고 그러한 값을 반환하면 코드 진행 자체가 멈출수 있다.(=Require)

 

2. 미흡한 유효성 검증 취약성

2-1) 입력 검증 취약성

Short address, Dos costly patterns and loops(1), Integer Over/under flow, signature replay

=> 대표적으로 외부로부터 매개변수를 입력 값으로 받아 사용할 해당 값이 취약하며 이러한 값의 검증이 올바르게 이루어지지 않을 발생한다.

2-2) 리턴 값검증취약성

unchecked external Call(=send, etc return value)

=> 메소드 또는 호출에 대한 리턴 값 제대로 검증하지 않을 발생할 있는 취약점이다

 

2-3) exception validation(=disorder)( = 내부예외검증취약성) 

 

3. 부적절한 인증 인가

using tx.origin, unprotected self destruct(+= strict balance equality)

=> tx.origin 원래 호출을 보낸 계정을 나타내므로 이를 활용한 소유자의 인증,인가는 악의적인 실행이 가능하며 이러한 부적절한 인증으로 self_destruct문이 진행되면 컨트랙트가 파괴될 있다.

 

 

 

4. 부적절한 코드 사용

Generating randomness(= timestamp, block hash), Unsafe type inference(=type cast)

=> 난수생성을 timestamp,block hash활용한다면 채굴자에 의해 유추가능하며 type cast  기존 값을 의도치 않게 바꾸거나 오용의 여지가 있다.

 

* 2021.12.21 Grim Finance Hack

 

 

공격에 사용된 코드 발췌

해당 코드는 before-after 패턴으로 입금,전후의 balance 조회하여 차이만큼의 토큰을 제공해주는 것으로 보인다.

deposit이 일어날때 연속해서 여러번의 deposit 들어온다고 하면

1st deposit amount = 10, 2nd deposit amount = 10

 

1st before = 0

1st transfer(10)

                           2nd before = 10

                           2nd transfer(10)

1st after = 20

                           2nd after = 20

같은 경우가 발생할 있고 구해진 만큼이 반영되므로 공격이 이루어 있다.

Reentrancy guard + privilege 제한(토큰 선택

 

단순한 call 인해 생긴다기 보다 토큰을 활용함에 따라서 토큰을 업데이트 하기 전에 공격이 발생

 

 

  1. 재진입 공격의 위험 제외 패턴

1) CallValueInvocation : function내의 call.value invocation 유무를 체크

2) balanceDeduction : call.value로 송금전에 로직을 미리 수정을 하는지 체크

3) zeroParameter: call.value에서 parameter가 0인지 체크

4) ModifierContrain : onlyOwner 같은 modifier 체크하는지 판단한다.

 

2. Delegate Call

1) DelegateInvocation : Delegate Call 있는지 체크

2) Ownerinvocation : delegate call caller가 owner인지 체크한다.

 

'BlockChain' 카테고리의 다른 글

최근 Re-enterancy양상  (0) 2022.01.21
Solidity re-enterancy  (0) 2022.01.20
Solidity 취약점 #6  (0) 2022.01.18
Solidity 취약점 #5  (0) 2022.01.17
Solidity 취약점 #4  (0) 2022.01.14