배경 소개
2024년 11월 25일, 우리는 BNB 스마트 체인에 대한 공격을 모니터링했으며, 공격받은 프로젝트는 DCF 였습니다. 공격 트랜잭션은
https://bscscan.com/tx/0xb375932951c271606360b6bf4287d080c5601f4f59452b0484ea6c856defd6fd
이 공격으로 인해 총 약 440,000달러의 손실이 발생했습니다.
공격 및 사고 분석
먼저, 공격자는 flashloan을 사용해 일련의 PancakeSwapV3 Pool에서 대량의 BUSD를 빌렸습니다.
이후 공격자는 PancakeSwap의 스왑 기능을 이용하여 변환된 토큰을 먼저 전송한 후 콜백 함수에서 토큰을 지불하고, 일련의 재귀 스왑을 통해 대량의 BUSD를 획득했습니다.
그리고 공격자는 공격을 수행하는 데 사용된 주체를 획득한 후 DCF 프로젝트를 공격하기 시작했습니다.
첫 번째 단계:
공격자는 보유한 모든 DCF를 공격 계약으로 이전하고,
2단계:
공격자는 80,435,691 BUSD를 사용하여 4,039 DCF를 0x16600100b04d17451a03575436b4090f6ff8f404로 교환했습니다.
3단계:
공격자는 남은 29,919,679 BUSD를 사용하여 1,062,693 DCT를 공격 계약으로 교환했습니다.
4단계:
공격자는 전송을 사용하여 82 DCF를 PancakeSwap 쌍 BUSD-DCF로 전송했습니다. DCF 전송의 구체적인 구현을 살펴보겠습니다.
보시다시피 to가 PancakeSwap pair의 주소일 때 빨간색 박스 안의 코드가 실행되면서 여기에 취약점이 나타납니다. deadcfg가 2이므로 이 코드는 PancakeSwap 쌍에서 전송된 DCF 양의 약 절반을 파괴하고 최종적으로 동기화합니다. 이 작업으로 인해 PancakeSwap 쌍 BUSD-DCF의 DCF 수량이 크게 줄어들고 DCF 가격이 크게 상승하게 됩니다. 이번 작업을 통해 DCF 가격은 171 BUSD에서 1,708,540,682,977,674 BUSD로 9,991,465,982,325배 증가했습니다. DCF 전달 함수의 liquidHepler.addLiquidity 코드는 PancakeSwap 쌍 BUSDDCT의 DCT 일부를 소비하므로 DCT 가격도 상승합니다.
마지막으로 공격자는 손에 남은 DCF를 이용해 PancakeSwap 쌍 BUSD-DCF에 있는 72,612,978 BUSD를 비웠습니다. 위의 작업으로 인해 DCT 가격도 상승했기 때문에 공격자가 이전에 29,919,679 BUSD로 교환한 DCT의 가치는 38,302,987 BUSD가 되었습니다. 마지막으로 공격자가 플래시론으로 빌린 BUSD를 반환한 후 수익은 442,028 BUSD였습니다.
요약
이 취약점의 원인은 프로젝트 팀이 DCF의 전달 기능을 구현할 때 잘못된 로직을 작성했기 때문입니다. 이로 인해 공격자는 해당 쌍의 DCF를 스왑 쌍으로 전송하여 파괴할 수 있으므로 DCF 가격을 쉽게 조작할 수 있습니다. 드디어 차익거래가 완료되었습니다. 프로젝트 당사자는 계약을 온라인으로 진행하기 전에 교차 감사를 위해 여러 감사 회사를 선택하는 것이 좋습니다.