52780 sc high timestamp manipulation in forcesettlevalidatorcommission leads to permanent loss of staker rewards

Submitted on Aug 13th 2025 at 05:10:23 UTC by @ZeroExRes for Attackathon | Plume Network

  • Report ID: #52780

  • Report Type: Smart Contract

  • Report severity: High

  • Target: https://github.com/immunefi-team/attackathon-plume-network/blob/main/plume/src/facets/ValidatorFacet.sol

  • Impacts: Theft of unclaimed yield

Description

Brief/Intro

An attacker can maliciously advance validatorLastUpdateTimes past the slashedAtTimestamp by calling the permissionless forceSettleValidatorCommission function after a validator is slashed, causing all stakers of the slashed validator to permanently lose accrued rewards between the last update and the slash event. This results in silent, irreversible fund loss proportional to the time gap between the last reward update and the slashing event.

Vulnerability Details

The vulnerability exists in the interaction between forceSettleValidatorCommission and calculateRewardsWithCheckpoints functions. When a validator is slashed, updateRewardPerTokenForValidator unconditionally advances validatorLastUpdateTimes to the current timestamp, even if it exceeds the slashedAtTimestamp:

// In updateRewardPerTokenForValidator
if (validator.slashed) {
    //  This advances timestamp beyond slashedAtTimestamp
    $.validatorLastUpdateTimes[validatorId][token] = block.timestamp;
}

This breaks the reward calculation logic in calculateRewardsWithCheckpoints:

1

Attack flow — Step 1

Validator has validatorLastUpdateTimes = T0

2

Attack flow — Step 2

Validator gets slashed at slashedAtTimestamp = T1 (where T1 > T0)

3

Attack flow — Step 3

Attacker calls forceSettleValidatorCommission(validatorId) at time T2 (where T2 > T1)

4

Attack flow — Step 4

validatorLastUpdateTimes gets set to T2, breaking the condition T1 > T2

5

Attack flow — Step 5

Reward calculation for period T0→T1 is permanently skipped

Impact Details

Complete loss of rewards for all stakers of the slashed validator for the period between last update and slash.

References

Mentioned above

Proof of Concept

Add to PlumeStakingDiamond.t.sol

Was this helpful?