배경 소개
최근 우리는 Base의 프로젝트인 CloberDEX 에 대한 온체인 공격을 모니터링했습니다.
https://basescan.org/tx/0x8fcdfcded45100437ff94801090355f2f689941dca75de9a702e01670f361c04
공격을 받은 프로젝트는 CloberDEX였으며, 이번 공격으로 공격자는 약 133 ETH, 즉 약 500,000 USD의 이익을 얻었습니다. 이 프로젝트의 주요 기능은 다음과 같습니다: open은 A에서 B로, B에서 A로의 거래 쌍을 포함하는 새로운 거래 풀을 엽니다. 또한 각 거래 쌍에는 사전 설정된 거래 전략이 포함되어 있으며 민트는 거래 쌍에 유동성을 추가하고 LP 토큰을 얻습니다. burn은 LP 토큰을 파괴하기 위해 해당 통화를 얻습니다.
공격 및 사고 분석
먼저, 공격자는 플래시론을 이용해 Morpho Blue에서 267 WETH를 빌렸습니다.
그런 다음 공격자는 open을 사용하여 CloberDEX에 두 개의 거래 쌍, 즉 Token/WETH와 WETH/Token을 개설했습니다. 그 중 Token은 공격자가 직접 배포한 계약입니다.
그런 다음 공격자는 유동성을 추가하고 LP 토큰을 얻기 위해 민트를 사용하여 각각 267 WETH 및 267 토큰을 새로 개설된 거래 쌍으로 전송했습니다.
지금까지는 문제가 없습니다. 마지막으로, 공격자는 새로 획득한 LP 토큰을 소각하기 위해 소각을 사용합니다. 소각의 구체적인 구현을 살펴보겠습니다.
제어 흐름은 잠금 기능으로 이동합니다. 마찬가지로 잠금의 구체적인 구현을 살펴보겠습니다.
바이트 caldata 데이터가 잠금 함수의 lockAcquired 함수에 전달되는 것을 볼 수 있습니다. 이 함수의 구현을 계속 살펴보겠습니다.
우리는 이 코드 줄을 찾았습니다
이 코드에 의해 호출되는 함수는 데이터에 의해 결정된다는 것을 알 수 있습니다. 그런 다음 데이터의 처음 4바이트는 이때 _burn의 서명이므로 기본적으로 burn 호출은 _burn입니다.
_burn이 pool.strategy.burnHook(msg.sender, key, burnAmount,supply)를 다시 호출하고 풀의 예약 처리가 이 코드 뒤에 있음을 알 수 있습니다. 따라서 여기서 문제가 발생합니다. 거래 쌍에 해당하는 풀의 전략 계약 주소가 공격자에 의해 제어될 수 있습니다. 이번 공격에서 공격자는 자신의 공격 계약 주소로 0x32fb1bedd95bf78ca2c6943ae5aeaeaafc0d97c1 주소를 작성했습니다.
계약 프로세스가 공격 계약의 BurnHook에 도달하면 계속해서 burn을 호출하여 재진입 공격을 완료합니다.
공격자는 이 취약점을 이용하여 CloberDEX 계약에 투자한 264 WETH 중 133 WETH를 인출했고, 플래시론 대출금을 반환한 후 133.7 ETH, 약 500,000 USD의 수익을 올렸습니다.
요약
이 취약점의 주요 원인은 CloberDEX 프로젝트 측 컨트랙트가 LP 토큰을 획득하고 파기하는 코드에서 재진입 감지 및 보호를 수행하지 않고 컨트랙트 호출 후 상태 변수가 업데이트되어 궁극적으로 공격자가 이를 사용하게 된다는 점입니다. 프로젝트 측을 비우는 재진입 취약점. 프로젝트 당사자는 경제 모델, 가격 계산 메커니즘 및 코드 작동 논리를 설계할 때 다자간 검증을 수행하고 계약이 온라인화되기 전에 교차 감사를 위해 여러 감사 회사를 선택하는 것이 좋습니다.