Assessment reports>Empiric Oracle>Medium findings>Mathematical expressions could produce incorrect values
Category: Coding Mistakes

Mathematical expressions could produce incorrect values

Medium Severity
High Impact
Low Likelihood

Description

It was observed in the yield curve cairo code that in calculate_future_spot_yield_point some multiplication occurs with numbers that have not been given an upper bound. While integer overflow conditions are not strictly limited to multiplication, this is where we're most likely to find valid conditions for overflow behavior.

In calculate_future_spot_yield_point, a call is made to starkware.cairo.common.pow where the exponent is output_decimals + spot_decimals - future_decimals. Based on how this function is called, future_decimals can, at least, be 1. No reasonable upper bound exists for the exponent and pow, internally, performs unchecked multiplication. This means that the following expressions

# Shift future/spot to the left by output_decimals + spot_decimals - future_decimals
let (ratio_multiplier) = pow(10, output_decimals + spot_decimals - future_decimals)
let (shifted_ratio, _) = unsigned_div_rem(
    future_entry.value * ratio_multiplier, spot_entry.value
)

can result in integer overflow when performing the pow operation as the exponent cap is 2^251. Note that this is not 251, but 2 raised to the 251. This will easily overflow the ratio_multiplier, causing the ratio to be an unexpected value.

Impact

Mathematical expressions can miscalculate, causing incorrect spot pricing.

Recommendations

Assert that the exponent passed to pow is less than some amount. Additional, provide additional assertions around entry valuation to ensure the provided number is reasonable and not at the limits of what a felt can support.

Remediation

The issue was addressed in a later update.

Zellic © 2023Back to top ↑