[스캠 시리즈] #2 스캠의 분류와 예시

Taron Sung
Decipher Media |디사이퍼 미디어
23 min readAug 13, 2022

서울대학교 블록체인 학회 디사이퍼(Decipher) 스캠 톺아보기 팀에서 스캠이 무엇이고, 스캠이 피해를 양산하는 일련의 과정들에 대한 글을 시리즈로 연재합니다. 본 시리즈는 투자에 대한 권유 내지 조언을 일체 포함하고 있지 않으며, 본 글을 바탕으로 의사결정을 내리지 마십시오.

Scam Series

  1. 스캠의 정의
  2. 스캠의 분류와 예시
  3. 스캠 프로젝트가 선호하는 메인넷
  4. 스캠 그 후: 토네이도 캐시

Author

Dean(@0xdeankim) of Decipher Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)

이건우 of Decipher Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)

이응호 of Decipher Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)

Jason of Decipher Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)

Taron(@taronsung) of Decipher Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)

Reviewed By 정재환

목차

  1. 들어가며
  2. 소프트 러그: 사례 분석
  3. 하드 러그: 사례 분석
  4. 나가며

1. 들어가며

(출처: ZIPMEX)

러그풀(rug pull)이란 양탄자(rug)를 잡아당겨(pull) 그 위에 있는 사람을 쓰러트리는 행위로, 블록체인 프로젝트를 개발한 사람의 악의적인 행동으로 투자자에게 피해를 입히는 행위를 통칭합니다.

러그풀의 행위 양태는 다양합니다. 프로젝트 개발자가 돌연 개발을 중단하거나 잠적하는 경우(소프트 러그풀), 개발자가 악의적으로 스마트 컨트랙트에 보안상 취약점 내지 투자자들의 자금을 탈취하는 구조를 삽입하는 경우(하드 러그풀) 모두 러그풀에 해당합니다.

본 글에서는 소프트 러그풀의 사례를 간략하게 살펴본 뒤, 스마트 컨트랙트를 이용한 러그풀을 중점적으로 살펴보겠습니다. 소프트 러그풀과 하드 러그풀 모두 비윤리적이고 탈법적인 행위에 해당하지만, 전술한 것처럼 ‘Code is Law’라는 블록체인의 정신을 악용하여, 공개된 코드의 취약점 혹은 프록시 패턴을 활용해 피해를 발생시키는 악질적인 행위에 해당하기 때문입니다.

2. 소프트 러그: 사례 분석

소프트 러그의 문제는 개발자의 내면의 의사를 투자자들이 파악하기 어렵다는 점입니다. 그렇기 때문에 마케팅 등 여러 창구를 활용해 외견상 이상이 없는 프로젝트를 출시하고, 투자금을 갈취한 뒤 잠적하는 경우 투자자들은 막대한 피해를 입게 됩니다. 아래에서는 소프트 러그풀에 해당하는 프로젝트 예시를 살펴보겠습니다.

2.1 유명인을 이용한 수법

릴 우지버트 트위터 (출처: 트위터)

아직 규제가 부족하고, 큰 규모의 자금이 빠르게 도는 암호화폐 시장 특성 상, 상승장에는 수 많은 새로운 프로젝트들이 빠른 속도로 출시되는 양상을 보입니다. 이에 따라 많은 프로젝트들이 팀원을 공개할 때, 본명, 얼굴, 과거이력 등을 상세히 공개하기 보단, 익명으로 활동하게 됩니다. 익명 프로젝트들이 굉장히 많다 보니 투자자들이 이에 대해 둔감해지긴 했어도, 익명 프로젝트에 대한 완전한 믿음이 생기기 어려운 것도 사실입니다. 여기서 프로젝트들은 투자자들의 신뢰를 얻기 위해 사용할 수 있는 쉬운 방법이 있습니다. 바로 유명인을 이용하는 방법입니다. 솔라나 생태계에서 스캠 NFT 프로젝트가 이 수법을 이용한 사례가 있습니다. 바로 ‘Eternal Beings’입니다.

(출처: Eternal Beings 디스코드)

Eternal Beings는 NFT 판매 홍보를 위해 미국의 유명 래퍼 Lil Uzi Vert의 도움을 받았습니다. Lil Uzi Vert는 트위터의 프로필 사진을 Eternal Beings의 NFT로 바꾸고, 판매가가 2.5 SOL인 NFT가 6 SOL은 거뜬히 갈 것이라고 투자자들을 선동했습니다. 또한, 로드맵에는 NFT 홀더들을 대상으로 콘서트의 티켓 및 백스테이지 특전을 줄 것이라고 하여 많은 투자자들의 이목을 끌었습니다. 하지만 9월 27일, 첫 민팅(minting)이 끝나고 2~3일이 지난 후, Lil Uzi Vert는 돌연 트위터 프로필 사진을 바꾸고, 프로젝트와 관련된 트윗들을 다 삭제했습니다. Lil Uzi Vert의 유명세를 믿고 NFT를 구매한 투자자들은 충격에 빠졌으며, 프로젝트 팀은 Lil Uzi Vert가 아직 100% 프로젝트를 지지하고 있으며, 현재 앨범 작업에 집중을 해야한다고 삭제했다고 변명하는 모습을 보여주었습니다. 성난 투자자들을 잠재우기 위해 추후에 Baby Uzi NFT를 추가 출시하여 나눠주겠다고 했지만, 이 또한 약속에 비해 상당히 늦어졌으며 제대로된 방식으로 분배되지도 않아 프로젝트에 대한 민심을 더 악화시켰고, 결국 관리자들이 돌연 잠적해버리며 마무리 됩니다. 이로 미루어 보았을 때, Eternal Beings 프로젝트는 Lil Uzi Vert에게 소정의 홍보료를 주겠다는 약속을 하며 악의적인 NFT 판매를 진행했을 가능성이 의심되는 상황입니다.

2.2 IDO(Initial Dex Offering)을 이용한 수법

IDO는 탈중앙거래소(DEX)에서 진행하는 토큰 초기 판매 방식을 뜻합니다. 중앙화거래소(CEX)에서 진행하는 토큰 초기 판매 방식인 IEO(Initial Exchange Offering)과 달리 IDO는 DEX 상에서 일어나므로 보통 KYC(Know Your Customer, 본인 인증) 절차가 없는 경우가 많으며, 따라서 투자자들은 누구나 손쉽게 참여할 수 있는 환경을 제공합니다. 프로젝트 입장에서는 토큰의 초기 유동성을 싼 가격에 투자자들한테 팔아 자금을 모을 수 있고, 투자자들은 보통 더 비싼 가격에 토큰을 팔 목적으로 싼 가격에 토큰을 구매합니다. IDO가 투자자들에게 무조건적인 수익을 보장하진 않지만, 2021년 큰 상승장에는 대부분의 IDO가 투자자들에게 수익을 안겨주며 수 많은 투자자들이 IDO를 진행하는 프로젝트에 딱히 조사를 하지 않은 채로 IDO에 참여하는 투자법이 성행하기도 했습니다. 이 점을 이용하여 악의적인 사기꾼들은 런칭 준비가 잘 되지도 않은 프로젝트를 IDO 플랫폼에서 토큰 세일을 진행한다거나, IDO를 진행해 주목을 받은 후 자금을 다 털어가는 러그풀을 시행하기도 했습니다. 솔라나의 IDO 플랫폼이었던 솔패드(SolPad) 및 관련 프로젝트들에 대해 살펴보도록 하겠습니다.

(출처: SolPad)

솔패드는 솔라나 생태계가 성장하기 시작할 때 출시된 IDO 플랫폼 중 하나입니다. 보통 의심스러운 프로젝트들은 투자사도 없는 반면, 솔패드는 나름 이름이 알려진 벤쳐 캐피털들의 투자를 받으며 많은 사용자들의 믿음을 샀습니다. 솔패드에서 첫 IDO를 진행하려고 했던 프로젝트는 HLTH Network였습니다. HLTH Network는 헬스케어 및 데이터 마켓플레이스와 관련된 프로젝트이며 DNA 관련 전공 박사가 추진하는 프로젝트라고 홍보했지만, 웹사이트 및 트위터와 같은 소셜 미디어들이 급조된 티가 너무 많이 나 투자자들의 반발로 한 번 무산되었습니다. 그 이후 Metaseer이라는 프로젝트로 첫 IDO를 진행했으며, 사건은 두 번째 IDO 프로젝트였던 Luna Yield에서 발생하게 됩니다.

Luna Yield는 러그풀(rugpull)을 진행한 후 웹사이트 및 채널들을 다 폐쇄해 남은 정보가 없지만, 솔패드의 미디엄에 작성된 글을 통해 프로젝트의 정보를 알 수 있으며, 별 특징 없는 흔한 디파이 프로토콜 중 하나입니다. Luna Yield는 웹사이트를 닫고 총 $6.7M에 달하는 사용자들의 자금을 다 탈취해갔습니다. 솔패드는 Luna Yield IDO에 참여한 참가자들의 자금 중 60%는 보상해줬지만, 심각한 피해가 발생한 자금은 IDO에 참여한 자금이 아닌, Luna Yield DEX를 이용했던 자금이므로 충분한 보상이 될 수 없었습니다. IDO 플랫폼의 경우 좋은 프로젝트들을 가져와 IDO를 진행하는 것이 목적이자 의무이기 때문에 솔패드도 비난의 여론을 피할 수 없었으며, 솔패드는 이후 전형적인 고이율 디파이 (이자율 10만% 이상)를 출시하고 잠적하게 됩니다.

3. 하드 러그: 사례 분석

하드 러그풀은 한마디로 정의하면, ‘스마트 컨트랙트 코드 내에 컨트랙트와 상호작용을 한 사용자의 자금을 탈취하기 위한 목적의 악의적인 코드를 심은 뒤 실제로 자금을 탈취하는 것’입니다. 본 단락에서는 하드 러그풀이 악명을 떨치게 된 배경을 간략히 소개한 뒤 구체적인 사례를 살펴볼 예정입니다. 구체적인 방법은 사례 별로 상이할 수 있으나, 본 글에서는 가장 대중적으로 알려진 자금 탈취 방법을 사례를 들어 소개하고 러그풀을 피하기 위해서는 어떤 부분들을 가장 조심해서 보아야 하는지 알아볼 예정입니다.

3.1 하드 러그풀의 배경

우선 하드 러그풀이 악명을 떨치게 된 배경에 대해서 살펴보도록 하겠습니다. 이 배경에 대해서 이야기 하기 위해서는 이더리움의 유명 DEX, 스시스왑까지 거슬러 올라갑니다. 스시스왑은 유니스왑의 유동성 제공자들에 대한 인센티브 제공 정책에 반기를 들고, 유동성 제공자들 및 거버넌스 토큰은 $SUSHI 토큰 스테이커들에게도 거래로 인해 발생한 수수료를 분배해주는 토크노믹스를 들고 나온 탈중앙 거래소입니다. 이 스시스왑에서 유동성을 제공하기 위해 LP 토큰을 만들고 스테이킹을 하기 위해서는 ‘마스터셰프(MasterChef) 컨트랙트’와 상호작용을 해야합니다. 사용자가 상호작용을 하여 승인을 하면 마스터셰프 컨트랙트는 스테이킹을 맡긴 사람들에게 보상을 제공하는 구조이죠.

스시스왑의 마스터셰프 컨트랙트 코드

어떻게 보면 이 마스터셰프 컨트랙트는 유동성 제공자들의 LP 토큰을 스테이킹 받고 그에 대한 보상을 자동화하여 제공하는 것에 지나지 않아 보일 수 있지만 이 컨트랙트는 매우 강력한 권한을 가지고 있을 뿐만 아니라 몇 가지 허점도 존재했습니다. 먼저, 스시스왑 마스터셰프 컨트랙트의 특징 중 하나인 ‘마이그레이터(Migrator)’를 살펴보도록 하겠습니다. 이 마이그레이터 코드가 삽입된 이유는 스시스왑이 유니스왑의 유동성을 빼앗아 오기 위해 실행한 뱀파이어 어택(Vampire attack)을 가능케 하기 위함이었습니다.

뱀파이어 어택 참고도 (출처: https://finematics.com/vampire-attack-sushiswap-explained/)

이 뱀파이어 어택은, 위의 그림과 같이 유니스왑에 있는 유동성을 가져오기 위해 유니스왑의 LP 토큰을 스시스왑에 스테이킹 하면 $SUSHI 토큰으로 보상을 제공하는 방식으로 이루어졌습니다. 이를 위해 마스터셰프 컨트랙트는 아래의 setMigrator()migrate() 함수를 포함한 마이그레이터 기능을 도입했습니다.

마스터셰프의 마이그레이터 코드 블록

migrate() 함수는 _pid라는 마스터셰프 컨트랙트에 정의된 풀의 인덱스를 참고하며 누구나 이 함수를 호출할 수 있습니다. 이는 다음과 같은 방식으로 동작합니다.

  1. 먼저 마이그레이터의 주소가 유효한지 확인한다. 유효성 확인은 마이그레이터의 주소의 유효성을 확인하는 setMigrator()를 호출하여 진행되며, 이는 컨트랙트 소유자에게로 제한된다.
  2. _pid에 의해 인덱싱된 LP 토큰 주소를 찾아서 불러온다.
  3. 해당 주소의 LP 토큰 잔액을 확인한다.
  4. safeApprove() 함수를 호출하여, LP 토큰과 상호작용할 주체가 사용할 수 있는 양을 정의한다.
  5. 이후 migrator()가 호출되어, 실제 마이그레이터의 주소로 LP 토큰을 전송한다. 이때 전송하는 양은 3.에 있는 잔액을 기준으로 실행된다.

1~5의 과정을 보면, setMigrator()를 실행하여 마이그레이터 주소를 새로운 주소로 업데이트하게 되면 모든 풀에 대해서 migrate() 함수를 실행시켜 LP토큰을 특정 주소로 옮기게끔 할 수 있습니다. 다시 말해 컨트랙트의 소유주가 프로토콜의 사용자들의 자산을 모두 빼돌릴 수 있다는 의미입니다. 실제로 많은 수의 하드 러그풀이 이 마이그레이터를 악용하여 벌어졌으며 이에 대해서는 (3)에서 더 자세히 살펴볼 예정입니다. 이를 방지하기 위해 나중에 출시된 일드 팜들에서는 마이그레이터 함수를 아예 제거하거나, Timelock을 걸어서 러그풀을 시도한다고 하더라도 사용자들이 토큰을 뺄 수 있게끔 장치를 걸어두기에 이르렀습니다. (물론, Timelock이라는 것도 완벽한 대책은 될 수 없습니다)

마이그레이터 뿐만 아니라, 마스터셰프 컨트랙트에는 코드 상의 문제로 인해 사용자에게 원래 지급해야 하는 보상량 보다 적은 보상이 지급되는 문제도 있었습니다. 그런데 문제는 이 불완전하고 악용의 소지가 있는 스시스왑의 마스터셰프 컨트랙트가 계속해서 포크가 되었다는 점에 있었습니다. 스시스왑의 성공 이후, 이더리움 내에서 뿐 아니라 다른 체인에서도 일드 팜이 계속해서 나왔고, 그 대표적인 예로는 BSC의 팬케이크 스왑, 구스 파이낸스 등이 있습니다. 해당 디파이 서비스들은 대부분 마스터셰프 컨트랙트를 그대로 따르거나 일부 수정하여 사용했는데 그 중 일부는 앞서 언급한 취약점들을 악용하여 사용자들의 자금을 갈취하였고 이를 우리는 하드 러그풀’이라고 부릅니다.

이후에는 이러한 하드 러그풀들의 대표적인 사례들을 살펴보고 각각의 사례들이 어떻게 자금 탈취를 했는지 살펴볼 것입니다. 다만, 본 글에서 소개하는 사례들은 러그풀의 다양한 기법들의 단편들만 보여주는 것이며, 실제 러그풀을 할때는 아래에 기술된 방법들을 조합하거나 변형해서 하는 경우가 많다는 점을 참고 부탁드립니다.

3.2 사례 1: 스마트 컨트랙트 업그레이드 프록시

스마트 컨트랙트 업그레이드 프록시란 스마트 컨트랙트 바꿔치기를 가능케 하여 자금을 탈취하는 경우입니다. 여기서 스마트 컨트랙트를 바꿔치기란, 처음에 정상적이고 위협이 없는 코드로 구성된 것 처럼 보이는 스마트 컨트랙트를 사용하다가, 악의적인 코드가 들어가 있는 스마트 컨트랙트로 바꿔치기를 하는 것을 의미합니다. 여기서 일반적으로 사용하는 악의적인 코드는 마이그레이터 함수이고, 이것의 시초는 앞서 살펴봤던 하드 러그풀의 배경에서 언급한 스시스왑의 마스터셰프 컨트랙트가 그 시초입니다.

흔히, 개발자들은 ‘기능 업그레이드’ 등을 이유로 마이그레이션 함수가 필요하다고 주장하나, 이것은 a. 일을 쉽게 하기 위한 변명을 하는 것이거나, b. 악의적인 공격자가 거짓말을 하는 것이라고 단언할 수 있습니다. 그 이유는 다음과 같습니다. 앞서서 살펴 보았듯이, 마이그레이터 코드는 마스터셰프 컨트랙트에서, 컨트랙트의 소유주가 해당 컨트랙트에 있는 자산을 다른 주소로 옮길 수 있도록 하는 기능을 가지고 있습니다. 스시스왑의 경우에는 이것을 사용해 뱀파이어 어택을 할 수 있었지만 이 기능은 얼마든지 다른 악의적인 목적을 가지고 활용할 수 있죠.

팬케이크 스왑의 경우, V1에서 V2로 컨트랙트 업그레이드를 하면서 마이그레이터를 사용하지 않았습니다. 물론, 마이그레이터를 사용했다면 개발자들은 훨씬 더 손쉽게 컨트랙트 업그레이드를 할 수 있었겠으나, 팬케이크 스왑 개발팀은 팬케이크 스왑의 LP 토큰이 팬케이크 내에서만 활용되는 것이 아니라, BSC의 다른 프로젝트들도 활용하고 있었기에 마이그레이션을 강제로 해버릴 경우 전체 생태계에 미치는 악영향이 크다고 판단했고, 때문에 마이그레이터를 사용하는 것이 아니라 사용자들이 직접 자금을 언스테이킹하고 신규 컨트랙트에 스테이킹 하도록 유도하였습니다.

팬케이크 스왑의 V2 업그레이드 관련 공지문 (출처: 링크)

이처럼, 마이그레이터가 필요하다고 주장하는 대부분의 경우들은 마이그레이터 함수를 사용하지 않더라도 다른 방식으로 목적 달성이 가능한 경우가 많습니다. 그럼에도 불구하고 마이그레이터를 그대로 남겨두고 ‘추후의 업그레이드를 위해’ 사용하겠다고 하는 경우에는 그 업그레이드가 사용자들을 위한 것이 아니라 자금을 탈취하기 위한 목적의 업그레이드를 하는 것이라고 간주할 수 있을 것입니다.

그렇다면, 본격적으로 구체적인 예를 살펴보도록 하겠습니다. 먼저 살펴볼 사례는 폴리곤 체인의 일드 팜, ‘헬리오스 캐시(Helios Cash)’입니다. 헬리오스 캐시는 초기에 사용한 스마트 컨트랙트 내에 업그레이드용 프록시를 두었습니다. 이 프록시는 기존의 스마트 컨트랙트를 다른 컨트랙트로 바꿔치기 할 수 있게하는 것인데, 여기서부터 이미 많은 문제가 있음을 직감할 수 있습니다. 스마트 컨트랙트란 사용자들이 정해진 규칙에 따라 동작하도록 설계된 하나의 프로토콜인데, 이것을 개발자의 임의에 따라 자유자재로 바꿀 수 있다는 것은 곧 사용자들의 자금을 탈취할 수 있다는 것을 의미합니다. 이후 헬리오스 캐시 개발팀 측은 이 프록시를 사용해 마이그레이터가 포함된 컨트랙트를 실행하였고, 해당 서비스를 이용한 사용자들의 모든 자금(약 $1M 가량)을 탈취하였습니다.

헬리오스 캐시 측에서 사용한 탈취용 마이그레이터 (출처: 링크)

다음은 BSC의 허니스왑 파이낸스(Honeyswap.fi)의 사례를 살펴보겠습니다. 이 경우는 헬리오스 캐시처럼 프록시를 둔 경우가 아니라, 공격용 컨트랙트의 주소를 먼저 마이그레이터 주소로 설정해두고 사용자들의 자금이 들어오기를 기다린 뒤 탈취를 한 것에 해당합니다. 이들은 구스 파이낸스의 마스터셰프 V2를 포크하여 사용하였는데, 구스 파이낸스는 마이그레이터가 악의적인 목적으로 사용될 가능성이 너무 높다고 판단하여 해당 코드를 삭제했었습니다. 그런데 허니스왑 팀은 마이그레이터를 다시 집어넣었고, 여기에 타임락(Timelock)을 걸어두어서 마이그레이터가 악의적인 목적으로 사용될 가능성이 없다고 선전하였죠.

굉장히 주옥같은 코멘트까지 집어넣은 허니스왑 팀 (출처: 링크)

일반전으로 타임락을 걸어두면 특정 동작이 정해진 시간(이 경우 72시간)이 지나야 수행 가능하기 때문에 안전성이 있다고 알려져 있습니다. 그러나 이 타임락이라는 것도 일정 시간이 지난 뒤에 특정 동작이 수행되는 것이지, 수행되는 것 자체를 막을 수는 없습니다. 허니스왑의 이 마이그레이터도 결국 일정 시간이 72시간이 지나면 악의적인 공격이 수행되는 것을 의미했죠. 허니스왑 개발팀이 설정한 공격용 컨트랙트는 단순하고 직관적입니다. 모든 자금 풀에 있는 토큰들을 특정 주소(개발 팀의 지갑 주소)로 이전하게끔 하는 것입니다. 그런데 실제로 어떤 주소에서 다른 주소로 자금을 옮기기 위해서는 ‘승인’의 과정이 필요한데 허니스왑 팀은 마스터셰프 컨트랙트를 사용해 공격용 컨트랙트가 해당 권한을 이미 갖도록 설정을 해두었고, 이 작업을 서비스를 런칭하기 전에 수행 해두었습니다.

공격용 컨트랙트의 토큰 트랜스퍼 코드 (출처: 링크)

구체적인 방법은 다음과 같습니다.

  1. 마스터셰프 컨트랙트를 배포.
  2. 해당 컨트랙트 내의 마이그레이터를 미리 공격용 컨트랙트로 설정.
  3. 각 자금 풀에다가 마이그레이트 함수를 실행해두고 이를 통해 공격용 컨트랙트가 각 풀의 자금에 대한 무한한 권한을 갖게끔 설정. (서비스 런칭 이전이기 때문에 풀의 자금이 0인 상태)
  4. 마이그레이터를 다른 주소로 변경하여 공격용 컨트랙트 설정 관련 흔적을 삭제.
  5. 마스터셰프의 소유권을 타임락으로 이전. (타임락이 의미가 없는 이유)

위와 같은 방식으로 서비스 개시 이전에 모든 설정을 해두면, 개시 당시에 사람들이 보게 되는 컨트랙트 내용은 러그풀의 여지가 거의 없는 정상적인 상태로 보이게 됩니다. (타임락을 걸어두어서 모르는 사람들이 좀 더 안심하게끔 만든 것이 더욱 악의적이라고 할 수 있겠습니다) 이후 개발팀은 허니스왑에 충분한 자금이 모이기만을 기다렸고, 만족할 만함 금액이 모인 뒤에는 바로 러그풀을 수행했습니다.

BSC 체인의 Squid Game도 유사한 방식으로 하드 러그풀을 진행했습니다. Squid Game은 넷플릭스에서 공개한 오징어 게임의 인기에 힘입어, 해당 프로젝트가 넷플릿스의 오징어 게임과 공식적인 협업관계에 있다고 홍보하고 일정량의 SQUID 토큰을 지불하면 실제 오징어 게임에 참여할 수 있는 기회를 주겠다고 공언하며 대중의 관심을 받았습니다. 나아가, 프로젝트는 ‘덤핑 방지 매커니즘’을 구현하여 투자자들이 SQUID 토큰을 팔기 전 최소 3년동안 묶어두도록 강제했고, 결과적으로는 투자자들의 토큰이 묶여있는 사이에 약 7천만개의 토큰이 시장에 덤핑되면서 가격이 폭락했습니다. 게다가 넷플릭스의 오징어 게임과 관련이 있다는 일련의 홍보 역시도 거짓으로 밝혀졌습니다.

이 역시도 업그레이드 프록시를 활용한 것으로 보입니다. 현재 소스 코드가 남아 있지 않아 구체적으로 코드의 어떤 부분이 러그풀을 발생시켰는지 파악할 수는 없지만, SQUID 컨트랙트는 EIP-1967을 적용하고 있음을 디컴파일을 거쳐 확인할 수 있었습니다. EIP-1967이란, 컨트랙트 코드가 어느때나 변경될 수 있도록 하는 EIP 표준입니다. 이를 활용해 투자자들의 자금이 묶여있는 동안 개발팀에서 수많은 토큰을 시장에 덤핑해 그 피해를 오롯이 투자자들에게 전가하였습니다. 컨트랙트가 배포된 뒤 수정이 불가능하다는 점 역시 컨트랙트에 치명적인 결함이 있거나 오류가 발생했을 때 큰 문제를 발생시키지만, 위와 같이 수정을 가능하게 하는 표준이 악용되는 경우도 많은 문제를 양산함을 확인할 수 있습니다.

3.2 사례 2: approval의 함정

본 사례는 사용자가 지갑을 통해 사용 승인을 하는 내용에 비정상적인 권한을 포함시켜, 사용자의 자금을 탈취하는 수법입니다. 프로토콜과 상호작용을 하기 위해서 사용자는 해당 프로토콜의 코드가 사용자의 지갑 주소와 상호작용할 수 있도록 권한 부여를 해주어야 합니다. 그러나 하드 러그풀을 할 목적으로 작성된 스마트 컨트랙트의 경우 사용자가 누르는 이 승인 버튼을 통해 해당 지갑 주소 내에 있는 특정 토큰의 정해진 수치만큼만 상호작용하는 것이 아니라, 지갑에 있는 모든 토큰에 대해 절대적인 권한을 갖게끔 하는 경우가 있습니다.

폴리곤의 일드 팜 중 하나인 폴리워터(PolyWater, 컨트랙트 주소)가 이러한 경우에 해당합니다. 폴리워터는 사용자가 스테이킹하는 토큰에 대해 무한한 접근 권한을 특정 주소가 갖도록 만들었습니다. 아래에 초록색으로 하이라이트 된 부분이 해당 코드인데, 사용자가 스테이킹한 토큰들에 대한 권한을 0x6f5…cF5 라는 주소가 무한한 권한을 가질 수 있도록 되어 있습니다.

하지만 폴리워터는 약과로 보이는 경우들도 많습니다. 폴리곤의 또 다른 일드 팜 중 하나인 비츠 팜(Beets farm, 컨트랙트 주소)의 경우에는 스테이킹된 토큰을 훔치는 것에서 한 발 더 나아가서 아예 지갑 주소에 있는 토큰들까지 모두 훔칠 수 있는 컨트랙트를 사용했습니다. 이를 위해 비츠 팜의 개발자는 다음과 같은 설계를 했는데 그 방식이 매우 악의적입니다. 비츠 팜의 컨트랙트에는 비츠 팜을 사용하는 모든 사용자들의 지갑 주소 정보를 불러올 수 있는 함수가 포함되어 있습니다. 이는 특수한 목적이 있지 않는 이상 일반적인 컨트랙트에는 반드시 필요하지 않는 것인데, 비츠 팜 측은 자금 탈취를 하기 위해 이러한 함수를 집어 넣었습니다.

사용자들의 지갑 주소를 모두 불러올 수 있도록 하는 함수

이를 통해 사용자들의 지갑 주소를 개발자가 알면, 해당 지갑 주소를 아는 누구나 토큰을 입금하거나, 토큰을 emergencyWithdraw를 통해 강제로 빼낼 수 있습니다. (emergencyWithdraw를 사용한 탈취는 (5)에서 더 상술 하도록 하겠습니다)

이건 한마디로, 당신의 지갑 주소의 토큰을 마음대로 할 수 있다는 코드.

즉, 폴리워터 측은 사용자가 스테이킹한 토큰에 대해서만 접근권을 가지고 탈취를 한 것이라면, 비츠 팜의 경우 해당 일드 팜이 사용하는 컨트랙트와 상호작용한 사용자들의 지갑에 있는 자산 모두에 대한 공격을 감행했다는 것입니다. 심지어, 이를 자동화하여 처리하도록 검증되지 않은 컨트랙트를 사용해 사용자들의 지갑에 있는 모든 잔여 토큰을 강제로 디파짓(deposit)되게 만들었으며, 디파짓 직후 emergencyWithdraw를 통해 자금을 갈취하였습니다. 요컨대 지갑을 해킹하여 해당 지갑 주소에서 다른 지갑 주소로 바로 토큰을 전송한 것은 아니지만, 거의 지갑을 해킹한 것이나 다름 없는 효과를 가진 공격을 감행한 것이라고 볼 수 있습니다.

자동으로 자금 탈취를 가능케 해주는 검증되지 않은 컨트랙트

3.3 사례 3: 토큰 강제 락업 및 emergency withdrawal 코드 변경/제거

이 방식은 사용자가 스테이킹 컨트랙트와 상호작용 시 별도의 예고 없이 토큰을 강제 락업시키고 긴급 상황 발생 시 토큰을 회수할 수 있는 기능인 emergencyWithdraw를 막아두거나, 코드 실행 시 토큰 소유자의 지갑 주소가 아닌 공격자의 지갑 주소로 전송되게 만드는 방식입니다.

BSC의 테일프로(Tailpro)의 경우 (msg.sender == devAddress)를 통해 개발자는 emergencyWithdraw를 자기 지갑 주소로만 가능하게 만들어 두었습니다.

앞서서 살펴본 비츠 팜은 approval로 시작한 러그풀을 완성시키기 위해, emergenceyWithdraw를 활용해 화룡정점을 찍었습니다. 바로 이 긴급 회수 기능을 사용해 회수를 사용자가 강제한다고 하더라도, 회수된 토큰이 사용자의 지갑 주소로 가는 것이 아니라 공격자(개발자)의 지갑 주소로 가게 설정한 것이죠. 아래를 보면 원 토큰 소유주의 지갑 주소를 의미하는 _wallet 이 아니라, withdraw 실행 시에는 wallet , 즉 공격자의 지갑 주소로 전송 되게끔 설정되어 있는 것을 확인할 수 있습니다.

화들짝 놀라 emergencyWithdraw를 해도, 그 토큰은 내 지갑으로 들어오는 것이 아니라 공격자의 지갑으로 이전됩니다.

3.4 소결

스마트 컨트랙트는 암호자산 생태계가 다음 단계로 도약하는데 가장 근간이 된 것이지만, 위의 사례들을 통해서 살펴 보았듯이 잘못 상호작용을 하면 큰 경제적 리스크를 유발할 수 있습니다. 때문에, 디파이를 처음 접하는 사용자들은 사용하기 이전에 해당 디파이 프로토콜의 컨트랙트에 어떤 리스크가 있는지를 점검하고 사용할 필요가 있습니다. 비개발자라고 하더라도, 블록 스캐너의 컨트랙트 주소 확인을 통해 해당 컨트랙트가 검증된 컨트랙트인지 아닌지는 간단히 확인할 수 있으며, 검증되지 않았거나 프록시가 의심된다고 표시되는 경우에는 반드시 의심을 해볼 필요가 있습니다.

프록시가 있다고 의심되는 경우의 예시

4. References

--

--