1. 외부컨트랙트와 interaction 간 취약성
1-1) 내부로직취약성
Reentrancy, DelegateCall
=> 취약성을 모르고 배포한 컨트랙트는 악의적인 외부의 컨트랙트를 호출하고 이는 악의적인 Fallback Function을invoking하거나 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) 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 |