[Solodit] Flawed Precision and Scaling Logic in `price()`
개요
심각도 : High
언어 : Solidity
취약점 유형 : Logic Bug
이 리포트는 NUTS Finance 프로젝트에서 MixBytes가 발견한 ChainlinkCompositedOracleProvider의 price() 함수 정밀도(precision) 및 스케일(scaling) 처리 로직 결함에 대한 취약점에 대해 설명한다.
price() 함수가 고정소수점 정밀도를 잘못 처리한다. 여러 번 피드(oracle feed)를 합성할 때, 각 피드가 inverted(역산) 여부에 따라 두 가지 로직을 따르게 만든다.
영향 받는 코드
1. isInverted == true (역산 oracle 피드)
누적값(accumulator)에 (10^assetDecimals) * (10^feed.decimals()) / feedPrice 를 곱한다.
inverted 피드가 반복될수록 assetDecimals 반복 적용되고 정밀도가 의도치 않게 계속 커진다. (overflow 위험)
2. isInverted == false
누적값 x feedPrice / (10^currentDecimals)
모든 피드 (non-inverted)면 마지막 PRECISION으로 나눈다. 소수점 데이터가 모두 손실된다. (정수만 남음)
복수의 피드를 거치면 underflow/overflow 등으로 실제 합성 가격이 여러 자리수가 틀어지고 정상 가격이 아니라, 예상치 못한 가격이 산출된다. 또한 외부 컨트랙트에서 수익화(arbitrage) 등 악용이 가능해진다.
레퍼런스
Smart Contract Vulnerability Dataset - Cyfrin Solodit
flawed-precision-and-scaling-logic-in-price-mixbytes-none-nuts-finance-markdown
solodit.cyfrin.io
audits_public/NUTS Finance/Tapio/README.md at master · mixbytes/audits_public
MixBytes Team public security audits. Contribute to mixbytes/audits_public development by creating an account on GitHub.
github.com