1억 2,800만 달러의 반올림 오류: 1센트 미만의 수학적 버그가 9개 체인에 걸쳐 DeFi에서 가장 오래된 AMM을 고갈시킨 방법
8 wei. 이는 토큰의 약 0.000000000000000008 에 해당하는 양으로, 실질적인 달러 가치가 거의 없는 아주 미미한 수준입니다. 하지만 2025년 11월 3일, 한 공격자가 이러한 규모의 반올림 오차를 이용해 1억 2,800만 달러의 자산을 탈취했으며, 30분도 채 되지 않아 9개의 블록체인에서 Balancer 의 Composable Stable Pool 을 고갈시켰습니다.
Balancer V2 익스플로잇은 이제 역사상 단일 취약점으로 인한 최대 규모의 멀티 체인 DeFi 익스플로잇으로 기록되었습니다. 이 사건으로 Balancer 총 예치 자산 (TVL) 의 52% 가 하룻밤 사이에 증발했으며, 업계 최고 보안 기업들의 10회 이상의 감사를 통과했음에도 발생했습니다. 심지어 Berachain 은 자금을 회수하기 위해 긴급 하드포크를 실행해야만 했습니다. 취약점은 무엇이었을까요? 바로 잘못된 방향으로 반올림을 수행하는 단 한 줄의 코드였습니다.
Balancer 풀의 작동 원리와 취약점 발생 지점
Balancer V2 는 Curve 의 StableSwap 모델에서 차용한 개념인 D 라는 수학적 불변량 (invariant) 을 사용합니다. 이는 풀에 예치된 총 가치를 나타냅니다. 사용자가 토큰을 스왑할 때마다 프로토콜은 풀의 균형을 유지하기 위해 D 를 다시 계산합니다. 사용자가 유동성을 공급하고 받는 LP 토큰인 Balancer Pool Tokens (BPT) 의 가격은 이 불변량에서 직접 도출됩니다: BPT 가격 = D / 총 공급량 (totalSupply).
D 를 계산하기 전에 프로토콜은 스케일링 함수를 사용하여 토큰 잔액을 공통 정밀도로 정규화해야 합니다. 치명적인 결함은 바로 이 지점에 있었습니다.
_upscaleArray 함수는 원래의 토큰 잔액을 스케일링된 값으로 변환할 때 mulDown (내림) 을 사용했습니다. 수천 개 또는 수백만 개의 토큰과 같은 일반적인 잔액의 경우, 1 wei 미만의 내림은 무시해도 될 수준입니다. 하지만 토큰 잔액이 단 8–9 wei 의 경계까지 낮아지면, Solidity 의 정수 나눗셈은 그 미세한 반올림 오차를 엄청난 상대적 왜곡으로 변환합니다.
8 wei 에서 단 1 wei 만 내림해도 12.5% 의 정밀도 손실이 발생합니다. 이렇게 왜곡된 잔액이 불변량 계산에 반영되면 D 가 낮아집니다. D 가 낮아지면 BPT 가격도 하락합니다. BPT 가격이 인위적으로 낮아지면, 공격자는 이를 저렴하게 매수하여 원래의 가치로 상환할 수 있게 됩니다.
공격: 단일 트랜잭션에서 발생한 65회의 마이크로 스왑
Check Point Research 의 블록체인 모니터링 시스템은 2025년 11월 3일 07:46 UTC 에 이 익스플로잇을 감지했습니다. 그 당시 공격자의 스마트 컨트랙트는 이미 파괴적인 일련의 과정을 수행하고 있었습니다.
공격은 65회의 스왑 작업이 포함된 단일 batchSwap 트랜잭션 내에서 세 단계로 진행되었습니다.
1단계 — 경계값으로 유도. 공격자는 대량의 BPT 를 기초 자산 토큰으로 스왑하여, 의도적으로 특정 토큰의 풀 잔액을 임계치인 8–9 wei 까지 떨어뜨렸습니다. 이 잔액 상태에서는 해당 토큰과 관련된 모든 후속 작업에서 최대치의 정밀도 손실이 발생합니다.
2단계 — 오차의 누적. 한 토큰이 반올림 경계에 고정된 상태에서 공격자는 신속하게 소액 스왑을 실행했습니다. 각 스왑은 스케일링 과정에서 _upscaleArray 함수가 내림을 수행하도록 유도했고, 이는 불변량 D 가 체계적으로 과소평가되는 결과를 초래했습니다. 단일 스왑의 정밀도 손실은 미미했지만, 동일한 batchSwap 호출 내에서 65회에 걸쳐 반복되자 그 손실이 급격히 복리로 쌓였습니다. 이는 BPT 가격을 실제 가치보다 훨씬 낮게 억제하기에 충분했습니다.
3단계 — 저가 매수, 고가 상환. 공격자는 억제된 가격으로 BPT 를 구매한 후, 즉시 해당 토큰을 실제 가치에 따라 기초 자산으로 상환했습니다. 조작된 가격과 실제 가격 사이의 차액은 고스란히 공격자의 수익이 되었습니다.
첫 번째 스왑부터 마지막 탈취까지의 전 과정은 30분도 걸리지 않았습니다. 공격자는 익스플로잇 로직이 생성자 (constructor) 에 포함된 맞춤형 스마트 컨트랙트를 배포했으며, 이는 배포와 동시에 추가 작업 없이 자동으로 공격이 실행되었음을 의미합니다.
9개의 체인, 하나의 버그
이 사건을 단순한 익스플로잇에서 역사적인 사건으로 만든 것은 바로 그 피해 규모였습니다. Balancer V2 의 Composable Stable Pool 이 배포된 모든 체인에서 동일한 취약 코드가 작동하고 있었습니다.
- Ethereum — 가장 큰 규모의 풀과 막대한 손실 발생
- Arbitrum — 상당한 유동성 유출
- Base — 코인베이스의 L2 타격
- Optimism — OP Stack 풀 고갈
- Polygon — 오래된 풀들이 타겟이 됨
- Avalanche — C-Chain 풀 침해
- Gnosis — 규모는 작지만 영향 받음
- Berachain — 새로 런칭된 체인이 큰 타격을 입음
- Sonic — 최신 배포 체인 역시 취약함
공격자는 9개의 서로 다른 익스플로잇을 준비할 필요가 없었습니다. 단 하나를 9번 배포했을 뿐입니다. 효율적인 멀티 체인 배포를 가능케 했던 Balancer 의 공유 코드베이스가 역설적으로 동시다발적인 멀티 체인 붕괴의 경로가 되었습니다.
중요한 점은 다른 Balancer 풀 유형 (Weighted Pools, Managed Pools) 과 최신 V3 프로토콜은 전혀 영향을 받지 않았다는 것입니다. 이 버그는 Composable Stable Pool 의 수학 로직에만 국한된 문제였습니다.
TVL의 붕괴
익스플로잇 발생 전 Balancer V2 의 총 예치 자산 (TVL) 은 4억 4,200만 달러였습니다. 그러나 24시간 만에 이 수치는 2억 1,400만 달러로 급락하며 52% 의 하락을 기록했습니다. 소식이 확산되고 유동성 공급자들이 안전을 위해 영향받지 않은 풀에서도 자금을 인출하기 시작하면서, TVL은 이후 몇 주 동안 약 1억 8,200만 달러까지 계속해서 줄어들었습니다.
2020년부터 DeFi 의 핵심 인프라 역할을 해온 프로토콜에게 이 하락은 뼈아픈 결과였습니다. Balancer 는 2022년의 하락장, Terra 사태, FTX 파산을 모두 이겨냈습니다. 하지만 거시적인 재난도 해내지 못한 일을 단 하나의 반올림 오차가 해내고 말았습니다.
복구: 하드 포크, 화이트 햇, 그리고 3,300만 달러의 회수
이후의 수습 과정은 DeFi 역사상 가장 극적인 복구 노력 중 하나로 기록되었습니다.
베라체인(Berachain)의 긴급 하드 포크. 새롭게 출시된 이 체인은 가장 공격적인 조치를 취했습니다. 검증인들이 온체인에서 공격자의 자금을 동결하는 긴급 하드 포크를 조율한 것입니다. 스스로를 화이트 햇 운영자라고 밝힌 한 인물이 도난당한 1,280만 달러 상당의 베라체인 자산을 반환했으며, 이로 인해 해당 체인의 피해 사용자들은 전액 복구가 가능해졌습니다.
스테이크와이즈(StakeWise)의 직접 복구. 리퀴드 스테이킹 프로토콜인 스테이크와이즈는 긴급 멀티시그(multisig)를 통해 컨트랙트 호출을 실행하여 약 5,041 osETH (1,930만 달러)와 13,495 osGNO (170만 달러)를 회수했습니다. 이는 도난당한 osETH의 73.5% 에 해당합니다.
커뮤니티 화이트 햇 노력. 추가적인 복구 작업을 통해 회수된 총금액은 약 3,300만 달러에 달하며, 이로 인해 순 손실액은 약 9,500만 달러로 줄어들었습니다.
주로 이더리움(Ethereum)과 아비트럼(Arbitrum)에 남아 있는 나머지 자금은 공격자에 의해 ETH로 전환되었으며, 식별된 지갑에 보관되어 있습니다. 협상, 법적 조치 또는 버그 바운티 제안을 통해 이 자금들이 회수될 수 있을지는 여전히 불투명합니다.
10번의 감사, 0건의 발견
밸런서(Balancer) 익스플로잇에 관한 가장 뼈아픈 진실은 이것입니다. 해당 코드는 OpenZeppelin, Trail of Bits, Certora 등 업계에서 가장 신뢰받는 보안 기업들로부터 10번 이상 감사를 받았다는 점입니다.
2022년, Certora는 Balancer V2의 핵심 지급 능력 속성을 공식적으로 검증(Formal Verification)했습니다. 하지만 이 공식 증명은 스케일링 함수에서의 반올림 방향 리스크를 구체적으로 다루지 않았습니다. 검증된 속성들은 일반적인 조건에서는 풀(pool)의 자금이 고갈될 수 없음을 증명했지만, "일반적인 조건"에는 공격자가 의도적으로 토큰 잔액을 8 wei까지 밀어붙이는 상황은 고려되지 않았습니다.
Trail of Bits는 익스플로잇 발생 후, 이전 감사에서 반올림 문제가 지적되긴 했으나 고위험군으로 우선순위가 지정되지 않았다고 언급했습니다. 당시로서는 타당한 이유가 있었습니다. 개별적인 반올림 오류는 무시할 수 있을 정도의 손실만을 발생시키기 때문입니다. 단일 원자적 트랜잭션(atomic transaction)에서 65개의 오류가 복합적으로 작용할 때 어떤 일이 벌어질지는 아무도 모델링하지 않았습니다.
이는 DeFi 업계가 계속해서 재학습하고 있는 패턴을 반영합니다. 감사는 범위가 정해진 검토(scoped reviews)이며, 특정 시점의 특정 코드를 찍은 스냅샷입니다. 알려진 공격 패턴을 테스트하고 특정 속성을 검증할 뿐이지, 보증서가 아닙니다. 프로토콜이 진화하고, 새로운 풀 유형이 추가되며, 코드가 새로운 체인에 배포될 때, 감사된 코드와 프로덕션에서 실행 중인 코드 사이의 간극은 조용히 벌어집니다.
"명세가 곧 법이다(Spec Is Law)" 명제
밸런서 익스플로잇은 코드를 작성하기 전에 프로토콜이 어떻게 작동해야 하는지에 대한 수학적 정의를 작성하는 관행인 형식 명세(formal specification) 옹호자들에게 하나의 사례 연구가 되었습니다.
a16z와 Certora 같은 기업들이 주장하는 논거는 명확합니다. 만약 밸런서가 "반올림으로 인해 D가 연산당 X% 이상 감소해서는 안 된다" 또는 "N번의 스왑에 걸친 누적 반올림 오차는 일정 범위 내에 머물러야 한다"는 형식 명세를 유지했더라면, 이 취약점은 프로덕션 단계가 아닌 검증 단계에서 발견되었을 것입니다.
대부분의 DeFi 감사에서 사용되는 정형화된 불변성(invariant)인 "반올림은 프로토콜에 유리해야 한다"는 충분하지 않음이 증명되었습니다. 이는 반올림의 방향은 포착하지만, 다중 연산 흐름에서 축적된 오차의 크기는 포착하지 못합니다. 명세 우선(Spec-first) 방식은 프로토콜 설계자가 극단적인 잔액 범위에서의 예외 상황을 포함하여 시스템이 의존하는 모든 수학적 불변성을 정의하고 방어하도록 강제합니다.
이러한 접근 방식이 DeFi 개발 속도에 맞춰 확장 가능한지는 여전히 의문입니다. 형식 명세를 작성하고 유지하는 데는 상당한 투자가 필요합니다. 하지만 밸런서 익스플로잇이 보여주었듯, 그렇게 하지 않았을 때의 비용은 9자리 수(억 달러 단위)에 달할 수 있습니다.
이것이 DeFi 보안에 의미하는 바
밸런서 익스플로잇은 업계가 프로토콜 보안에 대해 생각하는 방식을 재편하는 몇 가지 트렌드를 명확히 보여줍니다.
공유 코드베이스는 리스크를 증폭시킵니다. 멀티 체인 배포는 효율적이지만, 단 하나의 취약점이 멀티 체인 대참사로 이어질 수 있음을 의미합니다. 여러 체인에 배포하는 프로토콜은 체인별 모니터링 기능과 각 배포를 독립적으로 일시 중단할 수 있는 능력을 갖춰야 합니다.
정밀 산술은 최우선 보안 고려 사항입니다. 반올림 오류는 사소한 장부 기재 문제가 아닙니다. TVL이 수십억 달러에 달하는 프로토콜에서는 1페니 미만의 정밀도 손실도 무기화될 수 있습니다. 모든 스케일링, 정규화 및 변환 함수에는 명시적인 반올림 방향 분석이 필요합니다.
일괄 작업(Batch operations)에는 손실 범위 제한 보장이 필요합니다. batchSwap 함수는 가스 효율성을 위해 설계되어 단일 트랜잭션에서 여러 번의 스왑을 허용했습니다. 하지만 이는 중간 검증 없이 오류가 복합적으로 작용하도록 허용하는 결과도 낳았습니다. 향후 구현에는 시작과 끝뿐만 아니라 일괄 작업 사이사이에도 불변성 체크(invariant checks)가 포함되어야 합니다.
지속적인 보안이 일회성 감사를 이깁니다. Trail of Bits의 사후 분석은 업계가 고립된 감사 계약에서 벗어나 지속적인 보안 파트너십으로 나아가야 한다고 강조했습니다. 여기에는 지속적인 퍼징(fuzzing), 진화하는 코 드베이스의 형식 검증, 자동 일시 중단 기능을 갖춘 실시간 모니터링이 포함됩니다.
복구 인프라가 중요합니다. 베라체인의 능력과 하드 포크를 통한 자금 동결, 그리고 스테이크와이즈의 긴급 멀티시그 복구는 3,300만 달러를 구했습니다. 사고 대응 인프라가 필요하기 전에 미리 투자한 프로토콜과 체인은 피할 수 없는 익스플로잇이 발생했을 때 더 나은 위치에서 대처할 수 있습니다.
Balancer V3 에 대한 의문
한 가지 불행 중 다행인 점은 Certora 가 Balancer V3 의 아키텍처가 이번 취약점의 영향을 받지 않는다는 것을 확인했다는 것입니다. V3 재설계는 익스플로잇을 가능하게 했던 스케일링 불일치 문제를 해결했으며, 이는 비록 구체적인 공격 벡터가 예상되지는 않았더라도 Balancer 팀이 이미 정밀도 처리(precision handling)를 개선이 필요한 영역으로 식별했음을 시사합니다.
Balancer 로의 복귀를 고민하는 유동성 공급자들에게는 V3 채택률이 핵심 지표가 될 것입니다. 프로토콜의 장기적인 생존 여부는 신뢰가 더 무너지기 전에 남아 있는 V2 유동성을 더 안전한 아키텍처로 마이그레이션할 수 있는지에 달려 있습니다.
반복되는 교훈
DeFi 는 2020년 이후 플래시 론(flash loan) 공격과 수학적 익스 플로잇으로 인해 20억 달러 이상의 손실을 입었습니다. Balancer 익스플로잇은 업계가 좀처럼 깨지 못하는 패턴을 가장 극명하게 보여주는 사례입니다. 감사인에게 보이지 않고 수년간 간과되었던 아주 작은 산술적 버그들이, 공격자가 이를 복합적으로 활용할 수 있는 일련의 연산 순서를 찾아내는 순간 수억 달러 규모의 재앙으로 변합니다.
8 wei 의 반올림 오차. 1억 2,800만 달러 도난. 9개 체인 피해. 10번의 감사 통과. 첫 스왑부터 마지막 인출까지 단 30분.
이 수치들은 DeFi 업계가 더 이상 무시할 수 없는 이야기를 전합니다. 코드가 곧 법인 시스템에서, 모든 반올림 결정은 곧 보안 결정입니다.
BlockEden.xyz 는 이상 온체인 활동을 탐지하도록 설계된 내장 모니터링 기능을 갖춘, 여러 블록체인 네트워크에 걸친 엔터프라이즈급 RPC 및 API 인프라를 제공합니다. DeFi 프로토콜이 크로스 체인 보안 과제와 씨름함에 따라, 실시간 관찰 가능성을 갖춘 신뢰할 수 있는 인프라가 필수적이 되었습니다. API 마켓플레이스 탐색하기를 통해 보안 우선 개발을 위해 설계된 기반 위에서 구축을 시작하세요.