이더리움 합병 후 리셋 공격: Omni 체인 브리지 공격 사건 분석

1. 이벤트 설명

2022년 9월 18일,이더리움 합병이 끝난 후 PoW 체인은 PoS 체인에서 거래되는 리셋 공격을 받았다. 근본적인 원인은 네트워크 브리지가 블록체인의 chainid를 정확하게 읽고 검증하지 않았기 때문이다.공격자는 먼저 Gnosis 체인의 Omni 크로스 체인 브리지를 통해 200 WETH를 옮긴 후 PoW 체인에 같은 메시지를 다시 넣어 추가 200 ETHW를 얻었다.

Shark Team은 이 사건에 대해 기술 분석을 하고 안전 방지 수단을 정리했다. 후속 프로젝트는 경계로 삼아 블록체인 업계의 안전 방어선을 함께 구축할 수 있기를 바란다.

2. 이벤트 분석

이 이벤트는 두 개의 서로 다른 체인의 거래 hash와 공격자의 주소와 관련된다. 각각 다음과 같다.

(1) PoS 체인 거래hash:0xbddb0cc8bc9949321e1748f03503ed1a20dd618fbf0a51dc5734c975b1f8bdf5

(2) PoW 체인 거래hash:0x9c072551861ce384203516f4d705176a2d2e262d5b571d853467425f1a861fb4

(3) 공격자 주소: 0x82FaEd2dA812D2E5CCed3C12b3baeB1a522DC677

우선, 우리는 두 거래 방문의 계약이 같고 inputdata가 완전히 같다는 것을 비교했다. 즉, 같은 계약의 같은 함수를 호출하고 파라미터가 같고 같은 방법에 따라 ID 에 서명하는 것이다.0x23caab49에서 알 수 있듯이 해커는 safeExecute Signatures With AutoGas Limit 함수를 호출합니다.

따라서 공격자는 Omni Bridge를 통해 200WETH를 이동한 후 PoW 체인에 같은 Inputdata를 다시 놓아 추가 200ETHW를 얻었다.

이때 우리는 이곳의 리셋 조작에 대해 의심스러운 태도를 가지고 있다.이더리움 네트워크가 하드코어로 갈라지기 전에 EIP-155를 강행하는 것은 ETH PoS 체인에서 거래가 PoW 체인에서 중복 거래될 수 없다는 것을 의미하기 때문이다.정상적인 거래에서 우리는 nonce를 통해 정렬 거래를 하고 중복 거래를 피한다.크로스체인에서 우리는chianid에 따라 체인의 유형을 식별할 것이다. 예를 들어 이더리움 메인 네트워크의chainid는 1이고 ETHW 메인 네트워크의chainid는 10001이다.

이에 대해 우리는 옴니 브리지의 상응하는 원본 코드를 분석했다.Omni Bridge에서 chainid의 논리를 검증한 결과 chainid의 출처는 unitStorage에 저장된 값이지 조작 코드 CHAINID(0x46)를 통해 직접 읽는 체인에서 chainid가 아니라는 것을 발견했습니다.

unitStorage는 계약 Eternal Storage의 상태 변수입니다. source ChainId() 함수가 있는 계약 Basic AMB는 Basic Bridge와 Versionable AMB를 계승합니다.이 가운데 Basic Bridge는 Eternal Storage 계약을 계승했다.여기에 저장된 chainid는 미리 저장된 것입니다. 만약에 블록체인의 단단한 갈라짐이 발생하여 chainid가 다시 설정되지 않았거나 chainid가 인위적으로 설정된 것이 잘못되면 계약 차원에서 조작 코드를 통해 얻은 chainid가 아니기 때문에 크로스체인 메시지의 실제 chainid를 정확하게 검증하지 못합니다.이런 빈틈은 공격자에게 쉽게 이용된다.

문제 분석 요약: 주로 Omni가 사용하는solidity 버전은 0.4.24이고 수동으로 chainid를 저장하고 업데이트하는 방식을 사용하며 EIP-1344에 규정된 CHAINID(0x46) 조작 코드를 통해 실제 chainid를 얻지 않았다.

3. 안전 건의

이번 안전 사건을 일으킨 원인은 PoW가 PoS를 업그레이드하는 과정에서 Omni Bridge가 chainid를 제때 처리하지 않았기 때문이다.오래된 solidity 버전에 역사적인 문제가 존재합니다.후속 프로젝트의 교체에서 새로운 문제에 제때에 대응하고 필요한 코드 최적화 조치를 취할 것을 건의합니다.Gnosis 체인에 Omni Bridge는 일일 최대 이체 코인 수량이 250개의 WETH를 제한하고 있지만 축적이 많아 더 큰 손실을 초래하는 것을 방지하기 위해 여전히 경계해야 한다.