2023년 4월, 공격자는 Flashbots 릴레이에 존재하는 취약점을 이용하여 여러 MEV 봇을 공격하고 약 2,000만 달러의 이익을 얻었습니다. 이 공격의 근본 원인은 특정 조건 하에서 프라이빗 트랜잭션이 퍼블릭 풀에 노출될 수 있었으며, 공격자가 유출된 트랜잭션을 백런(backrun)하여 이익을 얻을 수 있었다는 점입니다. 또한 공격에 사용된 몇 가지 정교한 기법들도 발견되었는데, 예를 들어 피해자를 공격하기 위한 허니팟 트랜잭션 사용과 공격 컨트랙트 내의 자기 보호 메커니즘이 있었습니다.
배경
Flashbots
Flashbots는 공식 웹사이트에 따르면, "이더리움을 시작으로 상태 기반 블록체인에서 MEV(Maximal Extractable Value)가 초래하는 부정적 외부 효과를 완화하기 위해 설립된 연구 및 개발 조직"입니다. Flashbots에는 서처(searcher), 빌더(builder), 릴레이(relay) 등 여러 주체가 관여합니다. 아래 이미지는 이들의 관계를 보여줍니다.

이미지 출처: Flashbots 문서
PBS(제안자-빌더 분리, proposer-builder separation) 프로토콜은 블록 제안자가 블록을 생성하도록 선택되었을 때 자신의 블록 공간을 여러 빌더에게 판매하여 수익을 극대화할 수 있도록 하는 프로토콜입니다. 구체적으로, 여러 서처들이 멤풀(mempool) 내 트랜잭션을 모니터링하고 번들을 생성하여 빌더에게 제출합니다. 빌더는 서처들로부터 번들을 수집하고, 가장 가치 있는 블록을 생성한 뒤 릴레이에 제출합니다. 릴레이는 해당 블록을 블록 제안자, 즉 에포크 슬롯에서 블록을 생성하도록 선택된 검증자에게 전달합니다.
이 아키텍처에서 릴레이는 서로를 신뢰하지 않는 빌더와 제안자 모두로부터 신뢰받는 주체입니다. 릴레이는 제안자가 블록 헤더에 서명하기 전에 블록 내용을 알 수 없도록 보장합니다. 또한 제안자에게 수수료가 지급됨을 보장합니다.
상세한 아키텍처에 관심 있는 독자는 Flashbots 문서를 참고하시기 바랍니다. 여기서 기억해야 할 핵심 보안 보장은, 블록이 체인에 올라가지 않은 경우 릴레이가 제안자에게 블록 내용을 공개해서는 안 된다는 것입니다. 그렇지 않으면 악의적인 제안자가 유출된 블록 내용을 활용하여 이익을 취할 수 있습니다(이번 공격에서 확인된 바와 같이).
샌드위치 공격
샌드위치 공격은 공격자가 두 트랜잭션 사이에 스왑을 끼워 넣어 이익을 취하는 방식입니다. 예시를 통해 설명하겠습니다.
WETH와 USDC 두 토큰으로 구성된 DEX 풀이 있다고 가정합니다. 한 사용자가 WETH를 USDC로 스왑하는 요청을 제출합니다. 이 스왑 트랜잭션은 멤풀에 들어가고, MEV 봇(서처라고 가정)이 이를 포착합니다. 그러면 봇은 사용자의 스왑 트랜잭션 앞뒤에 각각 하나씩, 총 두 개의 트랜잭션을 만듭니다.
구체적으로, 봇의 첫 번째 트랜잭션은 WETH로 USDC를 스왑하는 것으로, 이는 USDC의 가격을 상승시킵니다. 그다음 사용자의 스왑 트랜잭션이 실행되는데, 첫 번째 트랜잭션으로 인해 USDC 가격이 높아졌기 때문에 더 적은 양의 USDC를 받게 됩니다. 이후 봇의 두 번째 트랜잭션은 USDC를 WETH로 스왑하며, 첫 번째 스왑보다 더 많은 WETH를 얻을 수 있습니다.
이미지 출처: Liyi Zhou 외 공저 논문 "탈중앙화 온체인 거래소에서의 고빈도 거래(High-Frequency Trading on Decentralized On-Chain Exchanges)".
백런닝
백런닝은 대규모 거래 직후에 트랜잭션을 실행하는 전략입니다. 백런닝은 기본적으로 대규모 거래가 토큰 가격에 미치는 영향으로 인해 발생하는 차익거래 기회를 활용합니다. 예를 들어, 사용자가 DEX 풀에서 WETH를 USDC로 대규모 거래를 실행하면 다른 거래소보다 USDC 가격이 높아질 수 있습니다. 이때 백런닝 봇은 이 차익거래 기회를 즉시 포착하여 더 낮은 가격에 USDC를 WETH로 스왑해 더 많은 WETH를 획득하고, 이를 다른 거래소의 DEX 풀에서 판매하여 이익을 얻습니다.
취약점
사후 분석 보고서에 따르면, 취약점은 릴레이 코드에 존재했습니다. 서명된 블록 헤더가 유효하지 않더라도(서명 자체는 유효함) 빌더의 블록 내용이 (악의적인) 제안자에게 노출되는 문제가 있었습니다. 이 경우, 비콘 체인에 제출된 유효하지 않은 블록 헤더와 블록 내용은 거부되며, 제안자는 자신의 블록을 먼저 제출하는 경쟁에서 이겨 유출된 블록 내용을 활용해 이익을 취할 수 있습니다.
공격 과정
공격자는 악의적인 제안자이며, 피해자는 샌드위치 트랜잭션을 수행하려던 MEV 봇들입니다.
실제 공격 트랜잭션을 예시로 살펴보겠습니다.
| 블록 16964664 | ||
| 위치 0 | 피해자 트랜잭션: 0xd2edf726fd3a7f179c | Phalcon Explorer (blocksec.com) | MEV 봇이 2454.1 WETH를 사용하여 4.5 STG를 스왑 |
| 위치 1 | 공격 트랜잭션: 0x4b2a2d03b3dc136ef9 | Phalcon Explorer (blocksec.com) | 공격자가 158 STG를 사용하여 2454.1 WETH를 스왑 |
피해자 트랜잭션과 공격 트랜잭션은 블록 16964664의 각각 위치 0과 1에 있습니다. 기본적으로 피해자(MEV 봇)는 유니스왑 WETH-STG 풀에서 2454.1 WETH를 사용해 4.5 STG를 스왑하는 대규모 거래를 수행했습니다. 이로 인해 대규모 차익거래 기회가 생겼고, 공격자는 158 STG를 사용하여 풀의 모든 WETH를 탈취했습니다.

그렇다면 피해자(MEV 봇)가 왜 풀에서 4.5 STG 토큰(약 3달러 상당)을 얻기 위해 2,454 WETH(약 500만 달러 상당)를 사용했을까요? 참고로, 피해자가 이 스왑을 실행했을 때 풀의 유동성은 매우 낮았습니다(0.005 WETH, 4.5 STG).
분석 결과, MEV 봇이 이처럼 말도 안 되는 스왑을 실행한 데는 두 가지 이유가 있습니다.
첫째, 공격자는 피해자를 유인하여 샌드위치 공격을 수행하도록 허니팟 트랜잭션을 사용했습니다. 이 허니팟 트랜잭션의 해시는 0xd534c46ba5a444e886 | Phalcon Explorer (blocksec.com)입니다. 구체적으로, 공격자는 WETH를 STG로 스왑하는 트랜잭션을 (블록 16964664 이전에) 브로드캐스트했습니다. 풀의 유동성이 매우 낮았기 때문에, 이는 MEV 봇에게 샌드위치 공격의 기회를 제공했습니다. 아래 그림과 같이, MEV 봇은 세 개의 트랜잭션으로 구성된 샌드위치 공격 번들을 만들 수 있었습니다(샌드위치 공격 번들).

둘째, MEV 봇은 탐욕스러운 샌드위치 전략을 사용하고 Flashbots를 활용하여 이 트랜잭션을 전송했습니다. 수익을 극대화하기 위해 번들 내 첫 번째 트랜잭션은 거의 모든 STG 토큰을 탈취(2,454 WETH 사용)하려 했습니다. 이는 약 700달러(0.35 WETH)의 이익을 위해 500만 달러(2,454 WETH)를 사용하는, 7,000:1의 매우 탐욕스러운 전략이었습니다. 봇은 이 스왑이 체인에 커밋되지 않는 한 외부에 공개되지 않을 것이라고 가정했습니다. 그러나 릴레이의 취약점으로 인해 이 가정이 깨졌습니다. 공격자는 이를 이용하여 봇의 초기 샌드위치 공격 트랜잭션을 포함한 새로운 번들을 생성하고, 2,454 WETH를 획득하기 위한 백런닝 트랜잭션을 추가했습니다.
BlockSec 트위터의 그림은 전체 공격 과정을 보여줍니다.

자기 보호 메커니즘
공격자는 WETH를 STG로 스왑하는 허니팟 트랜잭션을 전송하여 피해자를 유인했습니다. 그런데 허니팟 트랜잭션을 이용할 수 있는 샌드위치 트랜잭션이 없는 경우에는 어떻게 될까요? 이런 경우에 대비하여, 공격자는 풀의 상태를 모니터링하고 역방향 스왑을 실행하여 0.35 이더를 보호했습니다. 이는 영리한 대응이었습니다. 아래는 허니팟 트랜잭션을 실행한 스마트 컨트랙트(0xe73f1576af5573714404a2e3181f7336d3d978f9)의 디컴파일된 코드입니다.

발견 사항을 검증하기 위해, Phalcon Fork에서 허니팟 트랜잭션을 시뮬레이션했습니다. 단, 블록 16964664의 위치 0에서 실행한 경우를 가정했습니다.

요약
이번 공격은 Flashbots 릴레이의 취약점을 정교한 공격 전략으로 활용한 최초의 사례입니다.
- 첫째, 이 공격은 Flashbots 릴레이의 제로데이 취약점을 악용했습니다.
- 둘째, 탐욕스러운 샌드위치 전략을 이용하고 허니팟 트랜잭션을 사용하여 MEV 봇(피해자)을 유인했습니다.
- 셋째, 공격이 실패할 경우를 대비해 허니팟 트랜잭션 비용(0.35 WETH)을 절감하기 위한 자기 보호 메커니즘을 포함했습니다.
시리즈의 다른 글 읽기:
- 도입: 2023년 10대 "주목할" 보안 사고
- #2: Euler Finance 사고: 2023년 최대 규모의 해킹
- #3: KyberSwap 사고: 극도로 미묘한 계산으로 반올림 오류를 교묘하게 악용
- #4: Curve 사고: 컴파일러 오류로 인해 정상 소스 코드에서 잘못된 바이트코드 생성
- #5: Platypus Finance: 행운 덕분에 세 번의 공격에서 살아남다
- #6: Hundred Finance 사고: 취약한 포크 프로토콜에서 정밀도 관련 익스플로잇의 물결을 촉발
- #7: ParaSpace 사고: 업계 최대 위기의 공격을 막기 위한 시간과의 싸움
- #8: SushiSwap 사고: 서툰 구조 시도가 연이은 모방 공격으로 이어지다
- #9: MEV 봇 0xd61492: 독창적인 익스플로잇으로 포식자에서 먹잇감으로
- #10: ThirdWeb 사고: 신뢰할 수 있는 모듈 간의 비호환성이 취약점을 노출



