계약 교환

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

ChainCatcher 메시지, 오늘 아침 Orion Protocol 프로젝트의 ETH 및 BSC 체인上的 계약이 공격을 받았으며, 공격자는 약 302.7만 달러를 획득했습니다. 이번 공격 과정과 원인에 대해 느슨한 보안 팀이 분석한 내용은 다음과 같습니다:공격자는 먼저 ExchangeWithAtomic 계약의 depositAsset 함수를 호출하여 0.5개의 USDC 토큰을 예치하여 아래의 공격을 준비했습니다;공격자는 284.47만 개의 USDT 토큰을 플래시 론으로 대출한 후, ExchangeWithAtomic 계약의 doSwapThroughOrionPool 함수를 호출하여 토큰을 교환했습니다. 교환 경로는 [USDC -> ATK(공격자가 생성한 악성 토큰) -> USDT]입니다;교환 결과는 교환 후 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만으로 계산됩니다;이후 교환된 USDT 토큰은 라이브러리 함수 creditUserAssets를 호출하여 공격 계약이 ExchangeWithAtomic 계약에서 사용하는 장부를 업데이트하게 되어, 공격 계약의 ExchangeWithAtomic 계약 내 USDT 토큰 예치금이 568.9만 개로 기록됩니다;마지막으로 공격자는 ExchangeWithAtomic 계약의 withdraw 함수를 호출하여 USDT를 인출하고 플래시 론을 상환한 후 남은 283.6만 개의 USDT 토큰을 WETH로 교환하여 이익을 얻습니다. 공격자는 동일한 방법으로 BSC 체인에서도 공격을 감행하여 19.1만 달러를 획득했습니다;이번 공격의 근본 원인은 계약의 교환 기능 함수에 재진입 보호가 없으며, 교환 후 다시 장부의 예치금 수치를 업데이트하는 것이 교환 전후 계약 내 토큰 잔액 차이에 따라 계산되기 때문에 공격자가 가짜 토큰을 이용해 예치 함수에 재진입하여 예상보다 많은 토큰을 획득하게 된 것입니다.
체인캐처 혁신가들과 함께하는 Web3 세상 구축