2025년 5월 28일, 이더리움의 Cork 프로토콜이 익스플로잇되어 [1] 약 1,200만 달러의 손실이 발생했습니다. 근본 원인은 만료 시점의 역사적 내재 수익률 평균(HIYA) 가격 조작과 Uniswap v4 훅 콜백의 접근 제어 누락이 결합된 것이었습니다. HIYA 위험 프리미엄은 만기까지의 시간이 0에 가까워질수록 지수적으로 증가하기 때문에, 만기 직전의 스왑이 HIYA를 부풀려 새로 초기화된 시장에서 Cover Token의 가격이 심각하게 낮게 책정되도록 했습니다. 동시에 CorkHook.beforeSwap에는 msg.sender 인증이 없어 조작된 파라미터로 임의의 호출이 가능했습니다. 두 가지 취약점을 모두 이용하여 공격자는 약 3,760e18개의 CT와 DS를 추가로 획득하고 이를 wstETH로 교환하여 프로토콜 준비금을 고갈시켰습니다.
0x1 배경
0x1.1 토큰 이코노믹스
Cork 프로토콜 [2]은 토큰화된 리스크를 위한 새로운 프리미티브를 도입하며, 볼트 토큰, 수익 창출 스테이블코인, 유동 (재)스테이킹 토큰과 같은 온체인 자산을 위한 프로그래머블 리스크 레이어 역할을 합니다. 핵심 구성 요소는 Cork Pool로, 시장이 구축되는 메커니즘입니다. 각 Cork Pool은 Redemption Asset(RA)과 Pegged Asset(PA)이라는 자산 쌍을 기반으로 구축됩니다.
Cork Pool은 Redemption Asset 예치를 받아 잠금 처리합니다. 그 대가로 두 가지 토큰이 발행되어 예치자에게 반환됩니다: Depeg Swap(DS)과 Cover Token(CT). 설정된 만료일 이전에는 1 DS + 1 CT/PA를 1 RA로 교환할 수 있으며, 만료 후에는 1 CT를 풀에 남아있는 RA + PA에 비례하여 상환할 수 있습니다.
0x1.2 컨트랙트 구현
DS와 CT 모두 거래 가능합니다. 사용자는 CorkHook을 통해 커스텀 AMM 커브 기반의 NormalSwap을 사용하여 CT와 RA를 거래할 수 있으며, DS와 RA는 Router와 CorkHook을 통한 FlashSwap을 사용하여 거래됩니다.
NormalSwap [커스텀 AMM 커브]:
FlashSwap [FlashSwapRouter.swapDsforRa]: 이 메커니즘은 익스플로잇의 핵심입니다. 공격자는 이후 beforeSwap에 대한 직접적이고 인증되지 않은 호출을 통해 이 경로를 트리거합니다(섹션 0x2.2).
-
구매자가
Router에 RA를 전송합니다. -
첫 번째
beforeSwap호출에서,Router는 스왑 아웃될 DS 수량을 계산합니다. 필요한 경우, Uniswap v4 풀에서 RA와 CT를 빌리고, 빌린 CT와 프로토콜의 DS를 RA로 변환하여 필요한 RA를 보관하고 빌린 RA를 Uniswap 풀에 반환합니다. -
두 번째
beforeSwap호출에서,Router는depositPsm을 통해 RA를 CT와 DS로 분해하고, 모든 DS를 사용자에게 전송하며, 빌린 CT를 Uniswap 풀에 상환하고, 남은 CT를 구매자에게 환불합니다.
발행 후 자금 분배:
0x1.3 신규 발행을 위한 가격 결정 메커니즘
프로토콜은 HIYA(역사적 내재 수익률 평균)를 사용하며, 이는 거래량() × 위험 프리미엄()의 누적 합계로 계산됩니다. HIYA는 위험 프리미엄을 측정하고 만료 시 초기화 가격을 조정하는 데 활용됩니다. HIYA가 높으면 프로토콜은 더 높은 디페그 위험을 가정하여 낮은 초기 CT 가격으로 이어집니다.
위험 프리미엄() 계산은 두 가지 구성 요소로 이루어집니다: 높은 CT 가격은 낮은 값과 상관관계가 있으며(직관적으로 이해 가능), 만료 시간 T는 지수적 증폭 효과를 가집니다. 만기에 가까워질수록 T가 0에 접근하여 지수 가 빠르게 증가합니다. 이로 인해 CT 가격의 작은 변화도 큰 위험 프리미엄 값으로 증폭됩니다.
-
는 1입니다
-
는 CT의 가격입니다
-
는 1-0 사이로 정규화된 만기까지의 시간입니다
증폭 효과 예시: CT가 (5% 할인)에 거래된다면, (만기까지 절반)에서의 위험 프리미엄은 다음과 같습니다:
(만기에 가까운 경우), 동일한 CT 가격에서의 위험 프리미엄은 다음과 같습니다:
동일한 5% CT 할인이 만기 근처에서 약 1,500배 더 큰 위험 프리미엄을 생성합니다. 이 지수적 민감도가 바로 조작 벡터입니다: 만기 직전에 실행된 스왑은 HIYA를 불균형적으로 부풀려 다음 시장의 초기화 가격을 왜곡합니다.
0x2 취약점 분석
영향을 받은 시장과 관련된 토큰은 다음과 같습니다:
| 역할 | 토큰 | 설명 |
|---|---|---|
| RA | wstETH |
Redemption Asset |
| PA | weETH |
Pegged Asset |
| DS | weETH8DS-2 |
Depeg Swap |
| CT | weETH8CT-2 |
Cover Token |
명확성을 위해 이 보고서의 나머지 부분에서는 구체적인 이름보다 추상적인 역할(RA, DS, CT)로 토큰을 지칭합니다(구별이 중요한 경우 제외).
공격자는 두 가지 서로 다른 방법으로 AMM과 Router에서 DS와 CT를 추출했습니다. DS + CT는 RA로 상환될 수 있으므로, 두 토큰을 모두 획득하면 직접적인 수익 추출이 가능합니다. 공격은 두 가지 구성 요소로 이루어집니다.
0x2.1 Cover Token 추출: HIYA 조작으로 인한 인위적으로 낮은 시장 초기화 가격
시장 기간이 만료되면 프로토콜은 이전 기간의 accumulatedHIYA를 사용하여 AMM에서 CT/RA 가격 비율을 설정함으로써 다음 기간을 초기화합니다. HIYA가 높을수록 프로토콜은 더 높은 디페그 위험으로 인식하여 낮은 초기 CT 가격으로 이어집니다.
HIYA는 모든 스왑에서 업데이트되고 위험 프리미엄을 반영하며(섹션 0x1.3), 위험 프리미엄은 에 가까워질수록 지수적으로 증가하기 때문에, 만기 직전에 실행된 스왑은 accumulatedHIYA를 수십 배 단위로 부풀립니다. 공격자는 만기 직전에 SwapRaForDs()를 호출하여 이를 악용하고, 큰 위험 프리미엄을 생성하여 HIYA에 누적시켰습니다.
새로운 시장 기간이 이후 초기화될 때, 프로토콜은 부풀려진 HIYA를 읽고 극단적인 디페그 위험으로 해석하여 CT의 초기 AMM 가격을 공정 가치보다 훨씬 낮게 설정했습니다. 그러면 공격자는 이 왜곡된 가격으로 RA를 CT로 스왑하여 저렴한 가격에 대규모 CT 포지션을 획득했습니다.
0x2.2 Depeg Swap 추출: CorkHook.beforeSwap의 접근 제어 누락
표준 Uniswap v4 훅 설계에서 beforeSwap은 스왑 중 PoolManager에 의해서만 호출됩니다. Cork의 구현은 이 제약을 강제하지 않았습니다:
// 누락: require(msg.sender == address(poolManager));
function beforeSwap(
address sender,
PoolKey calldata key,
IPoolManager.SwapParams calldata params,
bytes calldata hookData
) external override returns (bytes4, BeforeSwapDelta, uint24) {
...
}
이 검사 없이는 외부 컨트랙트가 임의의 hookData로 beforeSwap을 직접 호출할 수 있습니다. hookData가 비어있지 않으면 함수는 FlashSwap 실행 경로(섹션 0x1.2)로 진입하여 depositPsm을 통해 RA를 CT와 DS로 분해합니다. 공격자는 조작된 hookData로 beforeSwap을 직접 호출함으로써 이를 악용했으며, 가짜 시장의 토큰을 지정하여 프로토콜이 토큰을 분해하고 결과를 공격자에게 전송하도록 했습니다.
0x2.3 두 가지 취약점의 결합
두 취약점 중 어느 하나만으로는 1,200만 달러 전체를 추출하기에 충분하지 않습니다.
HIYA 조작은 공격자에게 저렴한 CT를 제공하지만, CT만으로는 RA로 상환할 수 없습니다. 상환 공식은 두 토큰 모두를 필요로 합니다: CT + DS = RA. 공격자는 여전히 DS를 획득할 방법이 필요합니다.
beforeSwap의 접근 제어 누락이 그 경로를 제공합니다. 조작된 hookData로 beforeSwap을 직접 호출함으로써, 공격자는 임의의 파라미터로 FlashSwap 분해 경로를 트리거할 수 있습니다. 이 경로를 통해 실제 DS를 획득하기 위해, 공격자는 실제 DS를 RA로 지정하는 가짜 시장을 배포한 다음 beforeSwap을 호출하여 해당 "RA"(실제 DS)를 가짜 CT와 가짜 DS로 분해하고, 이를 가짜 시장에서 실제 DS로 다시 스왑합니다.
HIYA 조작으로 획득한 CT와 인증되지 않은 beforeSwap 호출(가짜 시장을 통해)로 획득한 DS를 모두 보유한 공격자는 이를 1:1로 RA(wstETH)로 상환합니다.
0x3 공격 분석
공격은 세 개의 트랜잭션에 걸쳐 전개되며, 각각 HIYA 부풀리기, 저렴한 CT 획득, 상환 쌍 완성을 위한 DS 추출의 한 단계에 해당합니다.
0x3.1 준비 단계: HIYA 부풀리기
이 트랜잭션에서 공격자는 시장 만료 직전에 SwapRaForDs()를 호출했습니다. 가 0에 가까웠기 때문에, 이 스왑은 불균형적으로 큰 위험 프리미엄을 생성하여(섹션 0x1.3) accumulatedHIYA를 부풀렸습니다.

이 단계 후 공격자 보유 자산: 스왑으로 획득한 DS(0x3.3 단계에서 사용), 그리고 온체인에 저장된 부풀려진 accumulatedHIYA.
0x3.2 초기화 단계: 저렴한 CT 획득
이 트랜잭션에서 새로운 시장 기간이 초기화되었습니다. 프로토콜은 부풀려진 accumulatedHIYA를 읽고 AMM에서 왜곡된 CT/RA 가격 비율을 설정하여 CT를 공정 가치보다 훨씬 낮게 책정했습니다. 그러면 공격자는 약 0.000003e18 RA를 이 저평가된 가격으로 3,760e18 CT로 스왑했습니다.
이 단계 후 공격자 보유 자산: 대규모 CT 포지션(조작된 초기화 가격을 통해 저렴하게 획득).
0x3.3 추출 단계: 가짜 시장을 통한 DS 획득
이 단계는 접근 제어 취약점(섹션 0x2.2)을 사용하여 DS를 추출하고, RA 상환에 필요한 CT + DS 쌍을 완성합니다. 핵심 기법은 실제 DS를 상환 자산으로 취급하는 가짜 시장입니다:
| 가짜 시장 역할 | 실제 토큰 | 목적 |
|---|---|---|
| 가짜 RA | 실제 DS (weETH8DS-2) |
실제 DS가 분해 경로에 진입할 수 있도록 함 |
| 가짜 CT | 가짜 RA 분해로 발행됨 | 중간 단계; 실제 DS로 다시 스왑됨 |
| 가짜 DS | 가짜 RA 분해로 발행됨 | 중간 단계; 실제 DS로 다시 스왑됨 |
공격 트랜잭션의 핵심 단계:
-
공격자가 먼저 합법적인 시장에서 RA를 DS로 스왑했습니다.
공격자 보유: 실제 DS.
-
공격자가 가짜 시장을 배포하고 초기화하여 실제 DS를 가짜 RA로 지정했습니다.
-
공격자가 비어있지 않은
hookData로beforeSwap을 직접 호출하여(접근 제어 누락 악용) 가짜 시장에 대한 FlashSwap 실행 경로를 트리거했습니다.hookData내에서 공격자는paymentToken을 가짜 CT로 지정하여 프로토콜이 가짜 시장에 대한 RA 분해 로직을 실행하도록 했습니다.
-
프로토콜이 모든 가짜 RA(즉, 실제 DS)를 가짜 CT와 가짜 DS로 분해했습니다. 가짜 DS 전체가 공격자에게 전송되었고, 가짜 CT 부분(최소
paymentAmount제외)은 환불되었습니다.공격자 보유: 3,761e18 가짜 CT + 3,761e18 가짜 DS (모두 실제 DS에서 파생됨).
-
공격자가 가짜 시장 내에서 가짜 CT와 가짜 DS를 가짜 RA로 다시 스왑하여 실제 DS를 회수했습니다.
공격자 보유: 3,761e18 실제 DS (회수됨).
-
공격자가 회수한 DS와 섹션 0x3.2에서 획득한 CT를 결합하여 RA(wstETH)를 상환하고 수익 추출을 완료했습니다.
공격자 보유: 3,760e18 RA(wstETH) 수익 (즉, 1,200만 달러).
요약
이 사건은 두 가지 독립적인 취약점을 결합하여 — 각각 단독으로는 충분하지 않지만 — 프로토콜에서 1,200만 달러를 탈취한 단일 익스플로잇 체인을 구성했습니다.
- 만기 근처에서의 지수적 위험 프리미엄. HIYA 가격 결정 공식은 만기까지의 시간이 0에 가까워질수록 위험 프리미엄을 증폭시켜, 만기 직전의 스왑이 시장 재초기화 가격에 대한 조작 벡터가 되게 합니다.
- 훅 콜백의 발신자 검증 누락.
CorkHook.beforeSwap은msg.sender가PoolManager인지 강제하지 않아, 임의의 파라미터로 직접 호출이 가능하여 공격자가 FlashSwap 실행 경로를 스푸핑할 수 있었습니다. - 블라인드 스팟으로서의 모듈 간 상호작용. 경제적 설계(HIYA 기반 가격 결정)와 접근 제어 취약점(인증되지 않은 훅 콜백)은 별개의 모듈에 존재했습니다. 이들의 상호작용은 단일 모듈 분석으로는 발견하기 어려운 익스플로잇 가능한 경로를 만들었습니다.
참고문헌
BlockSec 소개
BlockSec은 풀스택 블록체인 보안 및 암호화폐 컴플라이언스 제공업체입니다. 저희는 고객이 프로토콜과 플랫폼의 전체 수명 주기에 걸쳐 코드 감사(스마트 컨트랙트, 블록체인 및 지갑 포함), 실시간 공격 차단, 사고 분석, 불법 자금 추적, AML/CFT 의무 이행을 수행할 수 있도록 돕는 제품과 서비스를 구축합니다.
BlockSec은 권위 있는 학술 대회에서 다수의 블록체인 보안 논문을 발표했으며, DeFi 애플리케이션의 여러 제로데이 공격을 보고하고, 다수의 해킹을 차단하여 2,000만 달러 이상을 구제했으며, 수십억 달러의 암호화폐를 보호했습니다.
-
공식 웹사이트: https://blocksec.com/
-
공식 트위터 계정: https://twitter.com/BlockSecTeam



