(Hack Series) SwapX Protocol 해킹 분석 || SwapX | Hack Analysis | Improper Access Control ||

  • by


안녕하세요.스마트 계약 개발자 개발이 체질의 최원혁입니다.

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 & nbsp; 거래 흐름

(2) 이후 피해자는 SwapX 0x4f1f05bc 함수를 반복적으로 호출합니다.

이때 약 238개의 Token Transfer를 실행했으며, 이는 스스로 공격을 위한 계약을 체포하고 진행했습니다.


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


(4) 현재 공격자가 공격을 위해 사용하고 있던 스마트 계약은 자폭(Self Destruct)어떤 로직을 사용했는지 파악할 수 없습니다.



취약성 분석 및 원인:

improper access control : 부적절한 액세스 제어

이 문서의 제목과 같이 부적절한 액세스 제어를 사용하여 발생한 경우입니다.

Smart Contract에서 액세스 제어는 일부 주소에 계약 내에서 함수를 실행할 수 있는 권한을 부여하거나 계약 소유자만 실행할 수 있도록 액세스 권한을 부여하는 것을 의미합니다.

해당 Solidity 로직은 오픈 제플린 라이브러리로 잘 구현됩니다.

액세스 제어 – 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을 통해 특정 주소에 액세스 할 수 있습니다.


메타마스크 액세스 토큰

approve() 함수를 사용해 일정량의 토큰을 특정의 주소에 액세스 할 수 있게 되면, 상기와 같이 메타마스크에서는 설정된 UI 가 표시될수록 approve 는 매우 일반적입니다.

SwapX 취약점:

사용자는 SwapX Smart Contract에 자신의 DND 토큰을 보낼 수 있도록 사전에 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에서 발생한 공격 사례는 개발자의 상세한 보안 설계에서 발생한 취약점입니다.

스마트 계약 개발자는 암호화폐를 관리하고 유통하는 로직을 구현하는 사람입니다.

따라서 본인의 실수로 인해 누군가의 재산이 손실될 수 있습니다.

따라서 스마트 계약 개발자는 책임감과 경계심을 가지고 개발을 위해 노력해야 합니다.

일부 감사 서비스 플랫폼은 이를 위해 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