{"id":"GHSA-x5m4-43jf-hh65","summary":"soroban-fixed-point-math has Incorrect Rounding and Overflow Handling in Signed Fixed-Point Math with Negatives","details":"### Impact\n\n#### Incorrect rounding direction for signed mul and div operations\n\nThe `mulDiv(x, y, z)` function incorrectly handled cases where both the intermediate product $x * y$ and the divisor $z$ were negative. The logic assumed that if the intermediate product was negative, the final result must also be negative, neglecting the sign of $z$.\n\nThis resulted in rounding being applied in the wrong direction for cases where both $x * y$ and $z$ were negative. The functions most at risk are `fixed_div_floor` and `fixed_div_ceil`, as they often use non-constant numbers as the divisor $z$ in `mulDiv`. \n\nThis error is present in all signed `FixedPoint` and `SorobanFixedPoint` implementations, including `i64`, `i128`, and `I256`.\n\n#### Negative Overflow in `i64`\n\nThe `mulDiv(x, y, z)` function for `i64` used the `i128` type to handle \"phantom overflows\". These are overflows that occur intermediately during a calculation, like when computing the intermediate product $x * y$. When the final result of `mulDiv` was computed in `i128`, it was scaled back down to `i64` before returning. While the code verified that the result did not exceed `i64::MAX`, it did not check against `i64::MIN`.\n\nThis caused negative results smaller than `i64:MIN` to wrap around to a large positive number instead of being caught as an overflow.\n\nThis error only exists for the `FixedPoint` implementation of `i64`. \n\n### Patches\n\n* v1.3.0 users should upgrade to patch v1.3.1\n* v1.4.0 users should upgrade to patch v1.4.1\n\nAll versions `\u003e=v1.4.1` contain the patch. \n\n### Workarounds\nThere are no known workarounds. Upgrade to the patched version.\n\n### Credits\n\nsoroban-fixed-point-math would like to thank the team at [Certora](https://www.certora.com/) for discovering and reporting the issue.","aliases":["CVE-2026-24783"],"modified":"2026-02-03T03:06:39.687842Z","published":"2026-01-28T16:18:54Z","database_specific":{"nvd_published_at":"2026-01-27T22:15:57Z","cwe_ids":["CWE-682"],"severity":"HIGH","github_reviewed":true,"github_reviewed_at":"2026-01-28T16:18:54Z"},"references":[{"type":"WEB","url":"https://github.com/script3/soroban-fixed-point-math/security/advisories/GHSA-x5m4-43jf-hh65"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-24783"},{"type":"WEB","url":"https://github.com/script3/soroban-fixed-point-math/commit/c9233f7094198a49ed66a4d75786a8a3755c936a"},{"type":"PACKAGE","url":"https://github.com/script3/soroban-fixed-point-math"},{"type":"WEB","url":"https://github.com/script3/soroban-fixed-point-math/releases/tag/v1.3.1"},{"type":"WEB","url":"https://github.com/script3/soroban-fixed-point-math/releases/tag/v1.4.1"}],"affected":[{"package":{"name":"soroban-fixed-point-math","ecosystem":"crates.io","purl":"pkg:cargo/soroban-fixed-point-math"},"ranges":[{"type":"SEMVER","events":[{"introduced":"1.4.0"},{"fixed":"1.4.1"}]}],"versions":["1.4.0"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-x5m4-43jf-hh65/GHSA-x5m4-43jf-hh65.json"}},{"package":{"name":"soroban-fixed-point-math","ecosystem":"crates.io","purl":"pkg:cargo/soroban-fixed-point-math"},"ranges":[{"type":"SEMVER","events":[{"introduced":"1.3.0"},{"fixed":"1.3.1"}]}],"versions":["1.3.0"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/01/GHSA-x5m4-43jf-hh65/GHSA-x5m4-43jf-hh65.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"}]}