지난 한 주(2026/07/06 - 2026/07/12) 동안 총 3건의 주목할 만한 보안 사고가 확인되었으며, 약 $36.29M의 손실이 발생했습니다.
| 날짜 | 사고 | 유형 | 추정 손실 |
|---|---|---|---|
| 2026/07/06 | Summer.fi | 잘못된 설정 | ~$6.04M |
| 2026/07/06 | BonkDAO | 부적절한 거버넌스 | ~$21.2M |
| 2026/07/11 | Bonzo Lend | 부적절한 서명 검증 | ~$9.05M |
- Summer.fi: 다중 레이어 볼트 프로토콜에서 완전히 오프보딩되지 않은 다운스트림 구성 요소가 최상위 레벨의 공유 가격을 무결성 손상시킬 수 있다는 점을 보여주는 사례로 선정되었습니다. 이는 손상된 포지션이 악용 가능해지기 전에 폐기 절차를 완료하는 것이 얼마나 중요한지를 강조합니다.
- Bonzo Lend: 오라클 레이어에서의 BLS 검증 취약점이 서명 보안을 완전히 우회하여 위조된 가격 루트로 이어질 수 있으며, 영향받은 검증자에 의존하는 프로토콜에 시스템적 위험을 초래할 수 있음을 보여주는 사례로 선정되었습니다.
Web3 최고의 보안 감사 기관
출시 전 설계, 코드, 비즈니스 로직을 검증하세요
주간 하이라이트: Summer.fi
이 사고는 다중 레이어 볼트 프로토콜에서 완전히 오프보딩되지 않은 다운스트림 구성 요소가 최상위 레벨의 공유 가격을 무결성 손상시킬 수 있다는 점을 보여주기 때문에 하이라이트로 선정되었습니다. 이 패턴은 모든 기여자가 여전히 정상 상태인지 확인하지 않고 중첩되거나 외부 소스에서 값을 집계하는 모든 시스템에 광범위하게 적용됩니다.
2026년 7월 6일, 이더리움의 Summer.fi FleetCommander 볼트가 약 $6.04M에 달하는 익스플로잇 피해를 입었습니다 [1][2]. 근본 원인은 Summer.fi의 FleetCommander가 totalAssets()를 계산할 때 오프보딩을 위해 상한이 설정되었지만 아직 활성 집합에서 제거되지 않은 전략 구성 요소(Ark라고 불림)를 여전히 포함하고 있었다는 점입니다. 공격자는 Ark가 여전히 액면가에 가깝게 평가하던 오래되고 과대평가된 vgUSDC 토큰을 대량으로 축적한 뒤, 이를 Ark에 직접 전송하여 FleetCommander의 공유 가격을 부풀리고 부풀려진 가격으로 환매했습니다.
배경
Summer.fi는 볼트-오브-볼트 아키텍처 위에 구축된 DeFi 수익 집계기입니다. 사용자는 FleetCommander라고 불리는 ERC-4626 상위 볼트에 자산을 예치하며, 이 볼트는 Arks라고 불리는 전략 어댑터 집합을 통해 다양한 기초 대출 및 수익 프로토콜로 자금을 라우팅합니다. FleetCommander의 총 자산은 각 Ark의 자체 보고 가치를 집계하여 산출되며, 사용자는 이 집계 평가액을 기준으로 언제든지 공유를 환매할 수 있습니다.
기초 수익 소스 중 하나는 Morpho입니다. FleetCommander는 Ark를 통해 Morpho 볼트에 자금을 예치하고, 해당 볼트에서 보유한 공유를 기준으로 자신의 가치를 평가합니다. 사용자가 FleetCommander 공유를 환매할 때 상위 볼트의 현금 버퍼가 부족하면, 기초 볼트에서 스택 위로 자금을 끌어올립니다:
사용자가 FleetCommander 공유 환매
| (1) 사용자의 공유 소각
v
FleetCommander
| (2) 먼저 버퍼에서 지급; 이후 Arks에서 인출
v
Ark
| (3) 현금 확보를 위해 기초 볼트에서 자체 공유 환매
v
Morpho 볼트
(4) 지급을 위해 기초 시장에서 출금
각 Ark는 기초 볼트에서 자체 토큰 잔액을 조회하고 해당 공유를 자산으로 변환하여 totalAssets()를 계산합니다. 이러한 공유는 표준 ERC-20 토큰이므로, 누구든지 FleetCommander의 예치 흐름을 거치지 않고 Ark에 추가 공유를 직접 전송할 수 있습니다.
취약점 분석
영향받은 FleetCommander는 LowerRisk USDC 볼트 (0x98C4...cF17)와 HigherRisk USDC 볼트 (0xE9cD...cB06)입니다. 조작된 Silo Varlamore Ark는 0x61d7...76c2입니다.
두 가지 조건이 익스플로잇의 발판을 마련했습니다:
-
오래되고 과대평가된 자산. 2025년 11월 Stream Finance가 붕괴된 후 [3] 수익 토큰
xUSD가 75% 이상의 가치를 잃으면서,xUSD를 담보로 한 포지션을 보유하고 있던 Silo "Varlamore USDC Growth" 볼트는 대부분 회수 불가능한 상태가 되었습니다. 그러나 볼트의 온체인 회계는 이 손실을 반영하지 않았습니다:vgUSDC토큰은 기초USDC가 묶여 있음에도 불구하고convertToAssets()를 통해 계속해서 액면가에 가까운 값을 보고했습니다. -
부분적으로만 제거된 Ark. 이 손상된 익스포저를 보유한 Ark는 예치 상한이 0으로 설정되어 오프보딩이 진행 중이었습니다. 그러나 상한을 0으로 설정하면 FleetCommander를 통한 새로운 예치만 차단됩니다.
totalAssets()계산에서 해당 Ark를 제거하지는 않습니다.
Ark는 vault.balanceOf(address(this))를 호출한 후 vault.convertToAssets(shares)를 호출하여 totalAssets()를 계산합니다. 해당 공유는 전송 가능한 ERC-20 토큰이므로, 누구든지 오래되고 과대평가된 vgUSDC를 Ark에 직접 전송하여 새로운 공유를 발행하거나 실질적인 출금 가능 유동성을 추가하지 않고도 Ark의 totalAssets()를 부풀릴 수 있습니다. 이 부풀림은 FleetCommander의 공유 가격까지 전파됩니다.


공격 분석
다음 분석은 트랜잭션 0x0db528...43da12를 기반으로 합니다.
-
1단계: 공격자는 앞선 3개월에 걸쳐 여러 지갑을 통해 약 190.8억
vgUSDC를 축적한 후, 익스플로잇 직전에 공격 컨트랙트로 통합했습니다. -
2단계: 공격자는 Morpho Blue에서 1,000,000
USDT플래시론을 받은 후, 공격 자금을 마련하기 위해 두 번째로 65,419,171USDC플래시론을 중첩 실행했습니다. -
3단계: 공격자는 여러 Morpho V2 볼트에서
forceDeallocate()를 호출하여 4,318,535USDC를 Morpho Blue 시장에서 볼트의 유휴 잔액으로 끌어왔습니다. 이를 통해 이후 단계에서 부풀려진 환매를 지급할 충분한 유동 자본이 확보되었습니다.

-
4단계: 공격자는 Uniswap V4에서 20,000
USDT를 약 68,421xUSD로 교환한 후, Balancer V3에서 해당xUSD를 약 4.7627억vgUSDC로 교환했습니다. 이를 통해 최소한의 실질 비용으로 추가적인 오래된 토큰을 축적했습니다. -
5단계: 공격자는 64,828,534
USDC를 FleetCommander LVUSDC에 예치하고 60,787,156 공유를 받았습니다. -
6단계: 공격자는 약 195.5억
vgUSDC공유를vgUSDCArk에 직접 전송했습니다. Ark의totalAssets()는 공유가 어떻게 도착했는지와 관계없이 보유한 모든 공유를 계산하기 때문에, 이로 인해 Ark의 보고 가치가 부풀려졌고 그에 따라 FleetCommander의totalAssets()도 부풀려졌습니다.

- 7단계: 공격자는 60,766,209 FleetCommander 공유를 70,959,584
USDC로 환매하여 부풀려진 공유 가격과 최초 예치금의 차액에서 이익을 얻었습니다.

- 8단계: 동일한 원자적 트랜잭션 내에서 공격자는 HigherRisk USDC FleetCommander에도 유사한 부풀림을 적용했습니다. HigherRisk 구간에서는
vgUSDC대신 HigherRisk Term Ark에 기부된 Term 공유를 사용했지만, 기본 메커니즘은 동일했습니다: 기부를 통해totalAssets()를 부풀린 후 부풀려진 가격으로 환매. 두 볼트를 합산한 총 이익은 약 $6.04M이었습니다.
결론
이번 사고는 코드 버그가 아닌 운영상의 실패로 인한 공유 가격 부풀림 공격이었습니다. Stream Finance 붕괴로 손상된 Silo Ark가 오프보딩 중임에도 FleetCommander의 totalAssets()에 여전히 포함되어 있었습니다 [2]. 공격자는 저렴하게 축적한 오래되고 과대평가된 vgUSDC를 해당 Ark에 기부하여 공유 가격을 부풀리고, 다른 예치자들의 손해를 감수하며 예치액보다 더 많은 금액을 환매했습니다.
예치 상한을 0으로 설정하는 것은 Ark를 오프보딩하지 않습니다. 다중 레이어 볼트 시스템의 경우, totalAssets()는 폐기된 포지션을 제외해야 하며, 보유 자산은 오래된 온체인 시세가 아닌 실현 가능한 가치로 평가되어야 합니다. 오프보딩 중인 구성 요소는 부풀림 벡터로 활용될 수 있기 전에 집계 평가에서 완전히 제거되어야 합니다.
참고 자료
이번 주 추가 사고
Bonzo Lend
2026년 7월 11일, 헤데라(Hedera)의 대출 프로토콜 Bonzo Lend는 공격자가 프로토콜의 제3자 가격 피드 제공자인 Supra에 SAUCE 가격 피드에 대한 위조된 오라클 업데이트를 제출하면서 약 $9.05M의 손실을 입었습니다 [1]. 오라클 검증자가 제로 서명 증명을 수락하고 부풀려진 SAUCE/WHBAR 가격을 온체인에 기록했습니다. 이후 Bonzo Lend는 조작된 피드를 읽어 공격자가 게시한 SAUCE 담보 가치보다 훨씬 더 많은 자산을 빌릴 수 있도록 허용했습니다.
배경
Bonzo Lend는 헤데라의 대출 프로토콜입니다. 시장 회계는 SAUCE와 같은 생태계 자산에 대해 제3자 오라클 네트워크인 Supra를 포함한 외부 가격 피드에 의존합니다. Bonzo Lend는 모든 오라클 위원회 서명을 직접 인증하지 않고, 오라클의 온체인 피드에 이미 저장된 최신 값을 읽어 담보 가치와 차입 한도를 계산할 때 사용합니다.
Supra의 풀 오라클 업데이트 경로는 제출된 루트를 검증한 후 피드 데이터를 스토리지에 기록합니다. 관련 코드 경로에서 verifyOracleProofV2()는 제출된 오라클 데이터를 반복하며, merkleSet에 캐시되지 않은 루트에 대해 requireRootVerified()를 호출하고, 머클 리프를 검증한 후 packData()를 통해 최신 피드 라운드를 기록합니다.
if (merkleSet.contains(oracle.data[i].root)) {
continue;
}
requireRootVerified(oracle.data[i].root, oracle.data[i].sigs, oracle.data[i].committee_id);
if (!merkleSet.set(oracle.data[i].root)) {
revert RootIsZero();
}
피드 업데이트의 보안은 requireRootVerified()가 설정된 오라클 위원회에 의해 진정으로 서명되지 않은 루트를 거부하는 데 달려 있습니다.
취약점 분석
버그가 있는 컨트랙트는 Supra 오라클 검증자 (0.0.4323006)입니다.
근본 원인은 상위 Supra 오라클 검증자의 잘못된 BLS 검증 경로였습니다. 익스플로잇 트랜잭션은 위원회 ID 2와 제로화된 서명 값 [0, 0]을 사용하여 페어 425(SAUCE/WHBAR)에 대한 가격 업데이트를 제출했습니다.
정상적인 BLS 검사에서 검증자는 페어링 프리컴파일을 호출하기 전에 서명과 공개 키가 0이 아니고, 곡선 위에 있으며, 올바른 부분 그룹에 속하는지 검증해야 합니다. 취약한 검증자는 제로 서명 포인트와 제로 위원회 공개 키 포인트로 페어링 검사를 구성했습니다. 항등 포인트에 대한 페어링 곱이 수학적으로 유효하기 때문에 헤데라 페어링 프리컴파일이 true를 반환했으며, 이는 실제 위원회 서명이 존재해서가 아니었습니다.
검증자는 입력 유효성을 검사해야 하며, 프리컴파일은 페어링 방정식만 확인합니다. 페어링 전에 제로 포인트를 거부하는 로직이 누락되어 오라클이 위조된 루트를 수락하고 조작된 가격 데이터가 스토리지에 저장될 수 있었습니다.
function requireHashVerified_V2(
bytes32 _message,
uint256[2] calldata _signature,
uint256 committee_id
) public view {
bool callSuccess;
bool checkSuccess;
(checkSuccess, callSuccess) = BLS.verifySingle(
_signature,
committee_public_key[committee_id],
BLS.hashToPoint(domain, abi.encode(_message)),
blsPrecompileGasCost
);
if (!callSuccess) {
revert BLSInvalidPublicKeyorSignaturePoints();
}
if (!checkSuccess) {
revert BLSIncorrectInputMessaage();
}
}
공격 분석
다음 분석은 트랜잭션 0.0.995584-1783731093-686041919를 기반으로 합니다.
-
1단계: 공격자는 담보로 250
SAUCE를 Bonzo Lend에 예치했습니다. -
2단계: 공격자는 Supra의 풀 오라클 컨트랙트에 악성 오라클 업데이트를 제출했습니다. 이 업데이트는 위에서 설명한 제로화된 BLS 서명 증명을 사용하면서
SAUCE가격을 극도로 부풀려진 값으로 설정했습니다.

-
3단계:
verifyOracleProofV2()는requireRootVerified()가 성공적으로 반환된 후 제출된 루트를 수락했습니다. 해당 함수는 머클 리프 데이터를 검증하고 최신 피드 라운드에 대해packData()를 호출하여 조작된SAUCE/WHBAR값이 최신 저장 오라클 값이 되도록 했습니다. -
4단계: Bonzo Lend는 오라클에서 최신
SAUCE가격을 읽었습니다. 저장된 피드 값이 이미 부풀려져 있었기 때문에, 프로토콜은 공격자의 250SAUCE담보를 실제 시장 가치보다 훨씬 더 높은 가치로 계산했습니다. -
5단계: 공격자는 부풀려진 담보 가치를 기반으로 약 660만
USDC와 3,450만WHBAR를 차입했습니다. 비정상적인 가격은 이후 합법적인 오라클 업데이트가SAUCE를 정상 범위로 복구할 때까지 유지되었습니다.
결론
이번 사고는 대출 풀 회계 버그가 아닌 오라클 검증 실패였습니다. 공격자는 SAUCE 시장을 조작하거나 Bonzo Lend의 내부 담보 검사를 우회할 필요가 없었습니다. 위조된 가격은 상위 Supra 오라클 검증자에게 수락되어 피드에 기록되었고, Bonzo Lend는 정상적인 가격 읽기 경로를 통해 이를 소비했습니다.
외부 피드를 소비하는 프로토콜은 전체 오라클 검증 경로의 보안 가정을 그대로 상속합니다. BLS 기반 오라클 업데이트의 경우, 페어링 프리컴파일이 호출되기 전에 제로 포인트를 반드시 거부해야 합니다. 암호화 레이어에서의 입력 유효성 검사는 선택 사항이 아닙니다. 페어링 방정식의 수학적 유효성이 기본 서명의 진위를 의미하지는 않습니다.
참고 자료
- [1] Bonzo Finance 사고 보고서



