Back to Blog

#2: 오일러 파이낸스 사건: 2023년 최대 규모의 해킹

Code Auditing
February 9, 2024
5 min read

2023년 3월 13일, 당사 시스템은 Euler Finance의 대출 풀이 플래시 론 공격을 받아 1억 9,700만 달러의 손실이 발생했음을 감지했습니다. 당사는 먼저 커뮤니티에 경고를 전달한 후, 근본 원인 파악에 도움이 되는 분석을 제공했습니다.

이번 사건의 근본 원인은 donateToReserves() 함수 내에 지급 불능 검사가 없었기 때문입니다. 구체적으로, 취약한 컨트랙트는 사용자가 자신의 포지션이 건전한지 여부를 확인하지 않고 담보를 프로토콜에 기부할 수 있는 기능을 제공했습니다. 더욱 심각한 것은, 이 불량 포지션을 처리하기 위해 프로토콜이 청산자에게 더 적은 부채를 지불하고 해당 포지션을 청산할 수 있도록 큰 할인을 제공했다는 점입니다. 공격자는 이 기능을 악용하여 대규모 포지션을 만들고 이를 지급 불능 상태로 만들었습니다. 그런 다음 할인된 가격으로 자신의 담보를 매입하여 이익을 얻을 수 있었습니다.

배경

Euler Finance 개요

Euler Finance는 이더리움 기반의 대출 프로토콜로, 사용자가 지정된 토큰을 빌려주거나 빌릴 수 있습니다. 대출자가 Euler의 유동성 풀에 예치하면, 그에 상응하는 양의 EToken(이자가 붙는 ERC20 토큰)이 발행되어 전송됩니다. 이 EToken은 예치한 기초 자산으로 상환할 수 있습니다.

반면, 유동성을 빌리는 차용자는 DToken을 받습니다. 이 DToken은 ERC20 호환 토큰으로, 보유자가 독립적으로 소각하는 것을 방지합니다. 구체적으로, 토큰을 누구에게나 전송할 수 있도록 허용하는 대신, 누구든지 가져갈 수 있지만 이를 수락하려면 승인이 필요합니다. 기초 자산 측면에서, 차용자는 대출에 대한 이자를 지불할 책임이 있으며, 이 이자의 일부는 프로토콜의 불량 채무를 충당하는 데 사용됩니다.

Euler Finance의 레버리지 차입(일명 셀프 차입)과 소프트 청산 메커니즘은 이번 공격의 원인을 더 잘 이해하는 데 도움이 되는 두 가지 핵심 개념입니다.

레버리지 차입

Euler Finance는 레버리지 차입 기능을 제공하여 사용자가 재귀적 차입 전략을 시뮬레이션할 수 있게 합니다. 간단히 말해, 사용자는 담보를 예치하고 EToken을 발행할 수 있으며, 이를 다시 담보로 사용하여 더 많은 EToken을 빌릴 수 있습니다. 컨트랙트는 또한 부채 토큰으로서 그에 상응하는 양의 dToken을 발행합니다. 사용자 포지션의 건전성은 EToken과 dToken의 가치를 기반으로 계산됩니다. Euler Finance의 문서에 따르면, 사용자는 최대 19배까지 레버리지를 활용할 수 있습니다. 레버리지 차입 기능은 이번 사건에서 중요한 역할을 했습니다. 이 기능의 도움 없이는 공격자가 이익을 얻을 수 없었을 것입니다. 레버리지 차입을 통해 공격자는 플래시 론으로 얻은 초기 자금의 약 11배에 달하는 포지션 규모를 키웠습니다.

소프트 청산

Euler Finance의 백서에 설명된 바와 같이, 소프트 청산 메커니즘은 Compound나 Aave와 같은 프로토콜에서 채택한 고정 계수 청산 방식에 제한받지 않고, 청산자가 청산 대상의 부채 상환을 유연하게 도울 수 있게 합니다. 소프트 청산이란 포지션의 건전성이 낮을수록 청산 가능한 담보 비율이 높아진다는 것을 의미하며, 이번 사건의 데이터에 따르면 불량 채무 발생 시 최대 75%까지 청산될 수 있습니다. 따라서 상당한 할인으로 청산된 담보는 공격자가 플래시 론을 상환하고 이익을 확보할 수 있게 해주었습니다.

취약점 분석

주요 취약점, 즉 지급 불능 검사의 부재는 donateToReserves() 함수 내에 존재하며, 이 함수는 사용자가 자신의 포지션에서 EToken을 프로토콜의 준비금으로 기부하는 데 사용됩니다. 일반 사용자의 경우, 이러한 행동을 수행할 인센티브나 동기가 일반적으로 없습니다. 실제로, 취약점은 donateToReserves() 함수가 사용자 포지션에서 EToken을 전송할 때 건전성 검사를 수행하지 않는다는 점에 있습니다. 이로 인해 공격자는 레버리지 차입을 통해 생성된 대규모 포지션에서 EToken을 직접 기부하여 포지션의 건전성을 100% 이하로 떨어뜨리고 불량 채무를 발생시킬 수 있었습니다.

설계에 따라 Euler Finance는 동적 청산 계수를 사용하여 포지션을 "소프트 청산"합니다. 간단히 말해, 포지션의 건전성이 낮을수록 해당 포지션 내 담보 중 청산될 수 있는 비율이 높아집니다. 불량 채무의 경우, 청산 비율은 포지션 내 담보의 최대 75%에 달할 수 있습니다(실제 공격 트랜잭션을 기준으로 계산). 결과적으로, 할인된 가격으로 청산된 상당한 양의 담보는 공격자가 플래시 론을 상환하고 이익을 얻을 수 있게 해주었습니다.

공격 분석

서로 다른 풀을 대상으로 하는 여러 공격 트랜잭션이 있습니다:

  • 0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d (DAI)
  • 0x71a908be0bef6174bccc3d493becdfd28395d8898e355d451cb52f7bac38617 (WBTC)
  • 0x62bd3d31a7b75c098ccf28bc4d4af8c4a191b4b9e451fab4232258079e8b18c4 (wstETH)
  • 0x465a6780145f1efe3ab52f94c006065575712d2003d83d85481f3d110ed13d9 (USDC)
  • 0x3097830e9921e4063d334acb82f6a79374f76f0b1a8f857e89b89bc58df1f311 (stETH)
  • 0x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f (WETH)

공격 단계는 다음과 같습니다(첫 번째 공격 트랜잭션을 예시로):

  1. 공격자는 AAVE에서 플래시 론을 통해 3,000만 DAI를 빌렸습니다.
  2. 공격자는 2,000만 DAI를 예치하고 2,000만 eDAI를 돌려받았습니다.
  3. Euler Finance가 레버리지 차입 기능을 제공하므로, 공격자는 1억 9,500만 eDAI와 2억 dDAI를 발행할 수 있었습니다. 이제 공격자는 2억 1,500만 eDAI와 2억 dDAI를 보유합니다.
  4. 위 단계에 이어서, 1,000만 부채를 상환하여 공격자가 더 많은 eDAI를 발행할 수 있게 했습니다. 이제 공격자는 2억 1,500만 eDAI와 1억 9,000만 dDAI를 보유합니다.
  5. 3단계가 반복되었습니다. 이제 공격자는 4억 1,000만 eDAI와 3억 9,000만 dDAI를 보유합니다.
  6. 공격자는 donateToReserve 함수를 호출하여 1억 eDAI를 기부했습니다. 그러나 이 과정에서 공격자의 건전성 계수가 확인되지 않았습니다. 이 경우 포지션은 청산 가능한 상태(3억 1,000만 eDAI 대 3억 9,000만 dDAI)가 되어 이익을 얻을 기회가 생겼습니다.
  7. 공격자는 또 다른 주소 컨트랙트를 청산자(0xa0b3...)로 사용하여 포지션을 청산했습니다. 청산자(0xa0b3...)는 3억 1,000만 eDAI와 2억 5,900만 dDAI를 받았습니다.
  8. 공격자는 청산자의 포지션(0xa0b3...)에서 3,890만 eDAI를 소각하여 3,890만 DAI를 인출했습니다(지급 불능 검사로 인해 더 이상 인출 불가).
  9. 공격자는 플래시 론을 상환했습니다.

주요 공격 단계 2~7은 트랜잭션 추적에 표시되어 있습니다.

요약

이번 사건은 2023년 최대 규모의 해킹으로, Federico Jaime라는 20세 아르헨티나인이 1억 9,700만 달러라는 기록적인 금액을 탈취했으며, 그는 언론에 "복잡하고 때로는 혼란스러우며 심지어 모순적인 이야기"를 제공했습니다. 그럼에도 불구하고, "회수 가능한 모든 자금"은 이후 Euler Finance의 트레저리 주소로 반환되었습니다. 그러나 소액(약 20만 달러)이 "의도치 않게" 미국 재무부의 제재를 받은 북한 국가 지원 범죄 조직으로 알려진 라자루스 그룹에 전송되었습니다. 자세하고 흥미로운 이야기는 link2link2 링크를 참조하시기 바랍니다.

이번 사건의 근본 원인은 지급 불능 검사의 부재였으며, 이는 교훈으로 삼아야 합니다. 실제로 대출 프로토콜의 경우, 사용자 포지션에 영향을 미칠 수 있는 모든 절차에 포지션 건전성 검사를 구현해야 하는지 여부를 평가하는 것이 매우 중요합니다. 또한, 프로젝트 팀은 대출 프로토콜에서 대규모 청산을 능동적으로 모니터링하고, 이러한 이벤트를 신속하게 감지하고 대응하기 위한 효과적인 경보 시스템을 구축해야 합니다.

이 시리즈의 다른 기사 읽기:

Sign up for the latest updates
~$160만 손실: Moke 토큰, LpdFi 익스플로잇 | BlockSec 위클리
Security Insights

~$160만 손실: Moke 토큰, LpdFi 익스플로잇 | BlockSec 위클리

2026년 8월 3~9일, BNB 체인에서 2건의 보안 사고가 발생해 총 약 160만 달러의 손실이 발생했으며, 모두 가격 조작이 원인이었습니다. LpdFi(약 69.7만 달러)는 PancakeSwap 유동성 풀을 주문 평가와 이자 정산에 동시 사용해 공격자가 원금을 부풀리고 과도한 이자를 탈취했습니다. Moke Token(약 90.6만 달러)은 조작 가능한 현물 가격과 중복 LP 배당 회계를 결합해 MOKE를 부풀려 BNB 배당을 반복 수령했습니다.

COLDCARD 사건: 지갑의 "무작위" 시드가 무작위가 아니었을 때
Security Insights

COLDCARD 사건: 지갑의 "무작위" 시드가 무작위가 아니었을 때

COLDCARD 펌웨어의 빌드 통합 버그로 비트코인 시드 생성이 취약한 소프트웨어 RNG로 라우팅되어 지갑 시드가 오프라인 복구 가능해졌습니다. 시드 자체의 취약점이므로 펌웨어 업데이트로 해결 불가하며, 2026년 8월 7일 기준 확인된 피해는 1,405 BTC(~9,100만 달러), 비공개 추정치는 최대 2,055 BTC입니다.

~$88M 손실: COLDCARD 및 LULA 익스플로잇 | BlockSec 위클리
Security Insights

~$88M 손실: COLDCARD 및 LULA 익스플로잇 | BlockSec 위클리

2026년 7월 27일~8월 2일, 비트코인과 BNB 체인에서 약 8,800만 달러 손실을 유발한 두 건의 보안 사고가 발생했습니다. COLDCARD 사고는 하드웨어 지갑 펌웨어의 엔트로피 오류로, RNG 매크로 활성화 여부 미확인으로 결정론적 폴백이 실행되어 약 1,370 BTC(~8,800만 달러)가 탈취됐습니다. BNB 체인의 LULA 토큰은 비즈니스 로직 취약점으로 `recycle()` 함수가 악용되어 PancakeSwap V2 유동성에서 약 57만 8천 달러가 유출됐습니다.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit
#2: 오일러 파이낸스 사건: 2023년 최대 규모의 해킹