code4rena-2023-06-angle-protocol-m05

[M-05] uint128 changeAmount might overflow

보고서

Summary

특정 조건에 changeAmount가 절삭되어 SafeCast에 의해 revert 되고, 이로 인해 swap이 실패한다.

Keyword

overflow/underflow, casting

Vulnerability

changeAmount는 uint128로 캐스팅된다. 이로 인해 changeAmount가 실제 값보다 절삭될 수 있다. SafeCast를 이용하므로 revert 될 것이다. 이로 인해 특정 양의 swap이 실패할 수 있다.

File: transmuter/contracts/transmuter/facets/Swapper.sol
176:     function _swap() {
 
189:                 uint128 changeAmount = (amountOut.mulDiv(BASE_27, ts.normalizer, Math.Rounding.Up)).toUint128();
 
210:                 uint128 changeAmount = ((amountIn * BASE_27) / ts.normalizer).toUint128();

changeAmount 계산에 사용되는 변수는 다음과 같다.

  1. normalizer
  2. BASE_27
  3. amountOut 또는 amountIn

하나씩 값을 살펴보고 changeAmount의 절삭 가능성이 있는지 살펴보자.

  1. normalizer
File: transmuter/contracts/transmuter/facets/Redeemer.sol
193:         if (newNormalizerValue <= BASE_18 || newNormalizerValue >= BASE_36) {
 
208:             newNormalizerValue = BASE_27;
209:         }

normalizer 값은 1e18 ~ 1e36 사이의 값이다. 최악의 상황으로 1e18인 상황을 가정해보자.

  1. BASE_27

BASE_27는 상수 1e27이다.

  1. amountOut 또는 amountIn는 agToken의 양을 의미하며, 18 decimal이다.

이들을 종합해 계산하면 changeAmount의 계산 값은 1e18 * 1e27 / 1e18 = 1e27 이다.

uint128의 최대 값은 3.4e38이다. 오버플로우가 발생하려면 amountOut 또는 amountIn 값은 3.4e38 / 1e27 = 3.4e11 이상이어야 한다.

이는 굉장히 큰 금액일 것이다. 하지만 특정 토큰에 인플레이션이 일어날 가능성, 오랜 기간 프로토콜이 운영되며 인플레이션이 일어날 가능성을 고려해야 한다. 이 프로토콜이 세계 모든 국가에서 보편적으로 사용되려면 엣지케이스를 고려할 필요가 있다.

  • USD와 금값과 비교하면, 1970년대 35 USD/oz 였던 것이 2000 USD/oz 로 약 60배 차이난다.
  • 어떤 나라는 인플레이션율이 높다.
  • 10~20년 시간이 더 길어지면 감가상각의 영향이 있을 수 있다.

예를 들어 현재 3.4e11의 IRR(이란 Rial)은 8M USD의 가치를 지닌다. 따라서 이 취약점이 트리거되려면 8M USD만큼의 IRR이 이동해야 한다. 하지만 만약 20년 후 인플레이션으로 인해 IRR이 100배 싸진다면, 80K의 USD만으로 취약점이 트리거될 수 있다. 이정도 금액이 움직이는 것은 현실적으로 가능할 것이다.

Impact

심한 인플레이션 상황에 swap이 실패한다.

Mitigation

  • changeAmount를 절삭하지 않고 uint256를 사용한다.
  • normalizer를 좀 더 좁은 범위의 값을 사용한다.

Memo

프로젝트 측은 오버플로우의 가능성은 있지만, 최악의 경우 SafeCast로 터지도록 하여 괜찮다고 했다.

인플레이션 가능성을 현실적으로 설명하는 부분이 인상적이다.


tags: bughunting, angle protocol, smart contract, solidity, stablecoin, casting overflow underflow, severity medium