The LSTRewardsSplitter contract has a vulnerability related to how rewards are transferred to the lst address (which represents the Liquid Staking Token). In the _splitRewards function, when the reward distribution includes a transfer to the lst address, the contract attempts to burn these tokens. However, since the contract relies on IERC677, which does not natively support a burn function, this can result in unexpected behavior or even a failure in the rewards distribution mechanism.
The issue arises in the _splitRewards function, where the contract checks if the fee.receiver is the same as the lst address, and if so, it attempts to call the burn function on the lst contract. The problem here is that IERC677 (the interface for the lst token) does not include the burn function. Depending on the implementation of the lst token, this call may fail, revert, or even be ignored.
If the contract is deployed using an lst token that does not implement a burn function, this could lead to failed transactions or incomplete rewards distribution, making the system vulnerable to disruptions.
The problematic part of the _splitRewards function is as follows:
This logic assumes that the lst token has a burnable feature, which is not guaranteed by the IERC677 interface. Attempting to call burn on a token that doesn’t support it can cause a failure, stopping the reward distribution process and leaving the contract in an inconsistent state.
Here a test to prove vulnerability:
If a portion of the rewards is supposed to go to the lst address (with the intention of being burned), the entire rewards distribution can fail, leaving all recipients without their rewards.
Because the rewards distribution process is central to the contract's function, failing to distribute rewards disrupts the staking process and undermines user trust in the system.
If the contract fails mid-operation, there may be situations where rewards are not properly distributed, leading to a financial imbalance and potential losses.
Manual review.
The contract should check whether the lst token supports a burn function before attempting to call it. This can be achieved by using try-catch or implementing an interface check.
Instead of burning the tokens directly, the contract could transfer the tokens to a designated burn address, which acts as a null account (e.g., the zero address or another address designated for burning tokens).
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.