스마트컨트랙트 보안
스마트컨트랙트 보안의 중요성
스마트컨트랙트는 한 번 배포되면 수정이 어렵고, 버그는 직접적인 자금 손실로 이어진다. "코드가 법"이라는 원칙은 실수도 법이 된다는 의미다.
현실:
- 2022년 디파이 해킹 피해: $3B+
- 상위 해킹의 대부분이 스마트컨트랙트 취약점
- 감사받은 프로토콜도 해킹됨
주요 취약점 유형
1. 재진입 공격 (Reentrancy)
설명: 외부 호출 중 상태 업데이트 전에 같은 함수가 다시 호출됨.
메커니즘:
1. 공격자가 출금 요청
2. 컨트랙트가 ETH 전송 (외부 호출)
3. 공격자의 receive()에서 다시 출금 요청
4. 잔액이 아직 업데이트되지 않아 다시 출금 성공
5. 반복
역사적 사례:
- The DAO Hack (2016): $60M, 이더리움 하드포크 원인
방어:
- ReentrancyGuard 사용
- 체크-효과-상호작용 패턴
- 상태 업데이트 후 외부 호출
2. 정수 오버플로우/언더플로우
설명: 숫자가 최대/최소값을 넘어 의도치 않은 값이 됨.
예시:
uint8 balance = 255;
balance = balance + 1; // 오버플로우 → 0
방어:
- Solidity 0.8.0+: 자동 검사
- SafeMath 라이브러리 (이전 버전)
3. 접근 제어 오류
설명: 민감한 함수에 대한 권한 검사 누락.
예시:
- 관리자 전용 함수를 누구나 호출 가능
- 초기화 함수 재호출 가능
방어:
- onlyOwner, onlyAdmin 수정자
- Role-based 접근 제어
4. 오라클 조작
설명: 가격 오라클을 조작하여 부당한 이익.
메커니즘:
- 플래시 론으로 대량 자금 확보
- DEX에서 대규모 스왑 → 가격 왜곡
- 왜곡된 가격으로 다른 프로토콜에서 유리한 거래
- 원상 복구
사례:
- Harvest Finance: $34M
- Cream Finance: $130M
방어:
- TWAP (시간 가중 평균 가격)
- Chainlink 등 외부 오라클
- 가격 변동 한도
5. 프론트러닝
설명: 멤풀에서 대기 중인 트랜잭션을 보고 먼저 실행.
유형:
- 샌드위치 공격
- 청산 프론트러닝
- 차익거래 프론트러닝
방어:
- 슬리피지 설정
- Flashbots 등 프라이빗 멤풀
- 커밋-리빌 스킴
6. 로직 오류
설명: 코드가 의도대로 동작하지 않음.
예시:
- 조건문 오류
- 계산 실수
- 엣지 케이스 미처리
사례:
- Compound 버그 (2021): $80M 잘못 분배
방어:
- 철저한 테스트
- 형식 검증
- 다중 감사
7. 플래시 론 공격
설명: 플래시 론을 활용한 복합 공격.
활용:
- 오라클 조작
- 거버넌스 공격
- 차익거래 악용
방어:
- 스냅샷 기반 투표
- 단일 블록 가격 의존 회피
- 속도 제한
8. 서명 관련 취약점
설명: 서명 검증 오류, 리플레이 공격.
사례:
- Wormhole: 서명 검증 우회로 $320M 손실
방어:
- EIP-712 구조화 서명
- 논스(Nonce) 사용
- 체인 ID 포함
감사 (Audit)
감사란
보안 전문가가 스마트컨트랙트 코드를 검토하여 취약점을 찾는 과정.
주요 감사 기관
| 기관 | 특징 |
|---|---|
| Trail of Bits | 최고 수준, 비용 높음 |
| OpenZeppelin | 업계 표준, 다수 경험 |
| Consensys Diligence | 이더리움 전문 |
| Certik | 빠른 감사, 논란 있음 |
| Halborn | 비교적 신규 |
| Spearbit | 분산 감사 네트워크 |
감사 과정
- 범위 정의: 어떤 컨트랙트 검토할지
- 자동 분석: 정적 분석 도구 실행
- 수동 검토: 전문가 코드 리뷰
- 결과 보고: 취약점 및 권고사항
- 수정 및 재검토: 문제 수정 후 확인
감사 보고서 읽기
심각도 분류:
- Critical: 자금 손실 가능, 즉시 수정
- High: 심각한 기능 문제
- Medium: 잠재적 문제
- Low: 경미한 이슈
- Informational: 개선 권고
확인 사항:
- 모든 Critical/High 이슈 해결됨
- 감사 범위와 실제 배포 코드 일치
- 감사 시점과 현재 코드 일치
감사의 한계
감사를 받았어도 해킹될 수 있다:
| 프로토콜 | 감사 여부 | 피해 |
|---|---|---|
| Wormhole | ✅ | $320M |
| Ronin | ✅ | $625M |
| Nomad | ✅ | $190M |
이유:
- 100% 보장 아님
- 업그레이드 후 새 취약점
- 비즈니스 로직 오류
- 복합 프로토콜 상호작용
보안 확인 방법
1. 감사 확인
확인 사항:
- 최소 1개 이상의 감사
- 신뢰할 수 있는 감사 기관
- 감사 보고서 공개
- Critical/High 이슈 해결
- 현재 코드와 감사 코드 일치
2. 코드 검증
Etherscan 확인:
- 코드가 검증(Verified)되었는지
- 프록시 컨트랙트의 경우 구현 컨트랙트도
소스 확인:
- GitHub에 코드 공개
- 배포 코드와 일치
3. TVL과 운영 기간
린디 효과:
- 오래 운영될수록 안전할 확률 높음
- 많은 자금이 묶일수록 검증된 것
기준:
- TVL $100M+: 비교적 안전
- 운영 1년+: 검증 기간 충분
- 단, 과거 성공이 미래 보장은 아님
4. 버그 바운티
확인:
- 버그 바운티 프로그램 운영 여부
- 보상 규모 (자금 규모에 비례해야)
- Immunefi 등 플랫폼 활용
5. 업그레이드 가능성
불변 컨트랙트:
- 업그레이드 불가
- 새 취약점 도입 불가
- 버그 수정도 불가
업그레이드 가능:
- 프록시 패턴 사용
- 관리자가 로직 변경 가능
- 편리하지만 리스크
확인:
- 프록시 컨트랙트인지
- 관리자 권한은 누구에게
- 타임락 있는지
6. 관리자 권한
확인 사항:
- 관리자 함수 목록
- 멀티시그 여부
- 타임락 기간
위험 신호:
- 단일 EOA 관리자
- 무한 토큰 발행 권한
- 긴급 탈출 함수 (관리자만)
도구와 리소스
분석 도구
- Slither: 정적 분석
- Mythril: 상징적 실행
- Echidna: 퍼징 테스트
- Tenderly: 시뮬레이션
모니터링
- Forta: 실시간 위협 감지
- Blocknative: 멤풀 모니터링
- OpenZeppelin Defender: 자동 대응
리소스
- SWC Registry: 취약점 분류
- Rekt.news: 해킹 사례 분석
- Immunefi: 버그 바운티
사용자 관점 체크리스트
프로토콜 참여 전
- 감사 보고서 확인
- 코드 검증 확인 (Etherscan)
- TVL과 운영 기간 확인
- 관리자 권한 확인
- 버그 바운티 여부
- 커뮤니티 평판
트랜잭션 시
- 올바른 컨트랙트 주소
- 승인(Approval) 금액 확인
- 트랜잭션 내용 이해
- 시뮬레이션 (가능하면)
지속적
- 프로토콜 뉴스 팔로우
- 업그레이드 공지 확인
- 이상 징후 모니터링
정리
스마트컨트랙트 보안은 디파이의 핵심 리스크로, 재진입 공격, 오라클 조작, 접근 제어 오류 등 다양한 취약점이 있다. 감사는 필수지만 100% 안전을 보장하지 않으며, 감사받은 프로토콜도 해킹된 사례가 많다. 사용자는 감사 보고서 확인, 코드 검증, TVL/운영 기간, 관리자 권한, 버그 바운티 등을 종합적으로 검토해야 한다. 불변 컨트랙트가 업그레이드 가능한 것보다 안전한 측면이 있지만, 버그 수정도 불가능하다는 트레이드오프가 있다.
다음 글: 디파이 보험 - 리스크 전가의 방법