느린 안개: 오리온 프로토콜이 공격받은 것은 계약 교환 기능의 함수가 재진입 보호를 하지 않았기 때문입니다

2023-02-03 15:55:04
수집

ChainCatcher 메시지, 오늘 아침 Orion Protocol 프로젝트의 ETH 및 BSC 체인上的 계약이 공격을 받았으며, 공격자는 약 302.7만 달러를 획득했습니다. 이번 공격 과정과 원인에 대해 느슨한 보안 팀이 분석한 내용은 다음과 같습니다:

  1. 공격자는 먼저 ExchangeWithAtomic 계약의 depositAsset 함수를 호출하여 0.5개의 USDC 토큰을 예치하여 아래의 공격을 준비했습니다;

  2. 공격자는 284.47만 개의 USDT 토큰을 플래시 론으로 대출한 후, ExchangeWithAtomic 계약의 doSwapThroughOrionPool 함수를 호출하여 토큰을 교환했습니다. 교환 경로는 [USDC -> ATK(공격자가 생성한 악성 토큰) -> USDT]입니다;

  3. 교환 결과는 교환 후 ExchangeWithAtomic 계약의 USDT 토큰 잔액에서 교환 전 해당 계약의 USDT 토큰 잔액(284.47만 개)을 뺀 값이지만, 문제는 USDC -> ATK를 교환한 후 ATK 토큰의 전송 함수를 호출하게 되며, 이 함수는 공격자가 악의적으로 구성하여 공격 계약을 통해 ExchangeWithAtomic 계약의 depositAsset 함수를 호출하여 플래시 론으로 대출받은 284.4만 USDT 토큰을 ExchangeWithAtomic 계약에 예치하게 됩니다. 이때 공격 계약의 ExchangeWithAtomic 계약 내 예치금이 284.47만 개로 성공적으로 기록되며, ExchangeWithAtomic 계약의 USDT 토큰 잔액은 568.9만 개가 되어 공격자가 교환한 USDT 토큰의 수량이 교환 후 568.9만에서 교환 전 284.47만을 뺀 값인 284.47만으로 계산됩니다;

  4. 이후 교환된 USDT 토큰은 라이브러리 함수 creditUserAssets를 호출하여 공격 계약이 ExchangeWithAtomic 계약에서 사용하는 장부를 업데이트하게 되어, 공격 계약의 ExchangeWithAtomic 계약 내 USDT 토큰 예치금이 568.9만 개로 기록됩니다;

  5. 마지막으로 공격자는 ExchangeWithAtomic 계약의 withdraw 함수를 호출하여 USDT를 인출하고 플래시 론을 상환한 후 남은 283.6만 개의 USDT 토큰을 WETH로 교환하여 이익을 얻습니다. 공격자는 동일한 방법으로 BSC 체인에서도 공격을 감행하여 19.1만 달러를 획득했습니다;

이번 공격의 근본 원인은 계약의 교환 기능 함수에 재진입 보호가 없으며, 교환 후 다시 장부의 예치금 수치를 업데이트하는 것이 교환 전후 계약 내 토큰 잔액 차이에 따라 계산되기 때문에 공격자가 가짜 토큰을 이용해 예치 함수에 재진입하여 예상보다 많은 토큰을 획득하게 된 것입니다.

관련 태그
체인캐처(ChainCatcher)는 독자들에게 블록체인을 이성적으로 바라보고, 리스크 인식을 실제로 향상시키며, 다양한 가상 토큰 발행 및 조작에 경계해야 함을 상기시킵니다. 사이트 내 모든 콘텐츠는 시장 정보나 관련 당사자의 의견일 뿐이며 어떠한 형태의 투자 조언도 제공하지 않습니다. 만약 사이트 내에서 민감한 정보를 발견하면 “신고하기”를 클릭하여 신속하게 처리할 것입니다.
banner
관련 태그
체인캐처 혁신가들과 함께하는 Web3 세상 구축