현재 알려진 보안 취약점과 이를 방지하기 위한 베스트 프랙티스 및 패턴을 아래에 정리하고, 각각에 대한 레퍼런스를 첨부해 보았다.


1. 재진입 공격 (Reentrancy Attack)
• 설명: 외부 컨트랙트 호출 중 상태 변경이 완료되지 않은 상태에서 다시 호출되어 의도치 않은 상태 변경이 발생할 수 있음.
• 예시 취약점: The DAO Hack
• 방지 방법:
   (1) 상태 변경 후 외부 호출 수행 (Checks-Effects-Interactions 패턴).
   (2) pull-payment 패턴 사용.
   (3) ReentrancyGuard 모듈 활용 (OpenZeppelin).

• 레퍼런스:
   • Solidity Documentation - Reentrancy
   • OpenZeppelin ReentrancyGuard

  
2. 민감한 함수 접근 제어
• 설명: 접근 제어가 제대로 설정되지 않아 중요한 함수가 누구에게나 호출될 수 있음.
• 방지 방법:
   1. onlyOwner, require(msg.sender == owner) 등의 접근 제어 추가.
   2. OpenZeppelin의 Ownable 사용.

• 레퍼런스:
   • Solidity Documentation - Access Control
   • OpenZeppelin Ownable
  

3. 정수 오버플로우 및 언더플로우
• 설명: 정수 계산에서 오버플로우나 언더플로우가 발생하여 값이 예상치 못한 결과로 변경됨.
• 방지 방법:
   1. Solidity 0.8 이상에서는 기본적으로 체크되므로 최신 버전 사용.
   2. SafeMath 라이브러리 사용 (Solidity 0.8 미만에서).

• 레퍼런스:
   • Solidity Arithmetic Overflow
   • OpenZeppelin SafeMath
  

4. 타임스탬프 의존성
• 설명: 블록 타임스탬프는 조작 가능하므로 의사 난수 생성이나 중요한 논리에 사용하면 위험.
• 방지 방법:
   1. 의사 난수 생성 시 블록 해시와 같은 추가 입력값 사용.
   2. 타임스탬프를 의존하지 않도록 설계.

• 레퍼런스:
   • Solidity Time Dependency

  
5. 불충분한 예외 처리
• 설명: Solidity의 assert와 require는 예외 처리 방식을 다르게 적용. 제대로 관리하지 않으면 오류가 발생할 수 있음.
• 방지 방법:
   1. 사용자 입력 검증 시 require 사용.
   2. 논리적 불변성 체크 시 assert 사용.

• 레퍼런스:
   • Solidity Error Handling
  

6. Denial of Service (DoS)
• 설명: 특정 조건에서 컨트랙트의 기능을 멈추게 하거나 일부 사용자가 서비스를 이용하지 못하도록 방해.
• 방지 방법:
   1. 고정된 가스 비용 연산 회피.
   2. 반복문 사용을 최소화.
   3. 외부 호출 시 실패를 적절히 처리.

• 레퍼런스:
   • Ethereum DoS Attacks

 
7. Delegatecall 취약점
• 설명: delegatecall 사용 시 호출되는 코드가 호출자의 컨텍스트를 공유, 악성 코드를 실행 가능.
• 방지 방법:
   1. 신뢰할 수 있는 컨트랙트만 delegatecall 사용.
   2. 논리 컨트랙트를 변경 가능하면 보안 점검 필요.

• 레퍼런스:
   • Solidity Delegatecall

  

8. Front-running 공격
• 설명: 네트워크 상에서 트랜잭션이 확인되기 전에 공격자가 높은 가스비를 지불하여 우선 실행.
• 방지 방법:
   1. commit-reveal 패턴 사용.
   2. 민감한 데이터를 직접 공개하지 않도록 설계.

• 레퍼런스:
   • Ethereum Front-Running


9. 불충분한 난수 생성
• 설명: 단순 난수 생성이 예측 가능하여 공격에 취약.
• 방지 방법:
   1. 난수 생성 시 외부 오라클(예: Chainlink VRF) 사용.

• 레퍼런스:
Chainlink VRF
  

10. 불완전한 Self-Destruct
• 설명: 컨트랙트를 삭제해도 잔여 자금이 악의적으로 전송될 수 있음.
• 방지 방법:
   1. 삭제 전에 자금 반환 로직 구현.
   2. selfdestruct 호출 시 신뢰할 수 있는 주소 지정.

• 레퍼런스:
   • Solidity Selfdestruct

  

11. 취약한 토큰 설계
• 설명: ERC20 또는 ERC721 설계 시 잘못된 이벤트 정의나 상태 변경 누락.
• 방지 방법:
   1. OpenZeppelin 라이브러리 사용.
   2. 표준 인터페이스 준수.

• 레퍼런스:
   • OpenZeppelin ERC Standards

  

+ Recent posts