본문 바로가기
Block Chain/Hack Series

[Hack Series] 접근 제어 취약점 SwapX Protocol 해킹 분석

by 개발이 체질인 나그네 2023. 3. 16.
반응형

 
안녕하세요. 스마트 컨트렉트 개발자 개발이 체질의 최원혁입니다.
 
2023년 2월 27일 BSC 체인의 Dapp SwapX 프로토콜에서 해킹 공격으로 인해 약 100만달러의 손실을 입은 사건이 발생했습니다.
이번 Web3 Hack 시리즈는 공격자가 EVM기반의 Dapp SwapX 프로토콜의 어떤 취약점을 노렸는지, 해킹 공격에 대한 내용을 분석해보겠습니다.
 


공격 시나리오 :

(1) 먼저 공격자는 PancakeSwap Router를 통해 0.0581BNB를 100만 DND 토큰으로 교환했습니다. 

  • 공격자의 PancakeSwap 트랜잭션(0.0581BNB -> 100M DND )0xf3a5d3

PancakeSwap   트랜잭션 Flow

(2)이후 피해자는 SwapX의 0x4f1f05bc 함수를 반복하여 호출합니다. 이때 약 238개의 Token Transfer를 실행했고, 이는 자체적으로 공격을 위한 컨트렉트를 베포하여 진행했습니다.

 
(3) 현재 공격을 받았던 SwapX Contract의 트랜잭션 해쉬를 보면 이를 확인 할 수 있습니다.

 
 
(4) 현재 공격자가 공격을 위해 사용했던 스마트컨트렉트는 자폭(Self Destruct)하여 어떤 로직을 사용했는지 파악할 순 없습니다.

 
 


취약점 분석 및 원인 :

improper access control : 부적절한 접근 제어

이번 글의 제목처럼 부적절한 접근 제어를 사용하여 발생한 사례입니다. Smart Contract에서 접근 제어(Access Control)는 일부 주소(address)에게 컨트랙트 내부의 함수를 실행할 수 있는 권한을 부여하거나 컨트랙트 주인(ownable)만 실행할 수 있도록 접근에 대한 권한을 부여하는 것을 뜻합니다.
해당 Solidity 로직은 오픈제플린 라이브러리에서 잘 구현되어 있습니다.

 

Access Control - OpenZeppelin Docs

This directory provides ways to restrict who can access the functions of a contract or when they can do it. AccessControl provides a general role based access control mechanism. Multiple hierarchical roles can be created and assigned each to multiple accou

docs.openzeppelin.com

 
 

특히 ERC20 토큰에는 본인만이 토큰을 전송할 수 있도록 접근 제어 로직이 구현되어 있습니다. 하지만, 다른 스마트 컨트랙트의 함수를 통해 내가 보유한 토큰을 전송하게 되면, 트랜잭션의 주소가 스마트 컨트랙트의 주소로 변하게 되어 토큰을 전송할 수 없게 됩니다. 이를 위해 ERC20에서는 나의 토큰의 일정 양을 approve를 통해 특정 주소에게 접근을 허용할 수 있도록 합니다.
 

Metamask Access Token

approve() 함수를 통해 일정양의 토큰을 특정 주소에게 접근 허용을 하게 되면, 위와 같이 메타마스크에선 설정된 UI가 나타날 정도로 approve는 아주 흔히 있는 일입니다.

 

SwapX 취약점:

사용자들은 SwapX Smart Contract에게 본인의 BUSD token을 전송할 수 있도록 사전에 approve()를 실행해 놨습니다. 이렇게 되면, SwapX Smart Contract는 사용자의 토큰에 접근할 권한이 생깁니다. 여기서 취약점이 나타나게 됩니다. 지금은 컨트렉트 코드를 비공해 했지만, SwapX의 0x4f1f05bc 함수는 사용자의 토큰을 전송하는 기능이 포함되어 있었습니다. 때문에 SwapX는 0x4f1f05bc 함수에 아무나 접근 할 수 없도록 접근을 제어해야 했지만, 개발자는 그 부분을 놓치게 되었습니다. 
 

공격자 컨트렉트 예상 시뮬레이션 :

공격자의 시뮬레이션은 QuillAudit에서 재현한 내용입니다. 자세한 코드는 아래 링크를 확인해주세요.
https://gist.github.com/Sm4rty-1/2742241e6e5cf3ebc85a60b48c1046f6#file-swapx_exploit-t-sol

해커는 SwapX 사용자들(victims:피해자)의 주소로 먼저 SwapX Smart Contract에 approve()를 통해 얼마만큼의 BUSD에 접근을 할 수 있도록 허용했는지 ,ERC20의 allowance()를 통해 조회를 합니다. 0x4f1f05bc 함수 코드가 비공개 되었지만, swapX 프로토콜을 예상해봤을 때, 허용된 토큰의 수만큼 swapX의 0x4f1f05bc함수를 통해 BUSD로 DND 토큰과 스왑합니다. 순간 DND 토큰의 거래량이 증가하면서, DND 토큰의 가격이 증가하게 됩니다. 
 

이때, 공격자는 0.058BNB로 사전에 구매해놨던 DND를 판매합니다. 공격자는 낮은 가격에 DND 토큰을 구매하고, SwapX의 사용자가 보유한 BUSD로 DND를 거래하게 만들어 가격을 높힙니다. 그리고 높은 가격일 때, 자신의 DND 토큰을 다시 판매하여 이익을 취했습니다.


공격 예방 및 대책안 :

SwapX에서 발생한 공격 사례는 개발자의 디테일한 보안 설계에서 발생한 취약점입니다. 스마트 컨트랙트 개발자는 암호화폐를 관리하고 유통하는 로직을 구현하는 사람입니다. 때문에 본인의 실수로 인해 누군가의 재산을 잃게 될 수 있습니다. 따라서 스마트 컨트랙트 개발자는 책임감과 경각심을 가지고 개발에 임해야 합니다.
여러 심사 서비스 플랫폼(Audit Service)에서는 이를 위해 Access Control에 대한 중요성을 강조했습니다. 또한 오픈제플린의 Access Control 라이브러리를 사용할 것을 권장했습니다.
 
 
지금까지 Dapp SwapX 프로토콜의 해킹 사례에 대한 내용을 분석해봤습니다.
감사합니다.
 
 


🔎  Reference :

https://quillaudits.medium.com/decoding-swapx-1-million-exploit-quillaudits-502c5e7a542c
https://medium.com/solidityscan/swapx-hack-analysis-improper-access-control-8cb272cc33ff
 

반응형

댓글