배경 소개

최근 우리는 BnbSmartChain의 DCFToken 프로젝트에 대한 온체인 공격을 모니터링했습니다.

https://bscscan.com/tx/0xa88b907960c3c5a9dfcfd28aff12136359034653e34fa6d7bb9a6ef9c7a0532f

공격받은 프로젝트는 DCFToken이며, 공격자는 이번 공격으로 약 8,800 USD의 수익을 올렸습니다.

공격 및 사고 분석

먼저 공격자는 새로운 컨트랙트를 생성한 후 컨트랙트를 호출하여,

제로아워 기술 || DCFToken 공격 이벤트 분석

그런 다음 계약은 플래시를 사용하여 PancakeSwapV3Pool에서 2,750,000 BUSDT를 빌렸습니다.

제로아워 기술 || DCFToken 공격 이벤트 분석

이후 공격자는 플래시에서 빌린 초기 자금을 사용하여 DCFToken에 대한 공격을 시작했습니다. 첫 번째 단계에서 공격자는 프로젝트의 미개봉 계약(BUSDT에서 DUSD로)의 교환 기능을 사용하여 해당 계약의 모든 DUSD를 BUSDT로 교환합니다. 이 기능의 서명은 0xabb81c12입니다.

디컴파일을 통해 다음과 같이 이 함수의 구체적인 구현을 얻을 수 있습니다.

제로아워 기술 || DCFToken 공격 이벤트 분석

첫 번째 단계:

BUSDT와 DUSD의 교환 비율은 stor_5에 의해 제어되는 것을 코드에서 볼 수 있습니다. 공격 시 stor_5는 1000이므로 BUSDT와 DUSD의 교환 비율은 1:1입니다. 따라서 공격자는 10,927 BUSDT를 사용하여 계약의 모든 DUSD를 교환했습니다.

제로아워 기술 || DCFToken 공격 이벤트 분석

2단계:

DUSD를 사용하여 DCFToken을 구매하세요. 이 함수의 서명은 0x62ee2f14입니다. 디컴파일하면 다음과 같은 구체적인 구현을 볼 수 있습니다.

제로아워 기술 || DCFToken 공격 이벤트 분석

간단히 말해서, 이 함수는 DUSD를 사용하여 DCFToken을 구매하는 기능을 구현하며, 구매 가격은 PancakeSwapV2의 BUSDT 및 DCFToken 가격에 따라 결정됩니다. 이는 이 함수의 논리에서 DUSD와 BUSDT의 가격이 1:1임을 의미합니다.

그러면 구매한 DCFToken의 1%가 시스템 주소로 전송됩니다.

이후 공격자는 1단계에서 구매한 DUSD를 모두 사용하여 DCFToken을 구매했습니다.

제로아워 기술 || DCFToken 공격 이벤트 분석

그런 다음 공격자는 프로젝트 측이 DUSD와 DCFToken을 교환하는 데 사용되는 계약에서 DCF를 단락시킬 때까지 위 단계를 반복합니다. 이후 공격자는 PancakeSwapV2의 교환 기능을 이용해 자신의 손에 있는 DCFToken을 BUSDT로 교환하여 DCFToken의 가격을 조작했습니다. 이 교환 후 DCFToken의 가격은 1 BUSDT = 126 DCFToken에서 1BUSDT = 3 DCFToken으로 상승했습니다.

상환 전:

제로아워 기술 || DCFToken 공격 사고 분석

상환 후:

제로아워 기술 || DCFToken 공격 사고 분석

3단계:

공격자는 프로젝트 계약에서 DCFToken을 비운 후 계약의 DCFToken을 사용하여 DUSD로 교환합니다. 이 함수의 서명은 0xd5088d27이며 이는 두 번째 단계에서 DUSD를 사용하여 DCFToken을 구매하는 것과 유사합니다. 마찬가지로 구매 가격은 PancakeSwapV2의 BUSDT 및 DCFToken 가격에 따라 결정됩니다. 이는 이 함수의 논리에서 DUSD와 BUSDT의 가격이 1:1임을 의미합니다. 그러면 구매한 DUSD의 1%가 시스템 주소로 전송됩니다.

제로아워 기술 || DCFToken 공격 사고 분석

4단계:

이후 공격자는 프로젝트 당사자의 계약에서 DUSD를 BUSDT로 교환하는 기능을 사용합니다. 이 기능의 서명은 0xfea1cdc9이며 교환 비율은 1:1이지만 BUSDT의 1%가 프로젝트 당사자의 주소로 전송됩니다.

제로아워 기술 || DCFToken 공격 이벤트 분석

공격자는 프로젝트 계약의 BUSDT가 빌 때까지 3단계와 4단계를 계속 반복합니다.

마지막으로 공격자는 남은 DCFToken을 사용하고 PancakeSwapV2를 사용하여 모두 BUSDT로 교환했으며, 플래시 대출과 이자를 반환한 후 8,763 BUSDT의 수익을 올렸습니다.

쉽게 말하면, 이번 프로젝트의 허점은 거래소의 가격 계산에 나타난다. DCFToken의 가격은 PancakeSwap에 따라 다릅니다. 그러나 프로젝트 계약 교환의 사용은 DCFToken의 가격에 영향을 미치지 않습니다. 따라서 공격자는 먼저 BUSDT를 사용하여 DUSD로 교환한 다음 DCF(99%)로 교환하여 DCFToken을 비운 다음 PancakeSwap의 스왑을 사용하여 DCFToken의 가격을 높이고 마지막으로 DCFToken을 사용하여 DUSD(99%)로 교환한 다음 BUSDT(99%)로 교환하여 수익을 완료하세요.

요약

이 취약점의 주요 원인은 DCFToken 프로젝트 당사자 계약이 DCFToken 가격을 획득할 때 단일 소스인 PancakeSwapV2를 통해 이를 계산하여 공격자가 가격을 조작하고 궁극적으로 가격 차액을 차익거래에 사용한다는 것입니다. 프로젝트 당사자는 경제 모델, 가격 계산 메커니즘 및 코드 작동 논리를 설계할 때 다자간 검증을 수행하고 계약이 온라인화되기 전에 교차 감사를 위해 여러 감사 회사를 선택하는 것이 좋습니다.