출처:Beosin
2024년 3월 5일 저녁 늦은 시간, Beosin Trace 플랫폼에 따르면 Arbitrum 체인의 WooPPV2 계약 프로젝트인 가 가격 조작 공격을 받아 약 850만 달러의 손실을 입었습니다. 해커들은 라이트닝 대출을 이용해 USDC.e와 Woo 토큰을 빌려준 다음, WooPPV2 컨트랙트를 통해 빈번하게 토큰을 교환했습니다. WooPPV2 컨트랙트의 가격 계산 결함으로 인해 해커들은 교환 과정에서 가격을 조작할 수 있었고, 그 결과 대량의 Woo 토큰을 도난당했습니다. 베오신 보안팀은 이 사건을 가장 먼저 분석했습니다.
취약점 분석
WooPPV2 컨트랙트에는 사용자가 토큰 교환을 위해 호출할 수 있는 스왑 기능이 존재합니다. 사용자는 이 함수를 호출하여 토큰을 교환할 수 있으며, 다음은 주요 USDC.e와 Woo 두 가지 교환(다음은 분석할 USDC.e와 Woo 간의 교환에 따른 것입니다)으로, quoteToken 변수의 함수는 USDC.e를 나타냅니다.
_sellQuote 함수와 _sellBase 함수는 가격을 기준으로 교환할 토큰 수를 계산한 다음 호출자에게 토큰을 전송하는 로직이 거의 동일합니다. 호출자가 USDC로 Woo 토큰을 상환할 때 _sellQuote 함수가 호출됩니다. 주요 함수는 Woo 토큰의 가격을 보관하는 구조를 반환하는 데 사용되는 state와 _calcBaseAmountSellQuote, 상환할 토큰 수와 새 가격을 계산하는 함수인 _calcBaseAmountSellQuote입니다. 수량과 새 가격을 계산하는 함수입니다.
이미지 src="https://img.jinse.cn/7187847_image3.png">
다음으로 _calcBaseAmountSellQuote 함수의 로직을 살펴봅시다. 계산된 교환 횟수에 대한 baseAmount가 주요 로직이며, 여기서 주요 로직은 USD.e를 Woo의 가격으로 나눈 수, 교환 가능한 Woo의 수, 현재 가격과 새로운 가격을 교환한 후 계산된 교환 횟수입니다.
_sellBase 함수는 _sellQuote 함수와 동일하지만, _. calcQuoteAmountSellBase 함수는 조금 다르며, 주요 로직은 Woo의 수에 Woo의 가격을 곱하여 교환할 수 있는 USDC.e의 수를 구하는 것입니다.
상환 로직에서 문제점을 발견할 수 있는데, 이 상환 수량 계산 로직은 다음과 유사합니다. 유니스왑과 다른 전통적인 스왑의 상품 상수 모델과는 다른데, 이 모델은 가격을 기반으로 곱셈과 나눗셈을 직접 수행하여 수량을 계산하므로 상환 과정에서 미끄러짐이 없지만 상환에 따라 가격이 다시 변경됩니다. 발신자가 계산에 주의를 기울인다면 내부에 토큰을 보관할 수 있습니다.
예를 들어:
풀에 처음에 1,000개의 A 토큰과 1,000개의 B 토큰이 있고, B 토큰의 가격이 1이라고 가정해봅시다. 그런 다음 500개의 A 토큰을 사용하면 500개의 B 토큰을 교환할 수 있으며, 이때 풀은 1500:500이 되고 B 토큰의 가격은 예를 들어 2로 상승합니다. 다음으로 교환한 500개의 B 토큰을 사용하여 1,000개의 A 토큰을 교환하면 결국 풀은 500:1,000이 되고 500개의 A 토큰이 허공에서 설정될 것입니다.
이 경우 공격자는 이 보안 문제를 이용했는데, 공격자가 어떻게 공격했는지 살펴보겠습니다.
공격 흐름
공격자는 이 사고에서 동일한 기법을 여러 번 사용했습니다. style="text-align: 왼쪽;">0xe80a16678b5008d5be1484ec6e9e77dc6307632030553405863ffb38c1f94266 이 트랜잭션을 예로 들어보겠습니다.
1. 공격자는 라이트닝 크레딧을 통해 1,000만 USDC.e 이상과 272만 Woo 토큰을 빌려주었습니다.
2. 다음으로 공격자는 100,000 USDC.e를 세 번에 걸쳐 Woo 토큰으로 교환하는데, 이 시점에서 다음과 같이 할 수 있습니다. Woo의 가격은 여전히 정상 가격이며, 공격자는 현재 800만 개 이상의 Woo 토큰을 보유하고 있습니다.
3. 그 직후 공격자는 800만 개 이상의 우 토큰을 직접 사용하여 USDC.e로 교환했는데, 이때 위 문제로 인해 800만 개 이상의 우 토큰은 모두 정상 가격으로 교환되어 200만 개 이상의 USDC.e로 교환되었으며, 위 공식에 따르면 이때 우의 가격은 7로 계산되어 거의 1000만 배가 줄어든 것으로 계산됩니다.
4. 결국 공격자는 극히 적은 수의 Woo 토큰을 사용하여 800만 개 이상의 USDC.e를 전환한 것입니다. Woo 토큰을 교환하고 결국 라이트닝 대출로 돌아와 시장을 떠났습니다.
이미지 src="https://img.jinse.cn/7187853_image3.png">
펀딩 추적기
해킹 이후 공격자들은 크로스체인 브리지를 통해 200 ETH를 이더 체인에 있는 주소로 전송했으며, 나머지 2,000여 ETH는 Arbitrum 체인에 있는 주소에 보관 중이며, 보도 시점 현재 자금은 이동하지 않은 것으로 확인되었습니다.
아비트럼 체인에 대한 이번 가격 조작 공격에 비추어 볼 때, 가상자산 공간에서 보안 위험의 중요성을 인식하는 것이 중요합니다.