재진입 공격은 스마트 계약이 외부 호출을 수행할 때, 해당 호출이 원래 함수를 다시 호출하여 상태 변경 전에 반복 실행되는 공격입니다.
동작 원리:
방어: Checks-Effects-Interactions 패턴 적용 또는 ReentrancyGuard 사용
스마트 계약 함수 작성 시 권장되는 안전한 코딩 패턴입니다:
정수 오버플로우는 최대값을 초과하면 0으로, 언더플로우는 0 미만이면 최대값으로 돌아가는 현상입니다.
예시: uint8의 최대값은 255이며, 255 + 1 = 0이 됩니다.
Solidity 0.8.0부터 기본적으로 오버플로우/언더플로우 시 revert가 발생합니다. 0.7.x 이하에서는 SafeMath 라이브러리를 사용해야 합니다.
블록체인의 멤풀(mempool)에서 미확인 트랜잭션을 관찰하고, 높은 가스비를 지불하여 해당 트랜잭션보다 먼저 처리되게 하는 공격입니다.
대표적 유형:
방어: Commit-Reveal 스킴, Flashbots, 시간 지연 메커니즘
call과 transfer의 보안 차이는?▼transfer와 send는 2300 gas만 전달하여 재진입을 방지하지만, EIP-1884 이후 일부 상황에서 실패할 수 있습니다.
call은 모든 가용 가스를 전달하므로 재진입에 취약하지만, 현재 권장되는 방식입니다. 대신 CEI 패턴이나 ReentrancyGuard와 함께 사용해야 합니다.
네트워크 전체 해시파워(PoW) 또는 스테이킹 양(PoS)의 과반수를 장악하여 블록체인의 합의를 조작하는 공격입니다.
가능한 공격:
불가능한 것: 다른 사용자의 코인 탈취, 블록 보상 변경, 과거 블록 수정(깊은 재조직은 비용이 기하급수적으로 증가)
배경: 2016년 이더리움 위에 구축된 투자 펀드(약 1.5억 달러 규모)
공격: 재진입 취약점을 이용해 약 360만 ETH 탈취
대응:
특정 노드의 모든 네트워크 연결을 장악하여, 해당 노드가 공격자가 제공하는 정보만 받도록 격리하는 공격입니다.
피해 노드는 조작된 블록체인 데이터를 받게 되어 이중 지불 공격의 대상이 될 수 있습니다. P2P 네트워크의 피어 연결 다양성 확보가 중요합니다.
공격자가 다수의 가짜 신원(노드)을 생성하여 네트워크의 영향력을 부당하게 획득하는 공격입니다.
블록체인에서는 PoW(해시파워 필요), PoS(스테이킹 필요) 등의 합의 메커니즘이 시빌 공격에 대한 기본적인 방어를 제공합니다.
프로젝트 규모와 복잡도에 따라 크게 달라집니다:
주요 감사 기관: Trail of Bits, OpenZeppelin, ConsenSys Diligence, CertiK 등
자동화 도구만으로는 모든 취약점을 발견할 수 없으므로 수동 감사와 병행해야 합니다.
WIA-SEC-006은 블록체인 시스템의 보안 요구사항을 정의하는 국제 표준입니다.
주요 영역:
프로젝트가 외부 보안 연구자에게 취약점 발견 시 보상을 지급하는 프로그램입니다.
Immunefi 등의 플랫폼에서 DeFi 프로젝트의 버그 바운티가 활발하게 운영되며, 심각한 취약점의 경우 수백만 달러의 보상이 지급되기도 합니다.
수학적 증명을 통해 스마트 계약이 사양(specification)을 만족하는지 검증하는 방법입니다.
일반적인 테스트가 특정 입력에 대한 결과만 확인하는 반면, 형식 검증은 모든 가능한 입력에 대한 정확성을 증명합니다. 비용과 시간이 많이 들지만, 높은 보안이 요구되는 금융 계약에 적용됩니다.
업그레이드 가능한 스마트 계약을 위한 프록시 패턴에는 몇 가지 보안 위험이 있습니다:
OpenZeppelin의 Transparent Proxy 또는 UUPS 패턴 사용을 권장합니다.
Flash Loan은 한 트랜잭션 내에서 무담보로 대량의 자금을 빌리고 반환하는 DeFi 기능입니다. 이를 악용하여:
bZx, Pancake Bunny 등 여러 프로토콜이 Flash Loan 공격으로 피해를 입었습니다.