Back to Blog

#9: MEV 봇 0xd61492: 독창적인 익스플로잇으로 포식자에서 먹잇감으로

Phalcon Security
February 21, 2024
5 min read

2023년 8월 3일, Arbitrum의 MEV Bot이 공격을 받아 $800K의 손실이 발생했습니다. 이 공격의 근본 원인은 불충분한 사용자 입력 검증이었습니다.

검증되지 않은 MEV Bot과 해당 컨트랙트 간의 복잡한 상호작용을 고려할 때, 오픈소스가 아니라는 것이 보안을 보장하지 않는다는 사실, 특히 DeFi 프로토콜에서는 더욱 그렇습니다.

배경

MEV Bot

MEV Bot (Maximum Extractable Value Bot)은 블록체인에서 수익 기회를 식별하고 실행하도록 설계되었습니다. 멤풀에 있는 대기 중인 트랜잭션 또는 온체인 상태를 분석하여 차익 거래를 통해 수익을 창출합니다.

일반적인 프론트러닝 및 샌드위치 공격 MEV Bot과 달리, 이번 공격의 대상이 된 MEV Bot은 삼각 차익 거래 및 부채 청산과 같은 전략 실행에 집중했습니다. 이러한 봇들은 AMM의 가격 안정화를 돕고 원활한 운영을 위해 청산과 관련하여 대출 프로토콜을 지원하며, DeFi 생태계의 건전한 기능에 필수적인 부분을 구성합니다.

플래시론

플래시론은 DeFi 생태계 내의 독특한 혁신으로, 무담보 대출의 한 형태입니다. 대출이 동일한 트랜잭션 내에서 상환되는 경우, 담보 없이 플래시론을 통해 최대 10억 달러까지 빌릴 수 있습니다. 해당 트랜잭션 내에서 대출이 상환되지 않으면, 트랜잭션이 발생하지 않은 것처럼 되돌려집니다.

이 메커니즘은 일반적으로 차익 거래나 일시적인 시장 비효율성을 활용하기 위한 다른 DeFi 전략에 사용됩니다.

취약점

요약

사용자 입력 파라미터의 불충분한 검증으로 인해 공격자가 FakeFlashloanProvider를 도입할 수 있었습니다. vault 컨트랙트는 이 provider를 사용하여 플래시론을 시작했습니다. 이후, 플래시론을 정산하기 위해 vault 컨트랙트가 FakeFlashloanProvider에 토큰을 승인했고, 이로 인해 vault에서 자산이 무단으로 이전되었습니다.

상세 설명

익스플로잇된 컨트랙트는 다음과 같습니다:

  • Vault: 피해자 컨트랙트 0xd614927acfb9744441180c2525faf4cedb70207f는 "Vault" 역할을 하며, 준비금을 제공하고 AAVE 및 Balancer와 같은 다른 프로토콜의 플래시론을 촉진합니다.
  • Arbitrage Bot: 취약한 컨트랙트 0x8db0efee6a7622cd9f46a2cf1aedc8505341a1a7는 "Arbitrage Bot"으로 기능하며, "Vault" 컨트랙트에서 차입자 역할을 담당합니다.

"Arbitrage Bot"의 0x0582f20f() 함수는 차익 거래를 시작하는 메인 진입점입니다. 먼저 "Vault"의 borrow()를 호출하여 원래 원금을 획득한 다음, calldata에 지정된 외부 컨트랙트에 대해 검증 없이 delegatecall을 통해 차익 거래 로직을 실행합니다.

function 0x0582f20f(...) {
  ...
  v67, /* uint256 */ v68 = address(0xd614927acfb9744441180c2525faf4cedb70207f).borrow(address(v39), address(v9[0]), v29).gas(msg.gas);
  ...
  // 0x4da91757 = swap(address,address,address,uint256,uint256,uint256,address)
  MEM[MEM[64] + 32] = uint224(address(MEM[0 + v4[v69]])) | 0x4da9175700000000000000000000000000000000000000000000000000000000;
  v82 = address(v76 >> 96).delegatecall(MEM[(MEM[64]) len 228], MEM[(MEM[64]) len 0]).gas(msg.gas);
  ...
  v189 = v170.refund(0x410085df, address(v9[0]), address(v39), v68, address(v9[0]), v29, v186, 4 + MEM[64] + (varg2.length << 5) - (4 + MEM[64]) + 192).gas(msg.gas);
  ...
}

이후, "Vault"의 0x512b7351()을 호출하여 공격자의 FakeFlashloanProvider 컨트랙트에 플래시론을 시작합니다.

0x512b7351() 함수는 msg.sender가 허용 목록에 있어야 하지만, 이전 delegatecall에 의해 이 검사를 우회하는 데 성공했습니다. 이것은 매우 중요한 단계입니다

function 0x512b7351(...) public nonPayable { 
    ...
    if (_borrow[msg.sender] >= 1) {
        v0 = !_refund;
    }
    require(v0, Error('BBVault: FORBIDDEN'));
    ...
    v38 = v23.length;
    v39 = v23.data;
    _refund = keccak256(v23);
    ...
    <FakeFalshloanProvider>.flashloan(...);
    ...
}

플래시론 콜백 중에, "Vault"의 executeOperation()은 먼저 빌린 자산을 "Arbitrage Bot" MEVBot 0x8db0ef로 이전한 다음, 0x7fe3ba8b()를 호출합니다.

function executeOperation(...) {
  ...
  require(_refund == keccak256(v3.data), Error('BBVault: STATUS'));

  Token.transfer(ArbitrageBot, amountBorrowed);
  <ArbitrageBot>.call(0x7fe3ba8b...);
  
}

"Arbitrage Bot"은 이 외부 호출을 신뢰하여, 받은 자산을 FakeFlashloanProvider에 다시 전송합니다. 그러나 "Vault"는 이를 인식하지 못하고 executeOperation() 끝에서 플래시론 상환을 위해 FakeFlashloanProvider에 여전히 승인을 부여합니다.

공격 과정

공격 Tx: 0x864c8cfb8c54d3439613e6bd0d81a5ea2c5d0ad25c9af11afd190e5ea4dcfc1f

공격자는 "Arbitrage Bot"의 0x0582f20f()를 호출하고, 이는 공격자의 컨트랙트에 delegate call을 수행합니다.

hack_contract_2victim의 함수 0x512b7351()을 호출합니다. 0x512b7351()msg.sender가 허용 목록에 있어야 하지만, 이전 delegatecall에 의해 이 검사를 우회하는 데 성공했습니다.

victim은 공격자의 FakeFlashloanProvider 컨트랙트를 호출하여 플래시론된 모든 자산을 victim에게 이전하고 victim의 executeOperation()을 호출합니다.

Arbitrage Bot0x7fe3ba8b()는 다시 공격자의 컨트랙트delegatecall을 수행하여, 이번에는 모든 자산을 공격자에게 다시 전송합니다. **이 시점에서, 공격자의 Flashloan Provider가 빌려준 자산이 상환되었습니다. **

피해자("Vault")는 플래시론 상환 의도로 FakeFlashloanProvider에 토큰을 승인합니다.

공격자는 이 승인을 이용하여 transferFrom으로 피해자의 자금을 탈취해 이익을 취합니다.

보안 권고사항

비오픈소스 코드가 보안을 보장하지 않습니다

비오픈소스 및 난독화된 코드가 보안을 보장한다고 믿는 것은 잘못된 생각입니다. 이 MEV Bot 사건은 비밀 유지가 익스플로잇을 방어하지 못하며, 개발자들에게 잘못된 보안 의식을 심어줄 수 있다는 것을 보여줍니다.

엄격한 입력 검증

모든 컨트랙트 상호작용과 calldata를 철저히 검증하는 것이 중요하며, 특히 플래시론 및 스왑 콜백과 같은 표준 인터페이스를 다룰 때 더욱 그렇습니다. 데이터 무결성과 보안 보장은 컨트랙트 설계 및 구현에서 최우선 사항이 되어야 합니다.

시리즈의 다른 글 읽기:

Get Real-Time Protection with Phalcon Security

Audits alone are not enough. Phalcon Security detects attacks in real time and blocks threats mid-flight.

phalcon security