2023년 3월 13일, 당사 시스템은 Euler Finance의 대출 풀이 플래시 론 공격을 받아 1억 9,700만 달러의 손실이 발생했음을 감지했습니다. 당사는 먼저 커뮤니티에 경고를 전달한 후, 근본 원인 파악에 도움이 되는 분석을 제공했습니다.
1/ @eulerfinance is attacked. The root cause is due to the lack of liquidity check in the function donateToReserves()https://t.co/stWtPWK900
— BlockSec (@BlockSecTeam) March 13, 2023
See the detailed attack steps below. https://t.co/bm10OJHiXu pic.twitter.com/TDbYuzVWHe
이번 사건의 근본 원인은 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)
공격 단계는 다음과 같습니다(첫 번째 공격 트랜잭션을 예시로):
- 공격자는 AAVE에서 플래시 론을 통해 3,000만 DAI를 빌렸습니다.
- 공격자는 2,000만 DAI를 예치하고 2,000만 eDAI를 돌려받았습니다.
- Euler Finance가 레버리지 차입 기능을 제공하므로, 공격자는 1억 9,500만 eDAI와 2억 dDAI를 발행할 수 있었습니다. 이제 공격자는 2억 1,500만 eDAI와 2억 dDAI를 보유합니다.
- 위 단계에 이어서, 1,000만 부채를 상환하여 공격자가 더 많은 eDAI를 발행할 수 있게 했습니다. 이제 공격자는 2억 1,500만 eDAI와 1억 9,000만 dDAI를 보유합니다.
- 3단계가 반복되었습니다. 이제 공격자는 4억 1,000만 eDAI와 3억 9,000만 dDAI를 보유합니다.
- 공격자는 donateToReserve 함수를 호출하여 1억 eDAI를 기부했습니다. 그러나 이 과정에서 공격자의 건전성 계수가 확인되지 않았습니다. 이 경우 포지션은 청산 가능한 상태(3억 1,000만 eDAI 대 3억 9,000만 dDAI)가 되어 이익을 얻을 기회가 생겼습니다.
- 공격자는 또 다른 주소 컨트랙트를 청산자(0xa0b3...)로 사용하여 포지션을 청산했습니다. 청산자(0xa0b3...)는 3억 1,000만 eDAI와 2억 5,900만 dDAI를 받았습니다.
- 공격자는 청산자의 포지션(0xa0b3...)에서 3,890만 eDAI를 소각하여 3,890만 DAI를 인출했습니다(지급 불능 검사로 인해 더 이상 인출 불가).
- 공격자는 플래시 론을 상환했습니다.
주요 공격 단계 2~7은 트랜잭션 추적에 표시되어 있습니다.

요약
이번 사건은 2023년 최대 규모의 해킹으로, Federico Jaime라는 20세 아르헨티나인이 1억 9,700만 달러라는 기록적인 금액을 탈취했으며, 그는 언론에 "복잡하고 때로는 혼란스러우며 심지어 모순적인 이야기"를 제공했습니다. 그럼에도 불구하고, "회수 가능한 모든 자금"은 이후 Euler Finance의 트레저리 주소로 반환되었습니다. 그러나 소액(약 20만 달러)이 "의도치 않게" 미국 재무부의 제재를 받은 북한 국가 지원 범죄 조직으로 알려진 라자루스 그룹에 전송되었습니다. 자세하고 흥미로운 이야기는 link2 및 link2 링크를 참조하시기 바랍니다.
이번 사건의 근본 원인은 지급 불능 검사의 부재였으며, 이는 교훈으로 삼아야 합니다. 실제로 대출 프로토콜의 경우, 사용자 포지션에 영향을 미칠 수 있는 모든 절차에 포지션 건전성 검사를 구현해야 하는지 여부를 평가하는 것이 매우 중요합니다. 또한, 프로젝트 팀은 대출 프로토콜에서 대규모 청산을 능동적으로 모니터링하고, 이러한 이벤트를 신속하게 감지하고 대응하기 위한 효과적인 경보 시스템을 구축해야 합니다.
이 시리즈의 다른 기사 읽기:
- 도입부: 2023년 10대 "주목할 만한" 보안 사건
- #1: Flashbots Relay의 취약점을 악용한 MEV 봇 수확
- #3: KyberSwap 사건: 극도로 미묘한 계산으로 반올림 오류를 교묘하게 악용
- #4: Curve 사건: 컴파일러 오류로 인해 무결한 소스 코드에서 잘못된 바이트코드 생성
- #5: Platypus Finance: 행운으로 세 번의 공격에서 살아남다
- #6: Hundred Finance 사건: 취약한 포크 프로토콜에서 정밀도 관련 익스플로잇의 물결을 촉발
- #7: ParaSpace 사건: 업계 역대 가장 심각한 공격을 막기 위한 시간과의 싸움
- #8: SushiSwap 사건: 서툰 구조 시도가 일련의 모방 공격으로 이어지다
- #9: MEV 봇 0xd61492: 독창적인 익스플로잇에서 포식자에서 먹잇감으로
- #10: ThirdWeb 사건: 신뢰할 수 있는 모듈 간의 비호환성이 취약점을 노출



