BlockSec DeFi 공격 분석 시리즈 4 오해: Sanshu Inu의 Memestake 계약 공격 이벤트 분석
BlockSec
2021-08-03 07:27
本文约5655字,阅读全文需要约23分钟
DeFi 보안 사고를 체계적으로 분석하고 보안 사고의 근본 원인을 분석합니다.

탈중앙화 금융(DeFi)은 블록체인 생태계에서 인기 있는 프로젝트 형태로서 보안이 특히 중요합니다. 지난해부터 수십 건의 보안 사고가 발생했다.

블록섹은 DeFi 보안에 관한 장기 연구 팀(https://blocksecteam.com)으로서 다수의 DeFi 보안 사고를 독자적으로 발견했으며 연구 결과는 유수 보안 컨퍼런스(USENIX Security, CCS 및 검은 모자). 다음 시간에는 DeFi 보안 사고를 체계적으로 분석하고 보안 사고의 근본 원인을 분석할 것입니다.

지난 리뷰:

(1)지난 리뷰:

(2)[BlockSec DeFi 공격 분석 시리즈 중 하나] 나 자신을 대변합니다: ChainSwap 공격 이벤트 분석

(3)[BlockSec DeFi 공격 분석 시리즈 2] 모두 공짜: Sushiswap 수수료 도난

[BlockSec DeFi 공격 분석 시리즈 3] 하늘을 훔치고 하루를 바꾼다: Akropolis 공격 사건 심층 분석

0xffffffff.서문

베이징 시간으로 2021년 7월 21일 03:40에 공격 탐지 시스템이 비정상적인 거래를 감지했습니다. 이번 거래에 대한 확장 분석을 통해 우리는 이것이 Sanshu Inu가 배포한 Memestake 계약의 보상 계산 메커니즘의 취약점을 공격하기 위해 디플레이션 토큰(디플레이션 토큰) KEANU 메커니즘을 사용한 사건임을 발견했습니다. 약 56 ETH 개인. 다음과 같은 세부 분석은 다음과 같습니다.

  • 읽기 제안:

  • DeFi(이더리움)가 처음이신 분들은 처음부터 읽으시면 되지만 글이 비교적 길기 때문에 잘 못 읽으시는 분들은 주의를 하시고 떠나시기 바랍니다.

Akropolis와 같은 DeFi 애그리게이터 프로젝트에 대해 더 잘 이해하고 있다면 "0x2 공격 분석"에서 바로 시작할 수 있습니다.

0x0. 배경 소개

올해 초부터 Dogecoin(DOGE)과 Shiba Inucoin(SHIB)이 많은 관심을 받았고 동시에 다른 관련 meme 코인이 인기를 끌면서 많은 프로젝트 당사자가 자체 meme을 개발했습니다. 코인을 제공하고 밈 코인을 중심으로 밈 코인을 제공합니다.Sanshu Inu가 회원입니다. Sanshu Inu는 밈 코인 SANSHU를 발행했을 뿐만 아니라 밈 코인을 위한 파밍 풀로 Memestake 계약을 생성했습니다. 사용자는 Memestake에서 meme 코인을 약정하는 한 토큰 Mfund를 보상으로 받을 수 있습니다.

반면에 많은 수의 밈 코인은 디플레이션 토큰입니다. 즉, 이러한 토큰의 발행은 점차 감소할 것입니다. 일부 밈 코인의 디플레이션은 사용자가 거래 이체(이체)를 할 때마다 일정 비율의 코인을 차감하여 파기 및 재분배하는 방식으로 이루어지며, 이로 인해 수신자가 받는 실제 토큰 금액은 실제 지불 금액보다 적습니다. 지불인 양에 의하여. 이번에 참여한 디플레이션 토큰 KEANU는 이런 종류의 구현을 채택합니다.

공격의 일반적인 원리는 Memestake가 여러 KEANU 전송을 수행하도록 제어하여 보유하고 있는 KEANU의 수를 줄이는 것입니다. Memestake가 많은 양의 Mfund를 보내도록 보상 계산 기능의 허점을 사용합니다. 공격자.

0x1. 코드 분석

이해의 편의를 위해 먼저 이 공격과 관련된 두 가지 물리적 계약인 KEANU 토큰의 KeanuInu 계약과 Memestake 계약을 간단히 소개합니다.

키아누이누 계약


앞서 언급한 바와 같이 키아누이누는 토큰 KEANU의 양도를 실현할 때 일정 비율의 코인을 차감하여 파기 및 재분배하며, 파기 비율은 고정값인 2%로 설정됩니다. 그림과 같이 키아누이누의 transfer(), transferFrom() 함수 호출 시 함수 호출에 표시된 이체 금액과 emit 이벤트 로그에 기록된 이체 금액이 일치하지 않습니다.http://tx.blocksecteam.com:8080/실제 코드 구현 호출의 복잡성으로 인해 여기에 표시되지 않으며 관심 있는 친구는 나중에 부록에 제공된 계약 주소에 따라 etherscan.io에서 계약 구현을 확인할 수 있습니다. 또한 위의 두 스크린샷은 현재 오픈베타 단계인 자체 개발 거래 분석 도구의 스크린샷입니다. 클릭을 환영합니다

시도하십시오. 우리 도구가 프로세스 중에 생성된 이벤트 로그와 함수 호출을 결합하는 방식은 디플레이션 토큰과 같은 문제를 분석하는 데 더 유용합니다.

밈스테이크 계약

아래 그림은 MemeStake의 입금 기능입니다. 함수는 먼저 updatePool을 호출하여 자금 풀의 상태를 업데이트한 다음 사용자의 토큰을 자신에게 전송합니다. 들어오는 _amount가 0보다 크면 코드의 1295행에서 전송이 수행됩니다.

하지만 KEANU 토큰의 디플레이션 특성으로 인해 safeTransferFrom 함수 호출 시 전달된 금액은 _amount이지만 실제 펀드 풀로 이체된 금액은 _amount보다 적습니다. 그리고 코드 분석에서 우리는 전송 대상이 자신, 즉 MemeStake의 경우 특정 통화(예: KEANU 토큰)의 모든 사용자 예금이 MemeStake에 속한다는 것을 알아냈습니다.

이체 후 1296행에서 MemeStake는 사용자의 예치금을 등록하는데, 여기에 등록된 것은 여전히 ​​_amount(실제 이체 금액은 _amount보다 적음)이므로 사용자의 실제 예치금은 등록된 user.amount보다 작습니다.

마지막으로 1299행에서 user.rewardDebt 매개변수도 (실제 값보다 큰) user.amount를 기준으로 계산되는 것을 볼 수 있습니다.

아래 그림은 MemeStake의 인출 기능입니다. 이 함수는 먼저 user.amount에 충분한 잔고가 있는지 확인하지만 user.amount 자체가 실제 값보다 크기 때문에 여기서 확인하는 것은 정확하지 않습니다. 다음으로 updatePool 함수도 호출되어 자금 풀의 상태를 업데이트합니다.

1321행에서 인출 함수는 먼저 user.amount에 등록된 잔액을 차감한 다음 이체 함수를 호출하여 토큰을 사용자에게 다시 이체합니다. 입금 기능과 마찬가지로 여기도 논리에 문제가 있는데, 이체할 때마다 디플레이션이 발생하기 때문에 사용자에게 이체되는 금액은 실제 이체 금액보다 적을 것입니다.

마지막으로 MemeStake의 updatePool 기능을 살펴보십시오. 우선, 각 호출이 마지막으로 업데이트된 blockNumber를 기록한다는 것을 1255행에서 볼 수 있습니다. 이번에 호출된 블록이 마지막 업데이트와 동일하면 직접 반환됩니다. 즉, updatePool은 각각 업데이트만 합니다. 블록 A 펀드 풀 상태.

pool.accMfundPerShare += mFundReward / token.balanceOf(MemeStake)

다음으로 1259행에서 토큰 계약에서 MemeStake 자체의 잔액을 획득합니다(위에서 언급한 바와 같이 사용자가 입금할 때마다 토큰이 MemeStake로 전송됨). 마지막으로 1275행에서 이 잔액은 자금 풀(즉, pool.accMfundPerShare 매개변수)의 각 입금 및 출금에 대한 보상을 계산하는 분모로 사용됩니다. 다음과 같이 계산됩니다.

rewardMfund = user.amont * pool.accMfundPerShare / 1e18 - user.rewardDebt。

다시 출금으로 돌아가 입출금 보상 토큰인 Mfund가 어떻게 이체되는지 알아보겠습니다. 먼저 위 그림의 인출함수 1325행에서 사용자가 발행되지 않은 Pending Mfund 토큰을 가지고 있는지를 계산합니다.계산식은 다음과 같습니다.

user.rewardDebt = user.amount * pool.accMfundPerShare / 1e18

그리고 rewardDebt는 다음과 같이 계산됩니다(그림의 1325행).

  • 따라서 코드에서 가능한 공격을 구성하는 것은 어렵지 않습니다.

    • 첫째, 트랜잭션 내에서 MemeStake의 자금 풀은 입출금 기능을 반복적으로 호출하여 고갈됩니다. 이 작업은 세 가지 코드 문제를 악용합니다.

    • 우선 user.amount는 실제 가치보다 더 많이 청구되므로 모든 인출이 성공할 수 있습니다.

    • 둘째, MemeStake의 모든 사용자 자금은 하나의 풀에 있으므로 각 전송은 실제로 풀의 다른 사용자가 예치한 KEANU 토큰을 소각합니다.

  • 셋째, updatePool은 동일한 블록에서 상태 업데이트를 수행하지 않기 때문에 pool.accMfundPerShare 매개변수에 영향을 미치지 않으며 Mfund 토큰 보상을 생성하지 않습니다.

    • 다음으로, 다음 블록에서 직접 철회 기능을 호출합니다.

    • 그러면 인출 함수의 1315행에서 ​​계산된 Mfund 보상 금액이 매우 커서 막대한 Mfund 보상이 발생합니다.

0x2. 공격 분석

0x2. 공격 분석

위에서 취약점의 원인과 취약점을 악용하는 방법을 소개하였고, 다음으로 공격자가 실제로 공격을 수행하는 방법을 소개한다.

  • 그림과 같이 공격은 4단계로 구분할 수 있으며, 그 중 핵심 공격 단계는 디플레이션 토큰의 특성을 이용하여 Memestake의 보상 계산을 조작하는 2단계입니다.1단계(준비), 먼저 공격자가 두 개의 계약을 생성하고 초기화합니다.계약 하나KEANU정상적인 투자 계약을 수행하기 위해 공격자는 계약 1을 통해 Memestake에 약 2,049B를 예치했습니다., 많은 MFUND 보상을 받을 수 있는 3단계를 위한 길을 닦습니다.계약 2

  • Memestake 보상 계산 계약을 조작하기 위해서는 해당 토큰의 승인 작업이 먼저 수행됩니다.0x00ed두 번째 단계(조작)에서 공격자는 먼저 uniswapV2에서 대량의 KEANU 토큰을 플래시 대출한 다음 계약 2를 통해 Memestake에 대량의 KEANU 토큰을 입출금하여 Memestake가 대량의 KEANU 토큰을 거래하도록 강요합니다. 키아누. KEANU는 디플레이션 토큰이기 때문에 각 트랜잭션은 트랜잭션 금액의 2%를 소각하므로 사용자의 실제 Memestake 입금액은 등록된 사용자 금액보다 적고 출금 금액은 사용자 금액에 따라 사용자에게 이체됩니다. 자세한 내용은 코드 분석 참조) Memestake 풀에서 KEANU 토큰 보유량이 지속적으로 감소하고 최종적으로 1e-07. 아래 그림과 같이 관련된 트랜잭션은 다음과 같습니다.

  • , 거래 스크린샷이 완료되지 않았습니다. 직접 보려면 링크를 클릭하십시오.Mfund3단계(이익), 공격자는 먼저 컨트랙트 2를 통해 Memestake.updatePool() 함수를 호출하고 KEANU가 위치한 풀의 accMfundPerShare를 수정합니다. in 두 번째 단계에서 조작되었습니다 (구체적인 수식은 아래 코드 분석 참조). 이를 통해 계약 2는 다음 출금 시 정상적인 가치보다 훨씬 더 많은 것을 얻을 수 있습니다.0xa945(약 61M) 이 토큰은 보상으로 사용됩니다. 3단계는 트랜잭션에서 발생합니다.

  • 동시에 공격자는 획득한 MFund의 일부를 WETH와 같은 토큰으로 교환하기 시작했습니다.Tornado.Cash4단계(종료), 공격자는 획득한 MFund, KEANU 및 기타 토큰을 ETH로 교환하고 패스합니다.

지금까지 공격이 끝났고 공격자는 55.9484578158357 ETH(공격자의 EOA 주소와 배포된 공격 계약에는 여전히 계산되지 않은 일부 SANSHU 및 KEANU 토큰이 있음), 약 100,000 미국 달러의 이익을 얻었습니다.0x0333다음 그림은 공격 주소를 보여줍니다.

거래 스크린샷, 거래 스크린샷이 완료되지 않았습니다. 자세한 내용을 보려면 주소 링크를 클릭하십시오.

공격 관련

흥미롭게도 공격의 2단계와 3단계 모두 플래시봇 트랜잭션과 관련이 있습니다.0x00ed2단계에 포함된 트랜잭션

UniswapV2 flashloan의 채택으로 인해 거래 전후에 약 38ETH를 사용하여 KEANU를 구매하는 것과 같으며 이는 큰 차익 거래 공간을 생성합니다. 따라서 트랜잭션은 다른 공격자(샌드위치 공격)에 의해 샌드위치되었습니다. 즉, 이 이벤트의 공격자는 다른 샌드위치 이벤트의 피해자이기도 합니다. 샌드위치 공격자는 3.2769697165652474ETH의 이익을 얻었지만 광부에게는 2.405295771958891249ETH를 주고 순이익은 0.8716739446063562ETH입니다.0xa9453단계에서 공격에 관련된 거래는

유니스왑 풀에서 MFund가 많이 팔렸기 때문에 차익거래 공간이 생겨 백런닝이 되고 플래시봇 거래가 되었습니다. 검색자는 0.13858054192600666ETH의 이익을 얻었고 그 중 0.099085087477094764ETH가 채굴자에게 양도되었고 순이익은 0.03949545444891189ETH였습니다.플래시봇 및 샌드위치 공격에 대한 자세한 소개는 다른 공격 소개에서 찾을 수 있습니다.. 플래시 론의 구현은 UniswapV2에서 일반 스왑과 결합되므로 구체적인 구현 원리와 두 번째 단계에서 차익 거래 공간이 있는 이유에 대해서는 당사의 문서를 참조하십시오.Towards A First Step to Understand Flash Loan and Its Applications in DeFi Ecosystem (SBC 2021).

0x3. 요약 및 보안 권장 사항

0x3. 요약 및 보안 권장 사항

공격자는 디플레이션 토큰의 특성을 사용하여 플랫폼이 보유한 토큰 수를 제어하고 보상 토큰의 계산 및 분배에 영향을 미쳐 55.9484578158357 ETH의 이익을 얻었습니다. 그 이유는 Sanshu Inu 플랫폼이 디플레이션 토큰을 도입할 때 특정 보안 고려 사항이 부족하여 공격자가 이를 활용할 수 있기 때문입니다.

  • 따라서 관련 프로젝트 당사자에 대한 보안 권장 사항은 다음과 같습니다.

  • 프로젝트가 실행되기 전에 보안 감사를 수행할 자격이 있는 보안 회사를 찾아야 합니다. Defi의 돈 레고 속성으로 인해 많은 Defi 프로젝트가 마음대로 결합되어 상호 영향을 미칠 수 있으며 이것이 Defi 분야에서 보안 사고가 자주 발생하는 이유입니다. 따라서 프로젝트 당사자가 주의해야 할 보안 문제는 자신의 프로젝트에만 국한되지 않고 다른 프로젝트와 상호 작용하는 과정에서 존재하는 보안 취약점도 고려해야 합니다.

핵심 보안 기술을 기반으로 BlockSec 팀은 오랫동안 개인 정보 컴퓨팅을 기반으로 DeFi 보안, 디지털 통화 자금 세탁 방지 및 디지털 자산 보관에 관심을 가져 DApp 프로젝트 당사자에게 계약 보안 및 디지털 자산 보안 서비스를 제공했습니다. 이 팀은 20개 이상의 최고 보안 학술 논문(CCS, USENIX Security, S&P)을 발표했으며, 파트너는 AMiner의 세계에서 가장 영향력 있는 보안 및 개인 정보 보호 학자로 선정되었습니다(2011-2020년 세계 6위). 연구 결과는 CCTV, 신화 통신 및 해외 언론 보도에 의해 수상되었습니다. 수십 개의 DeFi 보안 취약점 및 위협을 독립적으로 발견하고 2019 National Institutes of Health Privacy Computing Competition(SGX Track)에서 세계 1위를 차지했습니다. 기술에 기반한 이 팀은 개방성과 상생의 개념을 고수하고 커뮤니티 파트너와 협력하여 안전한 DeFi 생태계를 구축합니다.

https://www.blocksecteam.com/
contact@blocksecteam.com

BlockSec
作者文库