복기: MOBOX 해킹 분석
작성자: Doris, 느린 안개 기술
배경
2024년 3월 14일, 느린 안개 MistEye 보안 모니터링 시스템의 경고에 따르면, Optimism 체인上的 탈중앙화 대출 프로토콜 MOBOX가 공격을 받아 약 75만 달러의 손실을 입었습니다. 느린 안개 보안 팀은 이 공격 사건에 대한 분석을 진행하고 결과를 아래와 같이 공유합니다:
(https://twitter.com/SlowMist_Team/status/1768167772230713410)
관련 정보
공격자 주소:
0x4e2c6096985e0b2825d06c16f1c8cdc559c1d6f8
0x96f004c81d2c7b907f92c45922d38ab870a53945
공격당한 계약 주소:
0xae7b6514af26bcb2332fea53b8dd57bc13a7838e
공격 거래:
0x4ec3061724ca9f0b8d400866dd83b92647ad8c943a1c0ae9ae6c9bd1ef789417
공격 핵심
이번 공격의 핵심 포인트는 두 가지입니다. 첫 번째는 공격자가 계약 내의 borrow() 함수의 취약점을 이용하여, 매번 해당 함수를 호출할 때마다 추천인 주소에 대한 보상 분배가 발생합니다. 보상의 계산은 전송된 토큰의 수량에 따라 결정되므로, 공격자는 추천인에게 주어진 보상을 다시 공격 계약으로 전송하여 다음 대출의 수량을 증가시킬 수 있습니다. 두 번째는 매번 borrow() 함수를 호출할 때 풀 내의 일부 MO 토큰이 소각되므로, MO 토큰의 가격이 지속적으로 상승하게 되고, 결국 공격자는 계속해서 대출을 받고 보상을 중첩하여 이익을 얻을 수 있습니다.
거래 분석
우리는 전체 공격의 흐름이 주로 취약한 borrow() 함수를 반복 호출한 후, 즉시 redeem()을 호출하여 상환하고, 추천인에게 분배된 토큰을 공격 계약으로 전송하는 방식임을 알 수 있습니다.
borrow() 함수를 분석해 보면, 매번 해당 함수를 호출할 때마다 풀 내의 일부 MO 토큰이 소각된다는 것을 알 수 있습니다.
그러나 대출된 USDT의 수량은 풀 내의 MO 토큰 가격에 따라 계산되며, MO 토큰의 가격이 소각으로 인해 지속적으로 상승하게 되어, 결국 공격자는 적은 수의 MO 토큰으로 많은 USDT 토큰을 대출받을 수 있게 됩니다.
또한, 매번 대출할 때마다 추천인 주소에 분배 보상이 주어지며, 해당 함수는 전달된 MO 토큰의 수량에 따라 계산됩니다.
그러나 추천인 주소도 공격자(0x96f004c81d2c7b907f92c45922d38ab870a53945)에 의해 제어되므로, 공격자는 대출 작업을 완료한 후 이 보상을 다시 전송하여 다음 대출의 수량과 보상을 중첩할 수 있습니다.
이러한 반복 작업을 통해 공격자는 MO 토큰의 가격을 상승시켰고, 결국 극소량의 MO 토큰으로 계약 내의 대량의 USDT를 대출받아, 불균형한 풀에서 USDT를 모두 환전하여 이익을 취하고 빠져나갔습니다.
요약
이번 공격의 핵심은 공격자가 borrow() 함수가 풀 내의 일부 토큰을 소각하는 메커니즘을 이용하여 자산을 지속적으로 대출하고, 풀 내의 토큰 가격을 상승시키며 추천인 보상을 획득한 후, 토큰을 다시 전송하고 다시 대출하여 보상과 가격을 계속해서 조작한 것입니다. 느린 안개 보안 팀은 프로젝트 측에 유사 기능 함수에 락업 시간 제한을 추가하고, 대출 가격 모델 설계 시 다양한 요소를 고려하여 유사 사건이 재발하지 않도록 할 것을 권장합니다.