선행 거래 봇: Ethereum의 어두운 숲에 있는 괴물
편집자 주: 이 기사의 출처는배빗 정보 (ID: bitcoin8btc)편집자 주: 이 기사의 출처는
, Dan Robinson 및 Georgios Konstantopoulos 저, Free and Easy에서 번역, 허가 하에 출판.
도전
이것은 무섭고 실화입니다.
보조 제목
도전
평범한 사람과 마찬가지로 저는 Uniswap Discord 지원 채널에 숨어 많은 시간을 보냅니다(공개: Uniswap은 Paradigm 포트폴리오 회사입니다).수요일 오후, 실수로 페어링 계약으로 보내진 Uniswap 유동성 토큰을 복구할 수 있는지 누군가가 물었습니다.내 초기 생각은 토큰이 영원히 잠길 것이라는 것이었지만, 그날 밤 늦게 토큰이 여전히 거기에 있다면 누구나 가서 토큰을 복구할 수 있다는 생각이 들었습니다.
유니스왑 코어 컨트랙트에서 누구나 소각 기능을 호출하면 해당 컨트랙트는 자체 유동성 토큰 잔고를 측정하여 소각하여 출금된 토큰을 호출자가 지정한 주소로 제공합니다. 이것은 Uniswap v2의 의도된 동작의 핵심 부분입니다(기본 메커니즘은
유니스왑 v2 백서
)의 섹션 3.2에 설명되어 있습니다.
계약을 찾았고 유동성 토큰이 아직 거기에 있으며 약 $12,000의 가치가 있습니다.
똑딱거리는 시계가 있고, 아무도 무료 자금을 알아채지 못하더라도 누구나 언제든지 자신의 유동성을 인출할 수 있고 실수로 계약에서 이러한 토큰을 얻을 수 있습니다.
흰 모자를 쓰고 소유자가 토큰을 되찾도록 도와줄 수 있습니다. 매우 간단합니다. 풀의 소각 기능을 호출하고 내 주소를 전달하기만 하면 됩니다.
그냥... 쉽지 않다는 걸 알아요.
보조 제목Dark Forest어두운 숲
이더리움 블록체인이 매우 적대적인 환경이라는 것은 비밀이 아닙니다. 스마트 계약이 이익을 위해 악용될 수 있다면 결국 악용될 것입니다. 해킹의 빈번한 발생은 일부 매우 똑똑한 사람들이 계약의 허점을 확인하는 데 많은 시간을 소비한다는 것을 보여줍니다. 그러나이 용서할 수없는 환경은 보류중인 확인되지 않은 트랜잭션 모음 인 Mempool과 비교할 때 무색합니다. 블록체인 자체가 전쟁터라면 멤풀은 더 나쁜 것, 즉 어두운 숲입니다.Flash Boys 2.0내가 가장 좋아하는 SF 소설인 The Dark Forest는 탐지가 특정 고급 포식자의 죽음을 의미하는 환경인 "어두운 숲"의 개념을 소개합니다. 이러한 환경에서 누군가의 위치를 공개적으로 식별하는 것은 그들을 완전히 파괴하는 것만큼이나 좋습니다. (이 개념은 이더리움 테스트넷에도 있습니다.
게임 영감의 원천. )
Ethereum Mempool에서 이러한 최상위 포식자는 "차익 거래 봇"의 형태를 취합니다. 재정 거래 봇은 보류 중인 거래를 모니터링하고 이를 악용하여 수익성 있는 기회를 창출하려고 합니다. 동료들과 공동 집필한 Phil Daian보다 이 봇에 대해 더 잘 아는 흰 모자는 없습니다."
Phil은 한때 "일반화 된 스냅 러너"라고 부르는 우주 공포에 대해 말했습니다. 재정 거래 봇은 일반적으로 Mempool에서 특정 유형의 거래(예: DEX 거래 또는 오라클 업데이트)를 찾고 사전 결정된 알고리즘에 따라 선행 거래를 시도합니다. 일반 선두주자는 주소를 복사하고 자신의 주소로 교체하여 선두주자가 수익성을 얻을 수 있는 모든 거래를 찾습니다.
그래서 이번 구조 작업이 쉽지 않을 것입니다. 누구나 소각 기능을 호출할 수 있으며 소각 기능을 호출하는 트랜잭션을 제출하면 이 수익성 있는 기회를 직접 가리키는 깜박이는 "무료 돈" 표시와 같습니다. 이 괴물이 실제로 mempool에 있으면 내 거래가 승인되기 전에 보고 복사한 다음 변형하고 선점할 것입니다.
이 환경은 Ethereum 블록체인 자체의 상태보다 더 잔인합니다. 이 무료 자금은 발견되지 않은 채 약 8시간 동안 블록체인에 앉아 소각 기능을 호출하는 사람에 의해 풀에서 인출되기를 기다리고 있습니다. 그러나 그것을 집으려는 시도는 비행 중에 즉시 좌절되었습니다.
보조 제목
구조 작업
봇에게 알리지 않고 자금을 인출하려면 봇이 Uniswap 쌍에 대한 호출을 감지할 수 없도록 트랜잭션을 난독화해야 했습니다. 여기에는 맞춤형 계약 작성 및 배포가 포함됩니다. 저는 전문 DeFi 사고 리더이지만 이전에 Ethereum에 계약을 배포한 적이 없습니다.
도움이 필요했고 자정이 지났습니다. 다행히도 내가 아는 최고의 스마트 계약 엔지니어 중 일부는 유럽 시간대에 살고 있습니다. Paradigm의 제 동료인 Georgios Konstantopoulos는 계약을 배포하고 거래를 제출하는 데 도움을 주기로 동의했습니다. 또 다른 포트폴리오 회사인 Yield의 수석 엔지니어인 Alberto Cuesta Cañada가 자발적으로 계약을 실행했습니다.
소유자가 호출할 때 활성화될 때만 소각 호출을 발행하고 그렇지 않으면 재개되는 Getter 계약을 배포합니다.
소유자가 호출할 때 Getter 계약을 활성화할 Setter 계약을 배포합니다.
이미지 설명
그림: 맞춤형 스마트 계약 코드
공격자가 get 트랜잭션만 실행하려고 하면 set 트랜잭션을 호출하지 않고 복구됩니다. 우리는 공격자가 두 트랜잭션을 순서대로 실행하기 전에 트랜잭션이 블록에 포함되기를 원합니다.
이미지 설명
그림: 구조 스크립트
그리고 이것은 치명적인 실수가되었습니다!
실제로 get 트랜잭션이 포함되어 있지만 UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED 오류가 발생하여 유동성 토큰이 사라졌습니다. 그 결과 get 트랜잭션이 mempool에 들어간 지 몇 초 안에 누군가가 호출을 실행하고 자금을 쓸어 버립니다.
괴물은 우리를 삼켜.
보조 제목
수업
교훈 1: 괴물은 진짜다! 지적으로 우리는 이러한 선행 봇이 널리 퍼져 있다는 것을 알고 있지만 실제로 작동하는 것을 볼 때까지 과소 평가할 가능성이 높습니다.
우리는 기회를 잡고 권한 계약을 통해 내부 호출을 구출했습니다. 우리는 그것이 우리를 보호할 것이라고 생각했지만 그렇지 않았습니다.
이러한 상황에 처한 경우 이 주제에 대해 연구한 보안 연구원인 Scott Bigelow에게 연락하는 것이 좋습니다. Scott Bigelow는 더 나은 난독화 프로토타입 구현을 가지고 있습니다.
교훈 2: 조급해하지 말라 우리는 시간이 촉박하더라도 원래 계획을 고수해야 한다. 스크립트에 더 많은 시간을 할애하거나 계약을 조정하거나(활성화 전에 호출을 재개하는 대신 아무 작업도 수행하지 않도록 Getter 계약을 변경) Infura를 사용하지 않도록 자체 노드를 동기화하면 변환할 수 있습니다. 같은 블록에 넣습니다. 교훈 3: 일반 인프라에 의존하지 마십시오 이상하게 만들수록 Infura와 같은 기존 인프라를 통과하기가 더 어려워집니다. 우리의 경우 블록체인의 현재 상태를 기준으로 실패할 것으로 보이는 트랜잭션을 제출하려고 했으며 Infura는 이에 대한 합리적인 보호 장치를 마련했습니다. 자체 노드를 사용하면 이 문제를 피할 수 있습니다.
또는 대규모 채굴자를 알게 된 경우(우리는 알지 못함) 멤풀과 몬스터를 완전히 건너뛰고 커밋하려는 트랜잭션을 블록에 직접 포함하도록 할 수 있습니다.
교훈 4: 미래는 점점 더 무서워질 것이다
이것은 우리에게 일어난 선행 이벤트의 한 예일 뿐이며 유사한 일이 하루에도 여러 번 발생합니다. 오늘날 선두 거래자는 봇일 뿐이며 내일은 채굴자가 될 수 있습니다.
오늘날 채굴자들은 이러한 기회를 활용하지 않고 돈을 그대로 두지 않지만, 미래에 자신의 이익을 위해 거래를 재정렬하고 제출할 것이라는 보장은 없습니다. 더 나쁜 것은 그들이 주장하지 않은 MEV를 훔치기 위해 다른 채굴자가 채굴한 블록을 재구성하여 블록체인을 불안정하게 만들 수 있다는 것입니다.


