재진입 공격 (Reentrancy Attack)
쉽게 풀면
은행 창구에서 출금을 요청했는데, 직원이 돈을 건네주는 도중에 장부에 아직 출금 기록을 남기지 않은 틈을 타 같은 요청을 계속 반복해서 여러 번 돈을 받아가는 상황을 상상하면 됩니다. 스마트 계약에서는 "돈을 보내는 동작"과 "잔액을 줄이는 동작"의 순서가 잘못 짜여 있으면, 돈을 보내는 순간 공격자의 계약이 다시 같은 함수를 호출해 잔액이 줄기 전에 반복 인출을 시도할 수 있습니다. 이렇게 함수가 끝나기 전에 자기 자신을 다시 불러들이는 특성 때문에 '재진입'이라는 이름이 붙었습니다.
왜 중요한가
블록체인 보안 연구에서 재진입 공격은 실제 대규모 자금 탈취 사고로 이어진 사례가 알려지면서 스마트 계약 취약점 분석의 대표 사례로 다뤄집니다. 코드 실행 순서와 상태 갱신 시점이라는 프로그래밍의 기본 원칙이 자금 손실로 직결될 수 있다는 점에서, 정적 분석 도구와 코드 검증 방법론 연구의 주요 동기가 되고 있습니다.
논문에서는 이렇게 쓰입니다
코드를 직접 실행하지 않고도 재진입 취약점을 미리 찾아내는 도구를 개발한 연구입니다.
상태 갱신 순서를 지키지 않은 코드가 얼마나 흔한지를 조사한 내용입니다.
조금 더 깊게 보면
대표적인 방어 원칙으로 '체크-이펙트-인터랙션(Checks-Effects-Interactions)' 패턴이 있는데, 이는 조건을 확인하고 내부 상태를 먼저 갱신한 뒤에야 외부 호출을 하도록 코드 순서를 재구성하는 방식입니다. 또한 함수 실행 중 재진입 자체를 막는 잠금 장치(reentrancy guard)를 코드에 추가하는 방법도 널리 쓰입니다. 단일 함수뿐 아니라 여러 함수나 여러 계약에 걸쳐 발생하는 교차 함수·교차 계약 재진입도 연구 대상으로 다뤄집니다.
주의할 점
재진입 공격은 블록체인 자체의 결함이 아니라 개별 스마트 계약 코드의 설계 오류에서 비롯되는 것이므로, 특정 플랫폼을 쓴다고 자동으로 방지되는 것이 아니라 개발자의 코드 작성 방식이 핵심입니다.