2025년 11월 3일, 오랫동안 탈중앙화 자동 마켓메이커(AMM) 프로토콜인 Balancer v2가 공격을 받아 포크 프로토콜을 포함한 여러 프로젝트에서 여러 온체인 에 걸쳐 약 1억 2천만 달러의 손실을 입었습니다. 이는 이미 침체되어 있던 DeFi 생태계를 더욱 악화시켰습니다.
저자: Kong & Lisa
편집자: 77
배경
2025년 11월 3일, 오랫동안 탈중앙화 자동 마켓메이커(AMM) 프로토콜인 Balancer v2가 공격을 받아 포크 프로토콜을 포함한 여러 프로젝트의 여러 온체인 에 걸쳐 약 1억 2천만 달러의 손실이 발생했습니다. 이는 이미 침체되어 있던 DeFi 생태계를 더욱 악화시켰습니다. 슬로우 미스트 (SlowMist) 보안팀이 이 공격에 대해 자세히 분석한 내용은 다음과 같습니다.
근본 원인
Balancer v2의 합성 가능 스테이블 풀 구현(Curve StableSwap의 스테이블 수학 기반)에서는 스케일링 계수의 정수 고정 소수점 연산에 정밀도 손실 문제가 있어 토큰 스왑 시 작지만 복리로 발생하는 가격 차이/오류가 발생합니다. 공격자는 유동성이 낮은 상황에서 소규모 스왑을 악용하여 이 오류를 증폭시켜 상당한 누적 수익을 창출할 수 있습니다.
필수 조건
분석을 시작하기에 앞서, 이 분석의 내용을 이해하기 위해 Balancer의 몇 가지 주요 측면을 이해해야 합니다.
구성 가능한 안정 풀
합성 가능 스테이블 자산 풀은 거의 동등한 가격 또는 알려진 환율로 거래될 것으로 예상되는 자산을 위해 특별히 설계된 토큰 스왑 풀입니다. 예를 들어 USDC/USDT를 거의 1:1 비율로 스왑하거나, WETH/stETH를 알려진 환율로 스왑하는 것이 있습니다.
밸런서 풀 토큰(BPT)
BPT는 Balancer 풀의 점유율 나타냅니다. 사용자는 풀에 유동성을 추가할 때 BPT를 받게 되며, 이는 풀에서 점유율 나타냅니다.
구성 가능성
유동성 풀을 통해 LP는 유동자산과 스왑하여 자본 효율성을 높일 수 있습니다. 예를 들어, BPT 토큰과 WETH/stETH와 같은 유동자산 간의 스왑이 가능합니다.
스케일링 계수
Balancer의 기반 풀은 소수점 정밀도와 반올림 방향을 관리하는 방법을 채택하여 모든 자금이 계산을 위해 풀에 들어가기 전에 스케일링 요소를 통해 풀의 이익에 맞게 최적화된 정밀도와 소수점 반올림 방향을 갖도록 보장합니다.
배치 스왑
대량 스왑 기능을 통해 사용자는 동일 풀 또는 여러 풀 내에서 단일 거래로 서로 다른 토큰을 스왑할 수 있습니다. 풀은 내부 회계 및 대량 스왑 완료 후 정산을 위해 가상 가치를 사용합니다.
공격 분석
여기서는 이더 에 대한 공격과 관련된 두 가지 거래를 예로 들어 보겠습니다.
공격 트랜잭션: 0x6ed07db1a9fe5c0794d44cd36081d6a6df103fab868cdd75d581e3bd23bc9742
출금 거래: 0xd155207261712c35fa3d472ed1e51bfcd816e616dd4f517fa5959836f5b48569
- 공격자는 먼저 대량 스왑 기능을 통해 공격 거래를 시작했는데, BPT를 사용하여 풀에서 대량 의 유동성 토큰을 스왑해 풀의 유동성 토큰 보유량을 매우 낮췄습니다.

- 풀의 유동성 토큰 보유량이 감소하자 공격자들은 유동성 토큰(osETH/WETH)을 교환하기 시작했습니다.

- 마지막으로, 유동성 토큰은 BPT 토큰으로 다시 교환되고, 이 과정은 여러 풀에서 반복됩니다.

- 공격 트랜잭션을 완료한 후, 공격자는 별도의 출금 트랜잭션을 사용하여 Vault의 manageUserBalance 함수를 호출하여 수익을 클레임. 이 트랜잭션은 이전에 여러 분석가가 공격 트랜잭션으로 잘못 판단하여 분석했던 것과 동일했지만, 실제로는 정상적인 출금 로직을 사용하는 정상적인 출금 트랜잭션이었습니다.

- 그렇다면 공격자는 왜 위의 작업을 통해 토큰을 지불하지 않고도 Vault에서 쉽게 자금을 인출할 수 있을까요? 간단한 관찰을 통해 공격자가 대량 스왑을 완료하면 Vault의 내부 원장 잔액 증가하여 공격자가 Vault에서 해당 잔액 직접 클레임 을 알 수 있습니다.

다음으로, 공격자가 토큰을 지불하지 않고도 잔액 늘릴 수 있는 이유를 자세히 분석해 보겠습니다.
원리 분석
위의 공격 분석을 바탕으로 공격자는 주로 세 단계를 통해 이익을 얻는다는 것을 알 수 있습니다.
- BPT를 사용하여 유동성 토큰으로 교환하세요.
- 유동성 토큰 스왑을 수행합니다.
- 유동성 토큰을 BPT로 다시 교환합니다.
먼저 BPT를 유동성 토큰으로 교환하는 프로세스를 분석합니다. 공격자의 교환 유형 `kind`가 1이므로, 풀은 공격자의 교환 금액을 `amountOut`으로 사용하여 공격자가 교환에 제공해야 하는 `amountIn` 금액을 계산합니다. 여기서는 복잡한 호출 체인을 다루지 않고, BPT 교환의 기본 `_swapWithBpt` 함수를 직접 분석합니다.

`_swapWithBpt` 함수는 먼저 `_upscaleArray` 함수를 사용하여 풀의 토큰 보유량을 스케일링 계수를 사용하여 스케일링함으로써 일관된 가격 정밀도와 반올림 방향을 보장합니다. `_upscaleArray` 함수는 `FixedPoint.mulDown` 함수를 사용하여 특정 스케일링 연산을 수행합니다. `mulDown` 함수가 계산 결과를 내림, 즉 소수점 이하 자릿수를 버림하는 것을 금방 알 수 있습니다.

이로 인해 풀 보유량의 소수점 이하 자릿수가 스케일링 과정에서 잘립니다. 앞서 언급했듯이, 컴포저블 풀은 거의 동일한 가격이나 알려진 환율로 거래될 것으로 예상되는 자산을 위해 특별히 설계된 토큰 스왑 풀입니다. WETH와 osETH를 예로 들어보면, 두 자산 간에는 알려진 환율이 존재합니다. 따라서 실제 osETH 보유량을 계산할 때는 환율을 곱한 후 스케일링하여 가격을 통일해야 합니다.

불행히도 환율로 인해 osETH의 준비금을 계산하면 불가피하게 소수점이 잘리게 됩니다.

이로 인해 계산된 풀 예비 잔액 예상보다 낮아집니다. BPT 가격은 풀 유동성 토큰의 총 가격을 BPT 토큰의 총 공급량 으로 나누어 계산되므로, 이 오류는 BPT 가격이 예상보다 낮음을 의미합니다.

이 오류로 인해 발생한 가격 차이를 악용하여 공격자는 대량 스왑의 세 번째 단계에서 유동성 토큰을 BPT 토큰으로 교환할 때 소액의 이익을 얻을 수 있습니다. 그러나 이는 공격자가 얻는 막대한 이익과는 거리가 멀기 때문에, 핵심은 대량 스왑의 두 번째 단계에 있습니다.
공격자는 유동성 스왑을 수행할 때 여전히 종류 1의 교환 유형을 사용합니다. 기본 스왑 함수를 직접 분석하면 _swapGivenOut 함수가 먼저 _upscale 함수를 통해 스케일링을 수행한다는 것을 빠르게 확인할 수 있습니다.

이전 `_upscaleArray` 함수와 유사하게, 사용자 교환 금액의 스케일링된 값은 `FixedPoint.mulDown` 함수를 사용하여 소수점 이하 자릿수로 잘라냅니다. 이로 인해 최종적으로 필요한 입력 토큰 금액(`amountIn`)이 예상보다 적어집니다. 이 오류는 교환 금액이 큰 경우에는 무시할 수 있지만, 교환 금액이 작은 경우에는 상당한 편차가 발생할 수 있습니다.

공격자는 정확히 그렇게 했습니다. 대량 스왑의 두 번째 단계에서 먼저 풀에 있는 osETH의 잔액 줄인 다음, 정확히 17wei의 osETH를 소규모로 스왑했습니다.

스케일링 계산을 수행할 때 실제 잔액 17.98825094772952여야 합니다.

그러나 소수점 이하 자릿수 절단으로 인해 최종 잔액 은 여전히 17wei, 0.98825094772952입니다. 17과 비교하면 정밀도 손실로 인해 이미 큰 편차가 발생했습니다. 이러한 방식으로 계산된 입력 토큰의 양 또한 큰 편차를 초래할 것입니다.

이러한 편차가 주기적으로 누적되도록 하기 위해 대량 스왑의 두 번째 단계에서 공격자는 osETH를 WETH로 다시 스왑하여 다음 소규모 스왑을 위한 충분한 유동성을 확보합니다.

WETH는 통화 고정 토큰이므로 osETH -> WETH 교환 과정의 스케일링은 1e18에서 이루어지므로 이전 오류의 누적에 영향을 받지 않습니다.

이제 우리는 전체 공격 프로세스를 명확하게 이해할 수 있습니다.
- 공격자는 소규모 스왑을 준비하기 위해 BPT를 유동성 토큰으로 교환하여 풀의 유동성 토큰 보유량을 줄였습니다.
- 이는 유동성 토큰 간에 osETH -> WETH를 스왑하여 소규모 스왑에서 정확도 오류를 정밀하게 제어할 수 있도록 준비하는 것입니다.
- 정확도 오류는 osETH -> WETH 스왑을 통해 정확하게 누적됩니다.
- 유동성은 유동성 토큰 간의 WETH -> osETH 스왑을 통해 회복됩니다.
- 2~4단계를 계속 반복하면 오류가 증폭됩니다.
- 유동성 균형을 회복하기 위해 유동성 토큰을 BPT 토큰으로 교환합니다.
- 소액 토큰 스왑으로 인해 증폭된 오류를 활용하면 최종 결제에서 손실되는 토큰 양이 최종 결제에서 손실되어야 하는 토큰 양보다 훨씬 많아 막대한 수익을 창출할 수 있습니다.
MistTrack 분석
관련된 프로젝트 수가 많기 때문에 이 섹션에서는 이 사건과 관련된 주요 주소와 자금 흐름만 분석합니다.
1. 주소 0xaa760d53541d8390074c61defeaba314675b8e3f
수익성: 이더 의 수익에는 osETH, USDC 등 다양한 토큰이 포함됩니다.

이체 세부 정보: ezETH, weETH, ankrETH 등 다양한 토큰과 일부 osETH를 ETH로 교환한 후, 해당 자금은 주소 0xf19fd5c683a958ce9210948858b80d433f6bfae2로 이체되었습니다.

잔액 상태: 주로 7,838.3569 WETH와 7,000 ETH가 포함됩니다.

초기 자금 출처: 주소 0x506d1f9efe24f0d47853adca907eb8d89ae03207, 자금은 gas.zip에서 나옵니다.

주소 0x506d1f9efe24f0d47853adca907eb8d89ae03207을 분석한 결과 gas.zip 파일에서 다음과 같은 거래 세부 정보가 발견되었습니다.

이 주소는 Arbitrum에서 ETH를 여러 블록체인에 지속적으로 분산시킨 후 공격을 개시했습니다. 더 거슬러 올라가 보면, 주소 0x506d1f9efe24f0d47853adca907eb8d89ae03207의 자금은 Tornado Cash로 거슬러 올라갈 수 있습니다.
- 토네이도 캐시 → 0x86fedad11c4765700934639f1efe1fc01355c982: 토네이도 캐시에서 클레임 100 ETH + 0.1 ETH가 이 주소로 전송되었습니다.
- 0x86fedad11c4765700934639f1efe1fc01355c982 → 0x766a892f8ba102556c8537d02fca0ff4cacfc492: 15 ETH를 전송합니다.
- 0x766a892f8ba102556c8537d02fca0ff4cacfc492 → 크로스체인하고 gas.zip 작업을 수행합니다: 이더 에서 Arbitrum으로 5 ETH를 전송하고 주소 0x506de24d01e6c8623307c9ff5e3c8a945b553207로 전송합니다.

2. 주소 0xf19fd5c683a958ce9210948858b80d433f6bfae2
수익성: 이 주소는 핵심 릴레이 노드로, 여러 체인과 업스트림 주소로부터 자금을 수신합니다.
상류 소스: Arbitrum 주소 0x872757006b6F2Fd65244C0a2A5fdd1f70A7780f4에서 USDX와 sUSDX를 전송했습니다.

Sonic 주소 0x045371528A01071D6E5C934d42D641FD3cBE941c의 stS;

이체된 금액은 이더 주소 0xaa760d53541d8390074c61defeaba314675b8e3f와 0x506d1f9efe24f0d47853adca907eb8d89ae03207에서 발생했습니다.
이체 세부 정보: 자산은 Velora, CowSwap, KyberSwap, ODOS 등의 플랫폼을 통해 이더 에서 ETH 및 WETH로 교환되었으며, 일부 자산은 LI.FI를 통해 체인을 통해 Arbitrum 및 Sonic으로 이체되었습니다.

KyberSwap을 사용하여 Sonic의 stS를 S로 교환하세요.

잔액 상태: 위 주소 0xaa760d53541d8390074c61defeaba314675b8e3f로 7,000 ETH를 이체한 것 외에는 다른 자금이 이체되지 않았습니다.

해당 주소는 SlowMist AML 악성 주소 데이터베이스에 추가되었으며, 앞으로도 비정상적인 자금 이동을 지속적으로 모니터링할 예정입니다.
11월 6일, Balancer는 공식 성명을 발표하여, 공격이 광범위한 영향을 미쳤지만 여러 당사자의 신속한 대응 덕분에 단기간 내에 손실을 크게 줄일 수 있었다고 밝혔습니다.

현재 자금 조달 진행 상황은 다음과 같습니다.
- SEAL 화이트햇 세이프 하버(BIP-726, 2024년 10월): 2024년 10월에 발효된 SEAL 화이트햇 세이프 하버(BIP-726)의 법적 프레임 덕분에 화이트햇 팀은 신속하게 개입하여 사건 처리를 조정할 수 있었습니다.
- HyperNative의 자동 비상 일시 정지 메커니즘이 작동했습니다. UTC 기준 오전 8시 6분에 Hypernative의 비상 일시 정지 시스템이 활성화되었고, UTC 기준 오전 8시 7분에는 영향을 받은 네트워크의 모든 CSPv6 풀이 일시 정지되어 추가 확산을 막았습니다.
- 이전에는 통계에 포함되지 않았던 낮은 TVL 유동성 풀을 포함하여 중단될 수 있는 모든 CSPv6 유동성 풀이 복구 모드로 전환되었습니다.
- CSPv6 팩토리 기능 비활성화: 수정이 완료될 때까지 새로운 취약한 풀을 생성할 수 없습니다.
- BAL과 파트너 보상 자산을 보존하기 위해 영향을 받은 풀의 모든 인센티브와 배출량이 종료되었습니다.
- 주요 LP는 안전하게 빠져나갔습니다. 여기에는 Crypto.com(약 80만 달러, cdcETH/wstETH)과 Ether.fi(약 1,06만 달러, eBTC/wBTC)가 포함됩니다.
- 스테이크와이즈는 5,041개의 osETH(약 1,900만 달러)와 13,495개의 osGNO(약 170만~200만 달러)를 회수했으며, 이는 도난당한 osETH의 약 73.5%에 해당합니다. 이 자산들은 피해 사용자에게 비례하여 반환될 예정입니다.
- Berachain 검증자 네트워크가 일시 중지되었습니다. BEX에서 Balancer v2의 리스크 제어하기 위해 온체인 작업이 일시 중지되었으며 긴급 포크 시작되었습니다.
- Sonic Labs에서 관련 주소 동결: Sonic의 Balancer v2 포크 Beets와 관련된 공격자 주소가 동결 더 이상의 자금 이체나 교환이 차단되었습니다.
- 기지 MEV 로봇이 회수에 도움을 주었습니다. 약 15만 달러가 회수되었습니다.
- BitFinding 화이트햇 팀: 메인넷에서 약 60만 달러 상당의 자산을 성공적으로 가로채고 회수했습니다.
- 모네리움은 EURe 자산을 동결. 추가 자금 흐름을 막기 위해 약 EURe가 동결되었습니다.
- Gnosis Bridge 제한 사항: Monerium 팀과 협력하여 Gnosis 체인의 크로스체인 전송을 일시적으로 제한하여 크로스체인 전파 리스크 줄입니다.
- SEAL팀은 공격자들과 소통하고 있습니다. 그들은 SEAL 프레임 에 따라 자금 반환에 대한 협상을 계속하고 있습니다.
- 점점 더 많은 화이트햇 팀이 지원에 참여하고 있습니다. SNP를 포함한 여러 보안 팀이 분석, 구조 및 자금 회수를 지원하고 있습니다.
현재 Balancer는 보안 파트너, 연구원, 거래소, 그리고 화이트햇 팀들과 적극적으로 협력하여 자금 회수를 촉진하고 있습니다. 검증 및 청산이 완료되면 더욱 자세한 사후 분석 보고서가 발표될 예정입니다.
요약하다
이 공격의 핵심은 공격자가 스케일링 팩터에 대한 정수 고정 소수점 연산을 수행할 때 Balancer v2 프로토콜의 구성 가능 안정 풀(Composable Stable Pool) 구현에 존재하는 정밀도 손실 취약점을 악용한 데 있습니다. 공격자는 소액 거래에서 정교하게 조작하여 이 취약점으로 인한 오류를 증폭시켰고, 이를 통해 대량 스왑을 통해 막대한 수익을 창출했습니다. 슬로우 미스트 (SlowMist) 보안팀은 프로젝트팀과 감사 유사한 상황 대면 때, 특히 유동성이 낮은 시나리오에서 정밀도 처리 전략을 고려하여 극단적인 시나리오 및 경계 조건에 대한 테스트 범위를 강화할 것을 권장합니다.
참조하다
[1] https://docs-v2.balancer.fi/개념/풀/구성 가능-안정.html
[2] https://docs.balancer.fi/concepts/core-concepts/balancer-pool-tokens.html
[3] https://docs.balancer.fi/concepts/vault/토큰 스케일링.html
[4] https://docs-v2.balancer.fi/reference/swaps/batch-swaps.html
[5] https://docs-v2.balancer.fi/concepts/advanced/valuing-bpt/valuing-bpt.html#정보-가격-평가
면책 조항: 블록체인 정보 플랫폼으로서, 본 사이트에 게시된 글은 작성자와 게스트 관점 일 뿐이며 Web3Caff의 입장을 대변하지 않습니다. 본 글에 포함된 정보는 참고용일 뿐이며 어떠한 투자 조언이나 제안도 아닙니다. 거주 국가 또는 지역의 관련 법률 및 규정을 준수하시기 바랍니다.
공식 Web3Caff 커뮤니티 에 오신 것을 환영합니다 : Twitter 계정 | Web3Caff Research Twitter 계정 | WeChat 독자 그룹 | WeChat 공식 계정





