web3/Solodit Report

[Solodit] Flawed Precision and Scaling Logic in `price()`

Tyojong 2025. 9. 23. 11:33

개요


심각도 : 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