배경 소개

최근 우리는 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를 빌렸습니다.

제로타임 기술 || CloberDEX 공격 이벤트 분석

그런 다음 공격자는 open을 사용하여 CloberDEX에 두 개의 거래 쌍, 즉 Token/WETH와 WETH/Token을 개설했습니다. 그 중 Token은 공격자가 직접 배포한 계약입니다.

제로타임 기술 || CloberDEX 공격 이벤트 분석

그런 다음 공격자는 유동성을 추가하고 LP 토큰을 얻기 위해 민트를 사용하여 각각 267 WETH 및 267 토큰을 새로 개설된 거래 쌍으로 전송했습니다.

제로타임 기술 || CloberDEX 공격 이벤트 분석

지금까지는 문제가 없습니다. 마지막으로, 공격자는 새로 획득한 LP 토큰을 소각하기 위해 소각을 사용합니다. 소각의 구체적인 구현을 살펴보겠습니다.

제로타임 기술 || CloberDEX 공격 이벤트 분석

제어 흐름은 잠금 기능으로 이동합니다. 마찬가지로 잠금의 구체적인 구현을 살펴보겠습니다.

제로타임 기술 || CloberDEX 공격 이벤트 분석

바이트 caldata 데이터가 잠금 함수의 lockAcquired 함수에 전달되는 것을 볼 수 있습니다. 이 함수의 구현을 계속 살펴보겠습니다.

제로타임 기술 || CloberDEX 공격 이벤트 분석

우리는 이 코드 줄을 찾았습니다

제로타임 기술 || CloberDEX 공격 이벤트 분석

이 코드에 의해 호출되는 함수는 데이터에 의해 결정된다는 것을 알 수 있습니다. 그런 다음 데이터의 처음 4바이트는 이때 _burn의 서명이므로 기본적으로 burn 호출은 _burn입니다.

제로타임 기술 || CloberDEX 공격 이벤트 분석

_burn이 pool.strategy.burnHook(msg.sender, key, burnAmount,supply)를 다시 호출하고 풀의 예약 처리가 이 코드 뒤에 있음을 알 수 있습니다. 따라서 여기서 문제가 발생합니다. 거래 쌍에 해당하는 풀의 전략 계약 주소가 공격자에 의해 제어될 수 있습니다. 이번 공격에서 공격자는 자신의 공격 계약 주소로 0x32fb1bedd95bf78ca2c6943ae5aeaeaafc0d97c1 주소를 작성했습니다.

계약 프로세스가 공격 계약의 BurnHook에 도달하면 계속해서 burn을 호출하여 재진입 공격을 완료합니다.

제로 타임 기술 || CloberDEX 공격 사고 분석

공격자는 이 취약점을 이용하여 CloberDEX 계약에 투자한 264 WETH 중 133 WETH를 인출했고, 플래시론 대출금을 반환한 후 133.7 ETH, 약 500,000 USD의 수익을 올렸습니다.

요약

이 취약점의 주요 원인은 CloberDEX 프로젝트 측 컨트랙트가 LP 토큰을 획득하고 파기하는 코드에서 재진입 감지 및 보호를 수행하지 않고 컨트랙트 호출 후 상태 변수가 업데이트되어 궁극적으로 공격자가 이를 사용하게 된다는 점입니다. 프로젝트 측을 비우는 재진입 취약점. 프로젝트 당사자는 경제 모델, 가격 계산 메커니즘 및 코드 작동 논리를 설계할 때 다자간 검증을 수행하고 계약이 온라인화되기 전에 교차 감사를 위해 여러 감사 회사를 선택하는 것이 좋습니다.