Platform: Code4rena
Start Date: 22/09/2023
Pot Size: $100,000 USDC
Total HM: 15
Participants: 175
Period: 14 days
Judge: alcueca
Total Solo HM: 4
Id: 287
League: ETH
Rank: 149/175
Findings: 1
Award: $11.47
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: MrPotatoMagic
Also found by: 0xAadi, 0xDING99YA, 0xDemon, 0xRstStn, 0xSmartContract, 0xStriker, 0xWaitress, 0xbrett8571, 0xfuje, 0xsagetony, 0xsurena, 33BYTEZZZ, 3docSec, 7ashraf, ABA, ABAIKUNANBAEV, Aamir, Audinarey, Bauchibred, Black_Box_DD, Daniel526, DanielArmstrong, DanielTan_MetaTrust, Dinesh11G, Eurovickk, Franklin, Inspecktor, John, Jorgect, Joshuajee, K42, Kek, Koolex, LokiThe5th, MIQUINHO, Myd, NoTechBG, QiuhaoLi, SanketKogekar, Sathish9098, Sentry, Soul22, SovaSlava, Stormreckson, Tendency, Topmark, Udsen, V1235816, Viktor_Cortess, Viraz, Yanchuan, ZdravkoHr, Zims, albahaca, albertwh1te, alexweb3, alexxander, ast3ros, audityourcontracts, bareli, bin2chen, bronze_pickaxe, c0pp3rscr3w3r, cartlex_, castle_chain, chaduke, debo, ether_sky, gumgumzum, imare, its_basu, jaraxxus, jasonxiale, josephdara, kodyvim, ladboy233, lanrebayode77, lsaudit, mert_eren, minhtrng, n1punp, nadin, niroh, nmirchev8, orion, peakbolt, perseverancesuccess, pfapostol, ptsanev, rvierdiiev, saneryee, shaflow2, te_aut, terrancrypt, twcctop, unsafesol, ustas, versiyonbir, windhustler, yongskiws, zhaojie, ziyou-
11.4657 USDC - $11.47
https://github.com/code-423n4/2023-09-maia/blob/f5ba4de628836b2a29f9b5fff59499690008c463/src/RootBridgeAgent.sol#L966-L978 https://github.com/code-423n4/2023-09-maia/blob/f5ba4de628836b2a29f9b5fff59499690008c463/src/RootBridgeAgent.sol#L1045-L1064
The _createSettlement
and _createSettlementMultiple
functions increment the settlementNonce
state variable using a simple addition. This can cause an integer overflow when the nonce reaches the maximum uint32 value.
The settlement nonce increment in _createSettlement is done using a simple increment. This could overflow eventually. https://github.com/code-423n4/2023-09-maia/blob/f5ba4de628836b2a29f9b5fff59499690008c463/src/RootBridgeAgent.sol#L966-L978
The settlement nonce increment in _createSettlementMultiple is done using a simple increment. This could overflow eventually. https://github.com/code-423n4/2023-09-maia/blob/f5ba4de628836b2a29f9b5fff59499690008c463/src/RootBridgeAgent.sol#L1045-L1064
The nonce increment logic occurs at these lines:
// RootBridgeAgent.sol function _createSettlement(...) internal returns (bytes memory) { // ... // Issue is here: settlementNonce = settlementNonce + 1; // ... } function _createSettlementMultiple(...) internal returns (bytes memory) { // ... // Issue is also here: settlementNonce = settlementNonce + 1; // ... }
The settlementNonce
is incremented using a simple addition.
This could eventually overflow, especially if the contract is long-lived.
A more in-depth of how the settlement nonce increment can overflow.
The nonce increment logic:
uint32 public settlementNonce;
function _createSettlement() internal { // Increment settlementNonce = settlementNonce + 1; }
The settlementNonce
variable is a uint32.
This means it can hold values between 0 and 2^32 - 1.
When it reaches the max value 2^32 - 1, incrementing will overflow.
For example:
If settlementNonce
is 4294967295 (2^32 - 1)
settlementNonce + 1
overflows to 0
Proof of overflow:
Let's assume settlementNonce = 4294967295 (2^32 - 1) settlementNonce + 1 = 4294967295 + 1 = 4294967296 But uint32 can only hold values up to 2^32 - 1. So 4294967296 overflows and loops back to 0.
Impact of overflow:
This causes the nonce to reset from very high values to 0.
Could result in nonce collisions.
Two settlements end up with the same nonce, leading to errors.
Manual Inspection
A better approach would be to use the SafeMath library's add
function:
settlementNonce = settlementNonce.add(1);
This prevents overflow issues.
Under/Overflow
#0 - c4-pre-sort
2023-10-10T06:33:46Z
0xA5DF marked the issue as duplicate of #834
#1 - c4-pre-sort
2023-10-10T06:33:54Z
0xA5DF marked the issue as sufficient quality report
#2 - c4-judge
2023-10-25T13:37:13Z
alcueca changed the severity to QA (Quality Assurance)