Euler Finance Flash Loan Attack 분석
Blog/외부 Blog

Euler Finance Flash Loan Attack 분석

※ 본 게시물은 'PLAINBIT' 재직 당시 작성한 블로그 글을 공유하는 것입니다.

원문 참고 : https://blog.plainbit.co.kr/euler-finance-flash-loan-attack/


※ 본 게시글의 암호화폐 주소 추적은 BIG의 암호화폐 추적 솔루션인 "QLUE"를 사용했습니다.

1. 필요한 배경 지식

  • Flash Loan : 승인, 실행 및 모두 한 번의 거래로 상환되는 무담보 대출
  • Euler Finance : 사용자가 다양한 암호화 자산을 대출하고 빌릴 수 있도록 설계된 이더리움 DeFi 렌딩(담보대출) 프로토콜
  • eToken(담보 토큰), dToken(부채 토큰) : dToken 양이 eToken 양을 초과하면 청산이 시작

2. 사건 개요

2023년 03월 13일

  • Euler Finance에 대한 flash loan 공격으로 DAI, USDC, wBTC, staked Ether(stETH)의 거래에서 약 2억 달러의 손실 발생
wstETH, stETH, wETH, wBTC란?
- wstETH(Wrapped stETH) : stETH를 wrapper에 예치하고 받은 토큰. Uniswap 및 MakerDAO를 포함한 DeFi 프로토콜과 쉽게 통합 가능
- stETH(Staked Ether) : 이더리움(ETH)을 리도(Lido)서비스에 맡기고 지급 받는 토큰. 이더리움 2.0 스테이킹의 단점을 개선하기 위해 출시
- wETH(Wrapped ETH) : DeFi 플랫폼에서 ETH를 자유롭게 다른 토큰들과 교환할 수 있도록 ERC-20 토큰화 시킨 이더리움(ETH)
- wBTC(Wrapped BTC) : 비트코인을 이더리움 환경에서 쓰기 위해 비트코인을 담보로 하는 스테이블 토큰의 일종.

[그림 1] Euler Finance Flash Loan 공격 관련 기사

2-1) 공격 관련

  • 2023년 03월 13일 08:50:59 (UTC) DeFi 대출 프로토콜인 Euler Finance을 겨냥한 Flash Loan Attack 시작
  • Euler Finance의 스마트 컨트랙트 중 donateToReserves() 함수의 취약점을 이용
  • DAI($8.8 M), USDC($34.1 M), wBTC($18.9 M), stETH($137.1 M)의 거래에서 약 2억 달러 이상의 손실 발생
  • 공격자는 탈취한 자금을 ETH와 DAI로 변환
  • 자금은 Tornado Cash, Lazarus Group, 피해자 등의 주소로 나뉘어 전송

2-2) 원인

[그림 2] donateToReserves() 함수

※ donateToReserves() 함수의 취약점

EToken.sol 파일의 donateToReserves() 함수에서 사용자의 부채가 담보보다 적은(eToken > dToken) 것을 확인하는 ‘checkLiquidity()’ 함수가 빠진 것을 볼 수 있다.

따라서 기부를 수행하는 계정에 대한 포지션 확인을 하지 않기 때문에, 사용자는 레버리지 예금의 일부를 자발적으로 포기해서 자신의 포지션을 불균형하게 만든 뒤, Euler 청산 프로토콜을 통해 자신의 포지션을 청산함으로써 이익을 획득할 수 있다.

Euler 청산 프로토콜
Euler 프로토콜에서 스스로 청산하면 비율 기반 청산 인센티브에 대한 규정으로 인해 부채를 할인

[그림 3] 정상적인 함수 예시

정상적인 함수의 경우 [그림 3]과 같이 함수가 동작하고 나서 checkLiquidity()를 호출해서 사용자의 포지션을 체크한다.

[그림 4] checkLiquidity() 함수와 callInternalModule()함수

checkLiquidity() 함수는 RiskManager를 호출하고 callInternalModule() 함수에서 사용자의 eToken이 dToken 보다 많다는 것을 확인하고 보장한다.

2-3) 입장

2-4) Euler 재단 측 대응

  • 예금 및 취약한 기부 기능을 차단하는 eToken 모듈을 비활성화
  • TRM Labs, Chainalysis 및 ETH 보안 커뮤니티와 협력 조사 및 자금 복구 작업을 위해 노력
  • 미국 및 영국 법 집행 기관에 정보 공유
  • 공격자를 식별하는 데 도움되는 정보 제공 시, 100만 달러의 보상금 발표

2-5) 공격자와 합의

  • 공격자에게 탈취 자금을 환원한다면, 10%를 가져도 된다는 제안을 온 체인 메시지로 전송
  • 공격자가 3월 18일 탈취금의 일부를 반환, 3월 20일부터 본격적인 합의 시작
  • 회수 가능한 자금을 모두 회수
  • 공격자에게 걸었던 100만 달러 현상금을 취소

3. Flash Loan Attack 과정 분석

  • 탈취 자금 입금 주소
    • 0xb66cd966670d962c227b3eaba30a872dbfb995db
    • 0xb2698c2d99ad2c302a95a8db26b08d17a77cedd4
  • 공격에 사용된 스마트 컨트랙트 주소
    • 0xeBC29199C817Dc47BA12E3F86102564D640CBf99
    • 0x036cec1a199234fc02f72d29e596a09440825f1c

본 게시글에서는 공격 과정에 대해 간략하게 작성했다. 스마트 컨트랙트 흐름에 대한 자세한 분석은 'Euler Finance Flash Loan 스마트 컨트랙트 상세 분석'에 작성했다.

‘첫 번째 스마트 컨트랙트(0xebc29199c817dc47ba12e3f86102564d640cbf99)’에서 한 번의 DAI 거래가 이루어졌고, ‘두 번째 스마트 컨트랙트(0x036cec1a199234fc02f72d29e596a09440825f1c)’에서 USDC, wBTC, stETH, wETH 거래와 두 번의 wstETH 거래가 이루어졌다. 공격자는 총 7회의 Flash Loan Attack으로 자금을 탈취했다.

[그림 5] 첫 번째 Flash Loan Attack (DAI) 과정

2023년 3월 13일 오전 8시 50분 59초, 첫 번째 Flash Loan Attack (DAI)

  • 1 : Aave의 Flash Loan으로 30,000,000 DAI를 대출한 후 공격을 위해 2개의 스마트 컨트랙트 0x583c21631c48d442b5c0e605d624f54a0b366c72(Violator), 0xa0b3ee897f233f385e5d61086c32685257d4f12b(Liquidator)를 이용
  • 2,3,4 : Euler 프로토콜 계약에 2천만 DAI를 갚기로 하고, 1,956만 eDAI를 발급
  • 5 : Euler 프로토콜은 예치금의 최대 10배까지 빌릴 수 있음, 1억 9,560만 eDAI를 발급
  • 6 : 빌린 금액(eDAI)에 상응하는 2억 dDAI를 발급
  • 7,8 : 1천만 DAI를 상환해서, 1천만 dDAI를 소멸
  • 9,10 : 다시 예치금의 최대 10배인 1억 9,560만 eDAI와 2억 dDAI를 발급
  • 11 : donateToReserves() 함수를 호출해서 부채 상환에 필요한 금액의 10배인 1억 eDAI를 기부
  • 12,13 : Euler Protocol 내부 알고리즘에 의해 부채가 할인된 값, 청산 금액(dDAI)
  • 14 : 13의 청산 수수료 2%에 해당하는 값
  • 15 : 현재 남아있는 eDAI의 합
  • 16 : 청산을 통해 사용자가 얻을 수익금 (DAI)
  • 17 : DAI를 돌려받기 위해 지출한 담보 (eDAI)
  • 18 : 청산 프로세스가 완료된 후 사용자의 수익금 전달 (38,904,507.35 DAI)
  • 19 : Flash Loan 대출금의 이자 전송
  • 20 : Flash Loan 대출금 및 수수료 상환 (30,027,000 DAI)
  • 21 : Flash Loan 공격을 통해 획득한 차익 전송 (8,877,507.3484 DAI)

공격자가 사용한 Flash Loan Attack 과정은 모두 비슷한 프로세스로 진행되기 때문에, 첫 번째 Flash Loan Attack 과정을 이해했다면 다음 Flash Loan Attack 과정은 금방 이해할 수 있을 것이다.


이어지는 내용은 회사 블로그를 참고해주세요^^