블로그 목록
보안2026년 3월 12일·8분 읽기

스마트컨트랙트는 왜 해킹당하나 — 역대 최대 사건들과 교훈

2016년 DAO 해킹, Poly Network, Ronin 브릿지까지 — 스마트컨트랙트의 주요 취약점과 수조 원이 사라진 해킹 사례들을 분석합니다.

#스마트컨트랙트#보안#해킹#DeFi#블록체인

"코드가 법이다" — 하지만 코드에 버그가 있다면

블록체인의 핵심 철학 중 하나는 **"코드가 법이다(Code is Law)"**다. 스마트컨트랙트는 중간자 없이 코드로 정해진 규칙을 자동 실행한다. 누구도 임의로 바꿀 수 없다.

하지만 이 철학은 양날의 검이다. 코드에 버그가 있으면, 그 버그를 악용하는 것도 "코드에 따른 실행"이 된다. 공격자는 계약을 위반한 게 아니다. 다만 코드가 의도하지 않은 방식으로 실행되도록 유도했을 뿐이다.

지금까지 스마트컨트랙트 해킹으로 사라진 자산은 누적 수십조 원에 달한다.

사건 1: DAO 해킹 (2016) — $6,000만

최초의 대형 스마트컨트랙트 해킹이자, 이더리움 역사를 바꾼 사건이다.

배경: The DAO는 2016년 이더리움 기반 탈중앙화 투자 펀드였다. 이더리움 역사상 최대 규모의 크라우드펀딩으로 당시 $1억 5천만 상당의 ETH를 모았다.

취약점: 재진입 공격(Reentrancy Attack)

코드를 단순화하면 이런 구조였다:

// 취약한 코드 (단순화)
function withdraw(uint amount) public {
    require(balance[msg.sender] >= amount);
    // 1. 먼저 돈을 보낸다
    msg.sender.call{value: amount}("");
    // 2. 그다음 잔액을 줄인다  ← 문제!
}

공격자는 자신의 컨트랙트에서 출금을 요청하고, ETH를 받는 순간 다시 출금 함수를 호출했다. 잔액이 아직 줄어들지 않았으니 또 출금이 가능했다. 이 과정을 수백 번 반복하며 $6,000만 상당의 ETH를 빼갔다.

결말: 이더리움 커뮤니티는 극단적 선택을 했다. 블록체인을 하드포크해서 해킹 이전 상태로 되돌렸다. "변경 불가능해야 한다"는 원칙을 스스로 어긴 것이다. 이에 반대한 사람들은 기존 체인을 유지했고, 이것이 **이더리움 클래식(ETC)**이 됐다.

사건 2: Poly Network (2021) — $6억 1,100만

단일 해킹으로는 역대 최대 규모였다.

Poly Network는 여러 블록체인 간 자산을 이동시키는 크로스체인 브릿지였다. 공격자는 컨트랙트 간 권한 검증 로직의 허점을 발견했다. 특정 함수를 호출하는 방식으로 자신의 주소를 관리자로 교체하고, 그 권한으로 자산을 모두 인출했다.

놀라운 반전이 있었다. 커뮤니티가 공격자에게 협상을 시도하고, 공격자는 "시스템의 취약점을 보여주고 싶었을 뿐"이라며 3일 만에 전액을 돌려줬다. 화이트햇 해커였을 가능성이 높다.

사건 3: Ronin 브릿지 (2022) — $6억 2,500만

Axie Infinity 게임의 사이드체인 Ronin의 브릿지에서 발생한 해킹이다.

Ronin 브릿지는 9개의 검증자 노드 중 5개의 서명이 있어야 출금이 가능한 멀티시그 구조였다. 공격자는 정교한 사회공학(소셜 엔지니어링) 공격으로 검증자 5개의 개인키를 획득했다.

흥미로운 점은 해킹 후 6일이 지나도록 아무도 몰랐다는 것이다. 한 유저가 출금을 시도하다 실패하고서야 발각됐다. 미국 재무부는 이후 이 해킹을 북한 해킹 그룹 Lazarus의 소행으로 공식 확인했다.

주요 취약점 유형

1. 재진입 공격 (Reentrancy)

외부 컨트랙트를 호출하는 도중 상태 업데이트가 완료되지 않은 틈을 노린다. DAO 해킹의 원인이었다.

방어책: 상태를 먼저 업데이트하고 외부 호출을 나중에 하는 "Checks-Effects-Interactions" 패턴 사용.

2. 정수 오버플로우/언더플로우

솔리디티 구버전에서 숫자가 최댓값을 넘으면 다시 0으로 돌아가는 버그.

uint8 x = 255;
x += 1; // x = 0 이 되어버린다 (Solidity 0.8 이전)

방어책: Solidity 0.8 이상 사용 (자동 오버플로우 체크), 또는 SafeMath 라이브러리 사용.

3. 플래시 론 공격 (Flash Loan Attack)

담보 없이 순간적으로 대규모 자금을 빌려 시세를 조작하고, 같은 트랜잭션 내에서 차익을 실현한 뒤 원금을 상환하는 공격.

2020년 bZx 프로토콜은 플래시 론으로 오라클 가격을 조작당해 수백만 달러를 잃었다.

4. 오라클 조작

스마트컨트랙트는 외부 가격 정보를 오라클에서 받는다. 단일 거래소 가격만 참조하는 오라클은 대규모 거래로 일시적으로 조작 가능하다.

5. 접근 제어 오류

관리자 권한 함수에 적절한 검증이 없을 때. Poly Network 해킹의 핵심 원인이었다.

왜 감사(Audit)를 받아도 해킹당하나

"이 프로젝트는 보안 감사를 받았다"는 말이 안전의 보증이 아닌 이유가 있다.

  1. 감사는 스냅샷이다. 감사 이후에 코드가 수정되거나 추가되면, 새 취약점이 생길 수 있다.
  2. 복잡성이 무기다. DeFi 프로토콜은 수십 개의 컨트랙트가 서로 상호작용한다. 개별 컨트랙트는 안전해도 조합에서 취약점이 나온다.
  3. 감사자도 사람이다. 감사 회사가 이 취약점을 놓쳤더라도, 공격자는 찾아낼 수 있다.

코드가 법이라면, 해킹도 합법인가

이것이 블록체인 커뮤니티가 아직도 씨름하는 철학적 질문이다.

2016년 DAO 해킹 당시, 공격자는 실제로 "나는 계약 코드가 허용하는 방식으로 작동했을 뿐이다"라고 주장했다. 기술적으로 맞는 말이었다.

하지만 이더리움 커뮤니티는 "의도"를 중심으로 판단했다. 설계자의 의도에 반하는 방식으로 자금을 빼간 것은 절도라고 보았다. 하드포크로 되돌리기로 합의했다.

이 사건은 블록체인이 "코드가 절대 법"인 순수한 기계가 아니라, 인간 커뮤니티의 합의에 의존한다는 것을 보여줬다.

스마트컨트랙트를 안전하게 쓰는 방법

일반 사용자 관점에서:

  1. TVL이 크고 오래된 프로토콜 우선 사용 — 오래 검증될수록 버그가 발견되고 수정된 확률이 높다
  2. 복수 보안 감사 여부 확인 — 한 곳이 아닌 여러 보안 회사의 감사를 받은 프로젝트
  3. 신규 프로토콜 출시 초반 큰 금액 투입 금지 — 첫 2~4주가 가장 위험하다
  4. Immunefi 같은 버그 바운티 프로그램 유무 확인 — 화이트햇 해커에게 보상을 주는 프로그램이 있으면 취약점 발견 시 공개 전 신고할 유인이 생긴다

스마트컨트랙트의 실행 원리와 보안 취약점을 직접 체험해보려면 보안 인터랙티브 모듈에서 재진입 공격과 플래시 론 시뮬레이션을 해볼 수 있습니다.

직접 체험해보고 싶다면?

ChainLearn의 인터랙티브 모듈로 개념을 직접 시뮬레이션해보세요.

학습 시작하기