핵심 인사이트 (3줄 요약)
- 본질: 스마트 컨트랙트는 배포 후 수정이 어렵고 코드가 공개되므로, 작은 구현 실수가 자산 손실로 바로 이어진다.
- 가치: 재진입, 정수 오버플로우/언더플로우, 프론트 러닝은 상태 갱신 순서와 공개 정보 악용에서 생기는 대표 취약점이다.
- 판단 포인트: 외부 호출 전에 상태를 먼저 바꾸고, 연산 경계를 막고, 거래 노출을 줄이는 설계가 필수다.
Ⅰ. 개요 및 필요성
스마트 컨트랙트는 중앙 서버처럼 쉽게 패치할 수 없다. 한 번 배포되면 블록체인 위에서 자동으로 실행되므로, 논리 오류가 곧바로 실제 자산 손실로 이어진다.
또한 코드와 거래가 공개되기 때문에 공격자는 충분한 시간을 갖고 취약점을 분석한다. 그래서 일반 웹 서비스보다 더 엄격한 보안 설계와 사전 감사가 필요하다.
- 📢 섹션 요약 비유: 스마트 컨트랙트는 모두가 들여다볼 수 있는 자동판매기라, 버튼 하나만 잘못 달아도 돈이 새어나간다.
Ⅱ. 재진입 공격의 원리
재진입 공격은 외부 호출이 먼저 일어나고 상태 갱신이 뒤따를 때 발생한다. 공격자는 송금 직후 다시 같은 함수를 호출해, 아직 바뀌지 않은 잔액을 여러 번 인출한다.
withdraw()
├─ 외부 송금
│ └─ 공격자 fallback()
│ └─ withdraw() 재호출
└─ 잔액 차감(늦음)
핵심은 "상태 변경 → 외부 호출" 순서를 거꾸로 쓰면 안 된다는 점이다. 따라서 Checks-Effects-Interactions (CEI) 패턴을 지켜야 한다.
- 📢 섹션 요약 비유: 계산대에서 돈을 먼저 건네고 장부를 나중에 쓰면, 손님이 같은 물건 값을 두 번 받아 가는 셈이다.
Ⅲ. 정수 오버플로우/언더플로우와 권한 문제
구형 Solidity (Solidity 0.8 이전 버전)에서는 정수 범위를 넘는 연산이 자동으로 안전하지 않았다. 값이 최대치를 넘으면 다시 0 근처로 돌아가거나, 0 아래로 내려가며 큰 수처럼 보일 수 있었다.
이 문제는 단순한 수학 오류처럼 보이지만, 잔액 계산·수량 계산·권한 검증에서 치명적이다. 현재는 컴파일러가 기본 방어를 제공하지만, 범위 검증과 테스트는 여전히 필요하다.
권한 탈취도 함께 봐야 한다. onlyOwner 같은 접근 제어가 약하면, 공격자는 취약한 함수 호출만으로 관리자 기능을 획득할 수 있다.
- 📢 섹션 요약 비유: 계산기 숫자판이 한 바퀴 돌아가면 0원이 갑자기 거액이 되는 것처럼, 숫자 경계는 문 잠금장치다.
Ⅳ. 프론트 러닝과 공개 정보 악용
블록체인 거래는 확정되기 전에 대기열에 노출된다. 공격자는 이 대기열을 보고 수수료를 더 높게 넣어 앞순서로 끼어들 수 있다. 이를 프론트 러닝이라고 한다.
이 문제는 특히 가격이 바뀌는 거래, 민팅, 청산, 대량 주문에서 심하다. 방어 방법으로는 슬리피지 허용치 제한, 커밋-리빌(commit-reveal) 방식, 사전 공개를 줄이는 설계가 있다.
사용자 주문 → 멤풀 공개 → 공격자 선점 → 가격 변동 → 사용자 손해
- 📢 섹션 요약 비유: 운동회 줄서기 명단을 미리 본 사람이 맨 앞에 끼어드는 것과 같다.
Ⅴ. 실무 방어 패턴과 감사 기준
방어는 한 가지 수단으로 끝나지 않는다. 먼저 상태 갱신 순서를 바르게 하고, 이어서 재진입 방지 장치와 접근 제어를 넣고, 마지막으로 테스트와 감사로 검증해야 한다.
실무에서는 다음을 우선 확인한다.
- 외부 호출 전에 상태를 먼저 갱신했는가
- 재진입 방지 장치가 있는가
- 수학 연산의 경계값을 검사하는가
- 관리자 함수에 강한 접근 제어가 있는가
- 멤풀 노출이 큰 기능에 추가 완화책이 있는가
감사는 코드 리뷰만이 아니라 시뮬레이션과 단위 테스트까지 포함한다. 배포 후 수정이 어렵기 때문에, 배포 전 검증의 밀도가 곧 보안 수준이다.
- 📢 섹션 요약 비유: 튼튼한 금고는 문 하나가 아니라, 잠금장치·경보·관리 규칙이 함께 있어야 한다.
관련 개념 맵
공개 코드 / 불변성
↓
재진입 / 정수 오류 / 프론트 러닝
↓
상태 순서 / 연산 경계 / 거래 공개성
↓
CEI / 접근 제어 / 슬리피지 제한 / 감사
관련 키워드 및 발전 흐름도
- The DAO 해킹 사건 → 재진입 위험이 널리 알려짐
- Solidity 0.8 이전 → 오버플로우/언더플로우 방어 미흡
- SafeMath와 입력 검증 → 산술 오류 방어 관행 확산
- Checks-Effects-Interactions (CEI)와 ReentrancyGuard → 상태 기반 방어 강화
- MEV (Maximal Extractable Value)와 프론트 러닝 대응 → 거래 공개성 완화 필요
어린이를 위한 3줄 비유 설명
스마트 컨트랙트는 버튼을 누르면 자동으로 움직이는 로봇 상자예요.
그런데 상자 문을 닫기 전에 또 손이 들어오면, 같은 간식을 두 번 꺼내 갈 수 있어요.
그래서 먼저 문을 잠그고, 그다음에 밖으로 내보내야 해요.