배경
four.meme 은 pump.fun과 유사하게 Binance Academy에서 육성한 미메코인 런치패드입니다.
저희는 플랫폼 상의 미메코인 스노보드( https://four.meme/token/0x4abfd9a204344bd81a276c075ef89412c9fd2f64 )가 해커의 공격을 받았다는 것을 감지했습니다. 손실액은 약 15,000달러였습니다. 공격 트랜잭션은 다음과 같습니다: https://bscscan.com/tx/0x2902f93a0e0e32893b6d5c907ee7bb5dabc459093efa6dbc6e6ba49f85c27f61
공격 및 사고 분석
Four.meme 기술 원리
four.meme은 BNB 스마트체인의 Pump.fun과 비슷한 미메코인 런치패드입니다. 비슷한 런치패드 플랫폼에는 3가지 주요 단계가 있습니다.
• 1단계: 사용자는 이름, 로고, 설명, 소셜 계정(선택 사항) 등을 사용자 지정하여 플랫폼에서 미메코인을 만듭니다.
• 2단계: 다른 사용자는 플랫폼에서 미메코인을 사고 팔 수 있습니다.
• 3단계: 미메코인의 시장 가치가 일정 수준(24 BNB)에 도달하면 DEX(PancakeSwap)로 이전됩니다.
아래에서 각 단계의 구체적인 기술적 세부 사항을 자세히 살펴보겠습니다.
1단계
런치패드 플랫폼에서 사용자는 인터페이스를 통해 만들고자 하는 미메코인에 대한 구체적인 정보를 입력합니다.

양식을 작성한 후, 처리 수수료를 지불하면 미메코인 온체인 계약 생성이 완료됩니다. 물론 이 계약은 런치패드의 공식 계약에 의해 생성되므로 생성된 ERC-20 토큰의 소유자는 런치패드의 공식 계약이기도 합니다. 아래에서는 four.meme이 만든 미메코인의 예를 살펴보겠습니다.
먼저, 사용자가 처리 수수료를 지불하고, 런치패드 공식 계약을 통해 미메코인 ERC-20 토큰 계약의 배포가 완료되고, 1,000,000,000개의 초기 자금이 주조됩니다(미메코인의 총 가상 풀은 30BNB가 될 것으로 예상됨).

그러면 생성된 토큰의 소유자가 런치패드 공식 웹사이트의 스마트 계약자임을 알 수 있습니다.

즉, memecoin은 launchpad에서 사용자가 생성하지만 체인의 ERC-20 계약 소유자는 실제로 사용자가 아닙니다. 이를 통해 사용자가 스스로 채굴하는 것과 같은 악의적인 행동을 방지할 수 있습니다. 미메코인 스마트 계약이 체인에 배포되면 두 번째 단계로 진입하고 플랫폼의 모든 사용자가 매수 및 매도할 수 있습니다.
2단계
플랫폼의 다른 사용자는 플랫폼을 통해 사고 팔 수 있지만, 사고 팔기 후의 토큰은 전송을 통해 다른 사용자에게 양도할 수 없습니다. 체인에서 ERC-20 토큰의 소스 코드를 살펴볼 수 있습니다.

_beforeTokenTransfer에서 전송은 매개변수 _mode에 의해 제한됩니다.

이 시점에서 2단계의 토큰에 해당하는 _mode가 1, 즉 MODE_TRANSFER_RESTRICTED임을 알 수 있으며, 이는 제3자 전송을 제한합니다.

이 조치는 장외(OTC) 거래가 가격에 영향을 미치는 것을 방지하기 위한 것입니다. 매수 또는 매도 시, four.meme 계약은 먼저 _mode를 2로 설정한 다음 transfer를 사용하여 사용자에게 자금을 이체합니다. 이체가 완료되면 _mode가 1로 설정되어 다른 사용자가 자금을 이체하는 것을 제한합니다. 구매 후 미메코인 전송을 완료하세요.

3단계
미메코인의 시장 가치가 24 BNB에 도달하면, 본딩 커브 프로세스가 100%에 도달합니다. Launchpad 임원진은 남은 20%의 미메코인과 24개의 BNB를 DEX 팬케이크스왑으로 이전할 예정입니다. 이 시점에서 3단계는 공식적으로 완료되었습니다. 다음 거래는 Memecoin을 PancakeSwap으로 공식 런치패드에서 이전하는 것입니다.


먼저, launchpad가 공식적으로 memecoin의 _mode를 0, 즉 MODE_NORMAL로 설정하여 사용자가 장외 거래를 수행할 수 있도록 한 것을 볼 수 있습니다. 다음으로, Launchpad는 공식적으로 memecoin과 WBNB의 거래 쌍을 생성하고, 마지막으로 23.5BNB(그 중 0.5 BNB는 수수료)와 2억 memecoin 유동성을 거래 쌍에 추가했습니다. 유동성을 추가하는 데 드는 비용은 sqrtPriceX96 = 27169599998237907265358521입니다. sqrtPriceX96의 계산 공식은 다음과 같습니다.

따라서 유동성을 추가할 때 이 미메코인의 가격은 0.0000001175 WBNB이고, 이는 23.5 WBNB를 2억 미메코인으로 나누어도 구할 수 있습니다. 즉, DEX로 이전하는 각 코인의 가격은 동일합니다. 둘 다 0.0000001175 WBNB입니다.
공격 원칙
이제 four.meme에서 memecoin의 전체 라이프 사이클을 이해했으므로 공격 프로세스를 자세히 살펴보겠습니다. 첫째, 공격자는 미리 초기화된 DEX 거래 쌍을 생성했습니다. 또한, 거래 쌍의 sqrtPriceX96은 10000000000000000000000000000000000000000000000으로 설정되어 정상 값보다 368058418256012배 큽니다.

Memecoin의 채권 생성 프로세스가 100%에 도달하면 LaunchPad는 Memecoin을 DEX로 마이그레이션할 때 createAndInitializePoolIfNecessary를 사용하여 거래 쌍을 생성합니다. 거래 쌍은 공격자에 의해 이전에 생성되고 초기화되었기 때문입니다. 따라서 유동성은 공격자가 생성 시점에 초기화한 가격으로 추가됩니다. 이는 미메코인의 가격을 설명할 수 없을 정도로 인상하는 것과 같습니다.

현재 런치패드는 1개의 미메코인과 23.5개의 WBNB를 사용하여 유동성을 추가했습니다. 이후, 의심되는 공격자는 1,600개의 미메코인을 사용해 거래 쌍으로 23.4개의 WBNB를 교환하여 공격을 종료했습니다.

요약하다
이 취약점의 원인은 Four.meme의 내부 디스크에서의 본딩 커브 프로세스가 DEX로 마이그레이션할 때 100%였기 때문입니다. createAndInitializePoolIfNecessary를 사용하여 PancakeSwap 거래 쌍을 생성합니다. 거래 쌍이 미리 생성되어 있는 상황은 고려되지 않습니다. 공격자가 미리 생성하고 초기화한 거래 쌍을 잘못 사용했기 때문에 공격자가 설정한 잘못된 가격을 이용하여 유동성이 추가됩니다. 이로 인해 마이그레이션 이후 미메코인의 가격이 급등하였고, 공격자는 자신이 보유한 미메코인을 이용해 풀에 있는 WBNB를 비워 공격을 완료하였습니다. 프로젝트 당사자는 경제 모델과 코드 운영 로직을 설계할 때 다자간 검증을 수행하는 것이 좋으며, 온라인으로 계약을 감사하기 전에 교차 감사를 위해 여러 감사 회사를 선택하는 것이 좋습니다.
