# Malicious actor cause rebase to an old inflation multiplier

Permissionless L1ECOBridge.rebase queues stale inflation-multiplier messages; attacker later relays an old one to desync L1/L2 ECO token inflation.

- Payout: Contest reward
- Severity: high
- Program: Ecoprotocol
- Credited: 0xDjango
- Disclosed: 2023-05-08
- Write-up quality: 6/10
- Original: https://github.com/sherlock-audit/2023-05-ecoprotocol-judging/issues/142
- Library page: https://bugbountylibrary.com/r/sherlock%3A2023-05-ecoprotocol%3AH-2
- Tags: domain:web3 impact:integrity kind:contest platform:sherlock sev:high tech:evm technique:source-review vuln:access-control vuln:business-logic vuln:signature-replay

**Target:** L1ECOBridge rebase cross-domain messaging
**Root cause:** rebase() is permissionless and the L2 message carries no block number, so an old queued message can be relayed after newer rebases, overwriting the L2 inflation multiplier with a stale value.
**Steps:**
1. Call `L1ECOBridge.rebase(_l2Gas)` many times with high `_l2Gas` to flood `L2CrossDomainMessenger` queue
2. Let some messages fail/remain unrelayed while legitimate rebases execute
3. Later relay one of the attacker's old rebase messages to `L2ECOBridge.rebase`
4. L2 ECO inflation multiplier is set to the stale value, desyncing L1 and L2
**How found:** Noticed rebase() lacks auth guards unlike upgrade functions, and that the cross-domain message omits the L1 block number, enabling stale-message replay.
**Exploitation:** Attacker spams permissionless rebase calls to congest the L2 messenger, waits for legitimate rebases to advance the multiplier, then replays an old queued message to reset L2 to a stale multiplier and profit from the L1/L2 imbalance.
**Insight:** For permissionless cross-chain sync functions, check whether the message includes a monotonic version/block number; without it, queued or failed messages become replayable to roll state backward.
