2025년 2월 23일, Hegic Options 프로토콜이 해킹되어 약 80,000달러의 손실이 발생했습니다.
Hegic는 이더리움(ETH)과 wBTC와 같은 암호화폐 자산에 대한 콜 옵션과 풋 옵션을 무신뢰성, 비 수탁형 방식으로 거래할 수 있는 탈중앙화된 옵션 거래 프로토콜입니다. 유동성 공급자가 옵션 계약을 지원하는 풀에 자산을 예치하는 피어 투 풀 모델로 운영됩니다. 사용자는 맞춤형 행사 가격과 기간의 옵션을 구매할 수 있으며, 유동성 공급자는 수수료와 보상을 받습니다.
그러나 해킹된 계약은 오래된 것이며 실제 운영에 사용되지 않았을 수 있습니다. 계약 내에 상당한 금액이 있었기 때문에 해킹되었습니다.
주요 정보
공격자: https://etherscan.io/address/0x4B53608fF0cE42cDF9Cf01D7d024C2c9ea1aA2e8
취약한 계약: https://etherscan.io/address/0x7094E706E75E13D1E0ea237f71A7C4511e9d270B#code
공격 트랜잭션 1: https://etherscan.io/tx/0x260d5eb9151c565efda80466de2e7eee9c6bd4973d54ff68c8e045a26f62ea73
공격 트랜잭션 2: https://etherscan.io/tx/0x444854ee7e7570f146b64aa8a557ede82f326232e793873f0bbd04275fa7e54c
취약점 분석
공격 트랜잭션을 살펴보면 악성 트랜잭션 내에서 withdrawWithoutHedge
함수가 반복적으로 호출되는 것을 볼 수 있습니다.
withdrawWithoutHedge
함수를 for 루프 내에서 호출하기만 하면 계약을 비울 수 있는 것 같습니다. 어떻게 이런 일이 가능했을까요? withdrawWithoutHedge
함수에 어떤 제한이 있나요? 소스 코드를 살펴보겠습니다.
withdrawWithoutHedge
함수는 _withdraw
함수를 호출하는 외부 함수입니다. _withdraw
함수 내에서 현재 "tranche"의 t.share
에서 전송할 amount
가 계산됩니다. 그러나 t.share
는 인출 후 업데이트되지 않습니다. 코드에서 현재 tranche에 대한 상태 확인 라인(require(t.state == TrancheState.Open)
)이 주석 처리되어 있는 것을 볼 수 있습니다.
취약한 계약은 2022년 1월 4일에 배포된 Hegic WBTC Puts Pool 계약으로, 그 이후로 거의 상호 작용이 없었습니다.
교훈
이번 해킹 사례는 프로토콜이 레거시 또는 사용되지 않는 계약의 자금을 철저히 추적하고 관리해야 한다는 것을 보여줍니다. 또한 유사한 취약점을 방지하기 위해서는 계약 배포 전 철저한 코드 검토와 감사가 의무적이어야 합니다.