11월 3일, Balancer V2 프로토콜과 그 포크 프로젝트가 온체인 공격을 받아 1억 2천만 달러 이상의 심각한 손실을 입었습니다. BlockSec은 첫 번째 기회에 조기 경고를 발령하고 [1] 예비 분석 결론을 내렸습니다[2]. 이는 매우 복잡한 공격이었습니다. 저희의 예비 분석 결과, 공격자가 불변량을 조작하여 BPT(Balancer Pool Token), 즉 ool의 LP 토큰 가격 계산을 왜곡하여 배치 스왑(batchSwap) 작업을 통해 안정적인 풀에서 수익을 창출한 것이 근본 원인으로 밝혀졌습니다.
배경 정보
1. 스케일링 및 반올림
다양한 토큰의 소수점 자릿수를 표준화하기 위해 Balancer 계약은 다음을 수행합니다.
업스케일: 계산을 수행하기 전에 잔액 과 금액을 균일한 내부 정밀도로 업스케일합니다.
축소: 결과를 원래 정밀도로 줄이고 방향성 반올림을 수행합니다(예: 풀이 채워지지 않도록 입력은 일반적으로 반올림되고 출력 경로는 종종 아래쪽으로 잘립니다).
결론: 동일한 거래 내에서 각 단계에 사용된 비대칭 반올림 방향은 매우 작은 단계로 반복적으로 실행될 경우 체계적인 약간의 편차로 이어질 수 있습니다.
2. D와 BPT의 가격
Balancer V2 프로토콜의 Composable Stable Pool [3]과 포크 프로토콜이 이 공격의 영향을 받았습니다 . Stable Pool은 1:1의 가까운 교환 비율을 유지하거나 알려진 교환 비율로 교환될 것으로 예상되는 자산에 사용되며, 큰 가격 충격을 유발하지 않고 대규모 교환을 가능하게 하여 유사 또는 관련 자산 간의 자본 활용 효율성을 크게 향상시킵니다.
풀은 Stable Math(Curve 기반 StableSwap 모델)를 사용하는데, 여기서 불변량 D는 풀의 "가상 총 가치"를 나타냅니다.
BPT(Pool의 LP 토큰)의 대략적인 가격 은 다음 과 같습니다.

위 공식은 D를 문서상으로 더 작게 만들면(실제로 자금이 인출되지 않더라도) BPT 가격이 더 저렴해진다는 것을 보여줍니다 . BTP는 풀 점유율 나타내며, 유동성을 인출할 때 얼마나 많은 풀 예비금을 확보할 수 있는지 계산하는 데 사용됩니다. 따라서 공격자가 더 많은 BPT를 확보할 수 있다면 유동성을 인출할 때 이익을 얻을 수 있습니다.
공격 분석
Arbitrum에 대한 공격 트랜잭션을 예로 들면, batchSwap 작업은 세 단계로 나눌 수 있습니다.
1단계 : 공격자는 기초 자산에 대한 BPT를 상환하여 토큰 중 하나(cbETH)의 잔액 반올림을 위한 임계점(금액 = 9)으로 정밀하게 조정합니다. 이 단계는 다음 단계에서 발생할 정밀도 손실을 위한 토대를 마련합니다 .
2단계: 공격자는 신중하게 조작된 수량(= 8)을 사용하여 다른 기초 자산(wstETH)과 cbETH를 스왑합니다. 토큰 수량을 조정할 때 내림 처리가 적용되어 계산된 Δx가 약간 작아져(8.918에서 8로), Δy가 과소평가되고 불변량 D(Curve의 StableSwap 모델에서 도출)가 더 작아집니다. BPT 가격 = D / totalSupply이므로 BPT 가격은 인위적으로 억제됩니다.

3단계: 공격자는 기초 자산을 BPT로 역스왑하여 풀 내의 균형을 회복하는 동시에 BPT 가격 하락을 이용해 더 많은 BPT 토큰을 획득하여 수익을 얻습니다.
마지막으로 공격자는 또 다른 수익성 있는 거래를 사용하여 유동성을 인출했고, 이를 통해 추가 BPT를 사용하여 풀에 있는 다른 기초 자산(cbETH 및 wstETH)을 인수하고 수익을 냈습니다.
거래 공격 :
https://app.blocksec.com/explorer/tx/arbitrum/0x7da32ebc615d0f29a24cacf9d18254bea3a2c730084c690ee40238b1d8b55773
수익성 있는 거래:
https://app.blocksec.com/explorer/tx/arbitrum/0x4e5be713d986bcf4afb2ba7362525622acf9c95310bd77cd5911e7ef12d871a9
참조:
[1] https://x.com/Phalcon_xyz/status/1985262010347696312
[2] https://x.com/Phalcon_xyz/status/1985302779263643915
[3] https://docs-v2.balancer.fi/concepts/pools/composable-stable.html





