2025년 2월 12일, zkLend 파이낸스 프로토콜이 공격을 받아 약 950만 달러의 손실이 발생했습니다.
zkLend는 Starknet 블록체인에서 운영되는 탈중앙화된 대출 프로토콜입니다. 사용자들이 자산을 대출하고 차입할 수 있도록 합니다. 이는 아베(AAVE) 또는 컴파운드(COMP)와 같은 프로토콜과 유사합니다.
이번 공격은 사용자들이 자산을 대출하고 차입할 수 있게 해주는 주요 계약인 zkLend Market 계약(특히 wstETH 시장)을 목표로 했습니다.
주요 정보
공격자 주소: https://voyager.online/contract/0x04d7191dc8eac499bac710dd368706e3ce76c9945da52535de770d06ce7d3b26
취약한 계약(zkLend Market): https://voyager.online/contract/0x04c0a5193d58f74fbace4b74dcf65481e734ed1714121bdc571da345540efa05
샘플 공격 트랜잭션: https://voyager.online/tx/0x596bb905f74b545ca5a2af39c5724d952e43ef9887af3f6fd603eebfcc9c2a
공격 분석
공격자 주소를 살펴보면 공격 당시 여러 트랜잭션이 발생했음을 알 수 있습니다.
공격을 이해하기 위해서는 먼저 runwithfirstdep을 호출하는 트랜잭션을 살펴봐야 합니다. 이 트랜잭션이 가장 중요한 것으로 보입니다.
runwithfirstdep 트랜잭션에서 우리는 zkLend Market 계약에 대한 여러 번의 연속적인 deposit 및 withdraw 호출을 볼 수 있습니다. 먼저 한 개의 deposit 호출을 자세히 살펴보겠습니다.
deposit과 withdraw 호출의 금액이 같지 않은 것을 볼 수 있습니다. 이는 단순한 입금 및 출금 트랜잭션이 아님을 나타냅니다. 여기서 공격자는 4.069 wstETH만 입금했지만 6.103 wstETH를 인출했습니다. 따라서 deposit과 withdraw 함수의 코드를 살펴봐야 합니다.
deposit 함수의 코드를 살펴보면 입력 토큰의 amount를 받아 해당 금액의 zToken을 발행합니다. withdraw 함수도 마찬가지입니다. 그런데 공격자가 왜 더 많은 zToken을 소각할 수 있었을까요? 이를 이해하기 위해 zToken 계약의 burn 함수 구현을 살펴봐야 합니다.
burn 함수 구현을 보면 실제로 소각되는 금액은 scaledDownAmount라는 것을 알 수 있습니다. 또한 safe_math::sub() 함수를 살펴보면 scaledDownAmount를 계산하는 공식이 amount * SCALE / accumulator라는 것을 알 수 있습니다.
이 값을 공격 트랜잭션에서 확인해 보면 다음과 같습니다:
amount:
6103946859077466029(출금 호출)accumulator:
4069297906051644020000000000000000000000000000SCALE:
1000000000000000000000000000
이 값들을 이용해 scaledDownAmount를 계산하면 다음과 같습니다:
scaledDownAmount = amount * SCALE / accumulator
= 6103946859077466029 * 1000000000000000000000000000 / 4069297906051644020000000000000000000000000000
= 1
따라서 공격자가 scaled_down_amount.is_non_zero() 검사를 우회하기 위해 이 값을 의도적으로 선택했음을 알 수 있습니다. runwithfirstdep 트랜잭션 전의 deposit 트랜잭션은 get_lending_accumulator() 함수의 결과를 조작하여 이 값을 훨씬 더 크게 만들었습니다.
사후 분석
공격 이후 도난당한 자금은 Starknet에서 이더리움 블록체인으로 브리징되었습니다. 공격자는 Railgun 프라이버시 풀에 자금을 예치하여 자금을 세탁하려 했지만 프로토콜의 정책에 의해 저지되었습니다. 이번 실패한 자금 세탁 시도는 DeFi 영역에서 프라이버시와 투명성의 균형이 얼마나 중요한지를 보여줍니다.
교훈
이번 사건은 특히 복잡하고 민감한 금융 작업을 다룰 때 스마트 계약에서 입력 값에 대한 철저한 검증의 중요성을 강조합니다. 이와 같은 사건들로부터 교훈을 얻어 DeFi 커뮤니티가 더 강력한 시스템을 구축하고 사용자 자금을 더 잘 보호할 수 있을 것입니다.











