The owner of the LSTRewardsSplitterController contract will be unable to remove an LSTRewardsSplitter because the LSTRewardsSplitter::withdraw function reverts.
In the LSTRewardsSplitterController::removeSplitter function, rewards are distributed to the fee receivers of the LSTRewardsSplitter contract being removed (referred to as Contract A) if the Liquid Staking Token (LST) balance of Contract A is greater than the principal amount deposited. After the rewards are split, the LST balance of Contract A becomes lower than the initial LST balance. As a result, when the LSTRewardsSplitter::withdraw function is called with the _amount parameter equal to the initial LST balance, it reverts, causing the LSTRewardsSplitterController::removeSplitter function to fail.
Malicious users can exploit this behavior by frontrunning the LSTRewardsSplitterController::removeSplitter function, preventing the removal of an LSTRewardsSplitter. The following is an example of a potential attack:
The contract owner attempts to call the LSTRewardsSplitterController::removeSplitter function to remove an LSTRewardsSplitter.
If the LST balance of the LSTRewardsSplitter contract is equal to the principal amount deposited, a malicious user can frontrun the owner's transaction by sending a small amount of LST (e.g., 1000 wei) to the LSTRewardsSplitter contract. This increases the LST balance above the principal amount.
As a result, the LSTRewardsSplitterController::removeSplitter transaction will fail and be reverted.
LSTRewardsSplitterController::removeSplitter function:
LSTRewardsSplitter::withdraw function:
The owner of the LSTRewardsSplitterController contract will be unable to remove an LSTRewardsSplitter.
Manual Review
Update the LSTRewardsSplitterController::removeSplitter function as follows:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.