
기술적 관점에서 분석하는 통화수축 메커니즘 토큰의 취약성
개요
블록체인에서 디플레이션(통화축소) 메커니즘을 갖춘 토큰은 최근 자주 공격을 받고 있다. 본문에서는 이러한 디플레이션 메커니즘 토큰이 공격받는 원인을 분석하고, 이에 대한 대응 방안을 제시한다.
토큰 내 디플레이션 메커니즘을 구현하는 일반적인 방법은 두 가지로, 하나는 소각(Burning) 메커니즘이며 다른 하나는 반사(Reflection) 메커니즘이다. 아래에서는 이 두 가지 구현 방식과 그로 인해 발생할 수 있는 문제점을 분석하겠다.
소각 메커니즘
일반적으로 소각 메커니즘을 가진 토큰은 _transfer 함수 내에서 소각 로직을 구현한다. 때때로 송신자가 거래 수수료를 부담하는 경우가 있는데, 이 경우 수신자는 동일한 수의 토큰을 받지만 송신자는 추가 토큰을 지불해야 하므로 실질적으로 더 많은 비용을 부담하게 된다. 다음은 간단한 예시이다:

이러한 상황에서 발생할 수 있는 위험 요소를 살펴보자.
단순히 토큰 컨트랙트만 본다면 이러한 코드 작성에 큰 문제가 없어 보이지만, 블록체인에는 다양한 복잡한 시나리오가 존재하므로 여러 측면을 고려해야 한다.
일반적으로 프로젝트팀은 토큰에 가격을 형성하기 위해 Uniswap, Pancakeswap 등의 탈중앙화 거래소(DEX)에 유동성을 추가한다.
Uniswap에서는 skim이라는 함수가 있는데, 이 함수는 유동성 풀 내 두 종류 토큰의 잔고와 예비금(reserve) 사이의 차이를 호출자에게 전송하여 잔고와 예비금을 맞추는 역할을 한다:

이때 송신자가 유동성 풀이 되며, _transfer가 호출되면 유동성 풀 내 토큰 일부가 소각되어 토큰 가격이 상승하게 된다.
공격자는 이 특성을 이용해 토큰을 직접 유동성 풀로 전송한 후 skim 함수를 호출하여 토큰을 인출하고, 이를 반복 수행함으로써 유동성 풀 내 다량의 토큰을 소각시키고 가격을 급등시킨 후 토큰을 매도하여 이익을 얻는다.
실제 공격 사례로는 윈너 도지(Winner Doge, WDOGE)가 있다:

WDOGE 컨트랙트의 _transfer 함수에서 block.timestamp > closingTime 조건을 만족하면 else 블록으로 진입한다. 21번째 줄 코드에서 송신자의 잔고에서 전송 금액이 차감되며, 31번째 줄에서 송신자가 tokensToBurn만큼의 토큰을 추가로 소각하게 된다. 공격자는 이러한 수수료 메커니즘을 악용해 앞서 설명한 공격 방식으로 유동성 풀 내 모든 가치 토큰(WBNB)을 탈취했다.

반사 메커니즘
반사 메커니즘은 사용자가 거래할 때마다 수수료를 징수하여 토큰 보유자에게 보상하는 방식으로, 실제 송금은 발생하지 않고 단순히 계수만 조정된다.
이 메커니즘에서는 사용자가 두 가지 형태의 토큰 수량을 가지게 되는데, tAmount는 실제 토큰 수량이며 rAmount는 반영된 토큰 수량으로, 그 비율은 tTotal / rTotal이다. 일반적인 코드 구현은 다음과 같다:

반사 메커니즘 토큰에는 일반적으로 deliver라는 함수가 존재하며, 이 함수는 호출자의 토큰을 소각하여 rTotal 값을 감소시키고, 결과적으로 비율이 증가하면서 다른 사용자의 반사 토큰 수량도 증가하게 된다:

공격자는 이 함수에 주목하여 Uniswap 유동성 풀을 공격하는 데 활용한다.
그렇다면 어떻게 이용할 수 있을까? 마찬가지로 Uniswap의 skim 함수에서 시작한다:

Uniswap에서 reserve는 예비금이며, token.balanceOf(address(this))와는 다르다.
공격자는 먼저 자신의 토큰을 소각하기 위해 deliver 함수를 호출하여 rTotal 값을 감소시키고, 따라서 비율이 증가하며 반사된 토큰 수량도 증가하게 된다. 결과적으로 token.balanceOf(address(this)) 값이 커지고 reserve와 차이가 발생하게 된다.
따라서 공격자는 skim 함수를 호출하여 이 차이만큼의 토큰을 인출함으로써 이익을 얻을 수 있다.

실제 공격 사례로는 BEVO NFT Art Token(BEVO)가 있다:

또한 토큰 컨트랙트에 burn 함수가 존재하는 경우, 유사한 또 다른 공격 기법도 가능하다:

사용자가 burn 함수를 호출하면 자신의 토큰이 소각되고 tTotal 값이 감소하여 비율이 낮아지며, 이에 따라 반사된 토큰 수량도 감소한다. 결과적으로 유동성 풀 내 토큰 수량이 줄어들고 가격이 상승하게 된다.
공격자는 이 특성을 이용해 burn 함수를 반복 호출하여 tTotal 값을 줄이고, 이후 유동성 풀의 sync 함수를 호출하여 reserve와 balances를 동기화한다. 결국 유동성 풀 내 토큰이 크게 감소하고 가격이 급등한 후, 공격자는 토큰을 매도하여 수익을 실현한다.

실제 공격 사례로는 Sheep Token(SHEEP)이 있다:

대응 방안
소각 및 반사 메커니즘 토큰에 대한 공격 기법을 분석해 보면, 공격 핵심은 유동성 풀의 가격을 조작하는 데 있음을 알 수 있다. 따라서 유동성 풀 주소를 화이트리스트에 등록하여 해당 주소는 토큰 소각이나 반사 메커니즘에서 제외함으로써 이러한 공격을 방지할 수 있다.
결론
본문에서는 디플레이션 메커니즘 토큰의 두 가지 구현 방식과 각각에 대한 공격 수법을 분석하고, 이에 따른 해결책을 제시하였다. 스마트 컨트랙트 개발 시 프로젝트팀은 토큰이 탈중앙화 거래소와 결합되는 상황을 반드시 고려하여 이러한 공격을 미연에 방지해야 한다.
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News














