Web3 Hack Series : Front Running And Sandwich Attack
안녕하세요. 스마트 컨트렉트 개발자 개발이 체질의 최원혁입니다.
이번 Web3 Hack 시리즈는 Front Running And Sandwich Attack에 대해 알아보겠습니다.
위 두가지 취약점은 트랜잭션이 블록체인에 추가되는 과정에서 나타나는 특징을 이용하여 공격자들이 이득을 취하는 공격 방법입니다. 주로 De-fi 프로토콜 및 플랫폼을 이용하는 사람들을 대상으로 공격되며 트랜잭션의 가스비 우선 선행과 채굴 시스템을 이용한 방식으로 진행됩니다.
Tansaction이 블록체인에 추가되는 과정
Front Running와 Sandwich Attack는 트랜잭션이 블록체인에 추가되는 과정에서 나타나는 특징을 이용한 공격입니다. 두 취약점을 이해하기 전에, 블록체인에서는 내 트랜잭션이 어떻게 블록에 저장되는지에 대해 알아보겠습니다.
내 지갑 주소의 Private key로 서명한 트랜잭션을 블록체인에 제출하게 되면, 그 즉시 블록에 저장되는 건 아닙니다.
먼저 "Mempool"이라는 공간에 순서대로 쌓이게 됩니다. *Mempool : Memory + pool
Mempool은 검증된 트랜잭션 저장되는 집합소입니다. 여기에 쌓인 Mempool은 채굴자들에 의해 선택되면 블록에 저장됩니다.
채굴자들이 검증한 트랜잭션이 블록에 저장되면, 이에 대한 보상으로 가스비의 일부 수수료를 받게 됩니다.
The higher the fees, the more quickly transactions are processed.
가스비는 일정량 정해져 있지 않습니다. 트랜잭션을 보내는 유저가 설정할 수 있습니다. 때문에 Mempool에 쌓인 트랜잭션의 가스비는 서로 다르며, 채굴자는 가스비가 높은 트랜잭션을 작업해야 더 많은 보상을 받을 수 있습니다.
이런 프로세스 때문에, 내 트랜잭션이 먼저 Mempool에 등록되어도, 다른 높은 가스비의 트랜잭션이 먼저 실행되는 경우가 많습니다.
Front Running Attack 이란?
Front Running Attack은 트랜잭션이 블록체인에 등록되는 프로세스를 이용한 악의적 공격입니다.
공격자는 실시간으로 pending 된 트랜잭션을 모니터링하며 Mempool에 등록되기를 기다립니다. 그중에서 이익을 발생하는 트랜잭션을 발견하면, 그 트랜잭션을 모방하여 높은 가스비로 Mempool에 등록합니다. 공격자의 트랜잭션이 먼저 블록에 저장되어 이익을 얻게 되고, 공격당한 유저의 트랜잭션은 순서에서 밀려 이익이 줄어들거나 이익을 얻지 못할 수가 있습니다. 참고한 Medium글에 좋은 예시가 있어서 가져왔습니다.
문제를 먼저 맞힌 사람에게 100$를 주는 스마트 컨트렉트가 있습니다. 게임에 참여하기 위해선 참여비 50$가 필요합니다.
- 1. 문제가 공개되고 Alice는 문제의 답을 먼저 알았습니다. 이때 Bob은 문제를 풀지 않고 Mempool을 모니터링하며 문제의 답변을 제출된 트랜잭션(txn)을 찾습니다.
- 2. Alice는 정답을 제출하는 트랜잭션의 가스비를 15 gwei로 설정했습니다. 실시간으로 모니터링을 하던 Bob은 Alice의 트랜잭션을 모방하여 50 gwei의 가스비로 트랜잭션을 제출합니다.
- 3. 이때 채굴자들은 높은 보상을 위해 가스비가 높은 Bob의 트랜잭션을 먼저 블록에 저장합니다.
- 4. 결과적으로 보상은 Bob이 가져가게 됩니다.
Sandwich Attack 이란?
샌드위치 공격은 주로 De-Fi 프로토콜 및 플랫폼 서비스의 대상으로 공격합니다.
샌드위치 공격은 유저의 트랜잭션 앞 뒤에, 두 트랜잭션 발생시켜 전후에 있는 사용자에게 손실을, 공격자에게 이득을 주는 공격입니다.
공격자는 Mempool에 pending상태의 트랜잭션을 모니터링합니다. 특히 디파이 프로토콜의 사용자를 중점으로 보다가, 사용자의 거래를 찾으면 두 개의 트랜잭션을 사용자의 트랜잭션 앞뒤에 제출합니다.(여기서 앞뒤 순서는 가스비의 높은 트랜잭션 순서입니다.)
사용자의 보류 중인 트랜잭션 앞에는 Front-Running, 뒤에는 Back-Running라고 합니다.
- Uniswap DEX 샌드위치 공격 Example :
샌드위치 공격의 주목적은 자산 가격을 조작하는 것입니다.
DEX의 암호화폐 가격은 AMM(Automated Market Maker) 수학 알고리즘에 의해 결정됩니다.
https://defipan.com/lecture/710
예를 들어 여기 UNISWAP의 ETH/MATIC 유동성 풀이 있습니다.
- Alice는 MATIC를 ETH와 교환하는 트랜잭션을 제출합니다.
- 공격자는 모니터링을 하며 UniSwap에 pending 된 트랜잭션을 모니터링하다가 Alice의 트랜잭션을 발견합니다.
- 공격자는 Alice의 트랜잭션을 모방하여 보다 높은 가스비로 트랜잭션을 제출하여 MATIC 가격을 높입니다.
- Alice의 트랜잭션이 다음에 실행됩니다. 이때 공격자의 트랜잭션으로 인해 MATIC의 가격이 올라 더 많은 ETH를 지불하게 됩니다.
- Alice의 트랜잭션이 끝나면 MATIC의 가격은 다시 낮아지기에, 공격자는 다시 트랜잭션을 넣어 낮은 가격으로 MATIC을 구매하여 이익을 얻습니다.
취약점 대처 및 방지 방법
(1) 최대한 낮은 슬리피지(Slippage) 설정
낮은 슬리피지를 설정하여 피해를 최소화할 수 있습니다. DEX에 나의 주문이 슬리피지 설정된 퍼센트보다 높은 가격으로 거래가 측정되면, 거래는 자동으로 취소됩니다. 공격자의 Front-Running로 인해 가격이 높아지면 원래 거래하려 했던 금액보다 가격은 높아집니다. 이때 높아지는 양을 슬리피지로 설정하여 공격을 막을 수 있습니다.
(2) Transaction Counter
스마트 컨트렉트 내부에 트랜잭션을 카운터를 설정하는 상태 변수를 이용합니다. 샌드위치 공격자는 피해자의 트랜잭션이 실행되기 전에 눈에 띄지 않게 트랜잭션을 높은 가스비로 제출합니다. 이 과정에서 채굴자들에게 발견되지 않아, 트랜잭션이 밀리게 될 수 있습니다. 따라서 내 트랜잭션이 n번째 까지 트랜잭션이 진행되지 않으면 트랜잭션에 Revet를 발생시켜 거래를 전면 취소시킬 수 있습니다.
(3) Off-Chain Ordering
오프체인 오더 방식은 DEX의 스마트컨트렉트 거래는 DEX의 주인 또는 유동성 풀 제공자만 가능합니다. 오프체인에서 주문을 넣고 DEX에서 트랜잭션을 실행시켜 블록체인에서 수수료 및 가스비를 정산하는 방식입니다. 이때 트랜잭션을 발생시키는 주인은 모든 오더의 가스비를 동일시켜 트랜잭션을 발생시킵니다. 가스비 가격 경쟁이 없기에, 공격자는 가스비 경쟁의 취약점을 이용할 수 없습니다.
(4) Limit the gas price:
DEX의 유동성 풀에 거래하는 모든 가스비를 제한시킵니다. Solidity의 tx.gasPrice 를 이용하여 제한 가능한 유동성 풀 스마트컨트렉트를 설계할 수 있습니다. 이에 거래하는 트랜잭션의 가스비가 너무 높으면 Revert를 실행시켜 Front-Running공격과 Back-Running를 모두 방지할 수 있습니다.
현재 Web3의 다양한 플랫폼에서 위와 같은 방지 대처법을 스마트 컨트렉트에 적용하여 설계하고 있습니다. 디파이 스마트 컨트렉트 개발자가 되려면 프로토콜이 공격받은 경험을 통해 미리 방지할 줄 알아야 합니다.
앞으로 다양한 공격 사례와 방지법으로 다시 찾아뵙겠습니다.
지금까지 Web3 Hack Series 두 번째Front Running & Sandwich Attack에 대해 알아봤습니다.
감사합니다.
📘 Referrence :
https://medium.com/@quillaudits/front-running-and-sandwich-attack-explained-quillaudits-de1e8ff3356d
댓글