Paraluni 공격 이벤트 분석

创宇区块链安全实验室
本文约1855字,阅读全文需要约7分钟
해커는 재진입 취약점을 악용하여 Paraluni를 공격하고 170만 달러 이상의 수익을 올렸으며 그 중 약 1/3이 Tornado에 돌아갔습니다.

1. 소개

1. 소개

2022년 3월 13일 베이징 시간에 KNOW Chuangyu Blockchain Security Lab은 BSC의 Paraluni 프로젝트가 공격을 받았고 해커들이 약 170만 달러의 이익을 챙긴 것을 모니터링했습니다. Chuangyu Blockchain Security Lab이 후속 조치를 취하고 이 사건을 심도 있게 분석할 것임을 알아두십시오.

2. 분석

2.1 기본 정보

공격자 주소: 0x94bc1d555e63eea23fe7fdbf937ef3f9ac5fcf8f

공격자 계약: 0x4770b5cb9d51ecb7ad5b14f0d4f2cee8e5563645

공격 트랜잭션 해시: 0x70f367b9420ac2654a5223cc311c7f9c361736a39fd4e7dff9ed1b85bab7ad54

마스터셰프 계약: 0xa386f30853a7eb7e6a25ec8389337a5c6973421d

UBT 토큰 계약(공격자가 생성): 0xca2ca459ec6e4f58ad88aeb7285d2e41747b9134

UGT 토큰 계약(공격자가 생성): 0xbc5db89ce5ab8035a71c6cd1cd0f0721ad28b508

2.2 프로젝트 배경

Paralluni 프로젝트는 싱가포르의 Parallel Universe Foundation에서 출시한 Binance Smart Chain을 기반으로 하는 익명의 프로젝트입니다.

공격 프로세스를 보다 명확하게 하기 위해 이 공격을 분석을 위해 두 단계로 나눕니다.

  • 텍스트

공격 전 단계

  • 1. 공격자는 UBT와 UGT라는 두 개의 토큰 계약을 생성하고 배포합니다. UBT: MasterChef의 deposit() 함수 및withdrawalAsset() 함수에 대한 호출을 실현하기 위해 transferFrom 함수를 다시 작성합니다. UGT: ERC20 토큰 표준 2의 토큰 계약. 공격자는 flash Loan을 사용하여 156,984 BSC-USD와 157,210 BUSD를 PancakeSwap에서 빌려주었습니다. 3. 대출된 USDT 및 BUSD로 해당 ParaPair에 유동성을 추가하고 155,935 Paraluni LP 토큰을 UBT 계약으로 가져옵니다. 이때 얻은 Lp 토큰은 후속 공격에 중요한 지원을 제공합니다.

핵심 공격 단계

1. MasterChef 계약에서 depositByAddLiquidity 함수를 호출하고 들어오는 매개변수는 _pid: 18, _token: [UGT, UBT], _amounts: [1, 1]입니다. 이는 풀 18 섹스에 1 UGT 및 1 UBT를 추가한다는 의미입니다.

2. 그런 다음 내부에서 depositByAddLiquidityInternal 함수를 호출합니다.이 함수의 주요 기능은 addLiquidityInternal 함수를 호출하여 LP 토큰을 발행한 다음 _deposit 함수를 호출하여 LP 토큰을 사용자 주소에 입금하는 것입니다. 그러나 이 기능은 사용자가 전달한 _tokens가 풀 번호 _pid가 있는 토큰과 일치하는지 여부를 확인하지 않습니다. 따라서 공격자는 자신이 만들고 배포한 악성 토큰을 사용하여 후속 중요한 작업을 수행할 수 있습니다.

3. depositByAddLiquidityInternal은 내부적으로 addLiquidityInternal 함수를 호출하여 컨트랙트 내 LP 토큰 잔고 변동에 따라 필요한 예치금을 계산합니다.

4. paraRouter.addLiquidity에 addLiquidityInternal 함수가 호출되면 공격자가 공격 전 단계에서 배포한 UBT 토큰 계약의 transferFrom 함수가 호출되어 유동성 추가 작업이 완료됩니다.

그러나 악의적인 컨트랙트가 transferFrom을 재작성한 후 MasterChef의 deposit() 함수를 호출하여 사전 공격 단계 3단계에서 획득한 LP 토큰을 masterChef로 전송하게 되는데, 이때 masterChef의 LP 잔액이 변경되어, 그런 다음 _deposit 함수를 호출하여 사용자 주소에 LP 토큰을 입금하고 이때 첫 번째 LP 토큰을 얻습니다.

그러면 악의적인 계약의 transferFrom이 deposit()을 호출할 때 _deposit 함수도 호출하여 사용자 주소에 LP 토큰을 입금합니다. 이는 2개의 LP 토큰을 얻는 것과 같습니다.

5. 공격자는 UBT 컨트랙트에서 withdrawAsset 함수를 호출하고 공격 컨트랙트를 사용하여 Mastechef 컨트랙트에서 인출 함수를 호출하여 두 개의 동일한 LP를 공격 컨트랙트로 추출합니다.

6. 마지막으로 유동성을 제거하여 310,000 BSC-USD 및 310,000 BUSD를 획득한 후 플래시론을 반환하여 공격을 완료합니다.

3. 취약점 핵심

이 공격은 주로 MasterCheif 컨트랙트의 depositByAddLiquidity 함수가 사용자가 전달한 _tokens가 풀 번호가 _pid인 토큰과 일치하는지 여부를 확인하지 않았고 외부 호출이 재진입 문제를 고려하지 않았다는 사실에 주로 기인합니다. 재진입 잠금을 추가하여 결과적으로 공격자는 재진입 공격을 위해 외부 악성 토큰 계약을 전달할 수 있습니다.

4. 요약