31556 - [SC - Critical] Unfair Revenue Distribution in Non-Alchemix Rev...
Submitted on May 21st 2024 at 08:51:51 UTC by @Limbooo for Boost | Alchemix
Report ID: #31556
Report type: Smart Contract
Report severity: Critical
Target: https://github.com/alchemix-finance/alchemix-v2-dao/blob/main/src/RevenueHandler.sol
Impacts:
Theft of unclaimed yield
Description
Introduction
The RevenueHandler contract has a critical vulnerability in its checkpoint function. This vulnerability specifically affects non-Alchemix revenue tokens, which are held in the contract and distributed directly to veALCX holders. The issue arises because the contract calculates revenue for each epoch using the total balance of these tokens, without accounting for unclaimed revenue from previous epochs. This can result in unfair distribution of revenue and potentially allow malicious users to exploit the system to claim more than their fair share of rewards.
Vulnerability Details
The core issue lies in the checkpoint function for non-Alchemix revenue tokens, which are held in the contract rather than swapped for alAssets:
src/RevenueHandler.sol:
228: function checkpoint() public {
....
@>245: uint256 thisBalance = IERC20(token).balanceOf(address(this));
246:
247: // If poolAdapter is set, the revenue token is an alchemic-token
248: if (tokenConfig.poolAdapter != address(0)) {
....
258: } else {
259: // If the revenue token doesn't have a poolAdapter, it is not an alchemic-token
@>260: amountReceived = thisBalance;
261:
262: // Update amount of non-alchemic-token revenue received for this epoch
@>263: epochRevenues[currentEpoch][token] += amountReceived;
264: }
...
269: }This line calculates the revenue based on the total balance of the contract's address, including unclaimed revenues from previous epochs. As a result, the revenue for each new epoch is incorrectly calculated by reusing the entire balance, leading to the following problems:
Unfair Revenue Distribution: Users who delay claiming their rewards allow new users to share in the unclaimed revenue, leading to an inequitable distribution.
Exploit Potential: A malicious user can strategically lock a large amount of tokens just before the end of an epoch and claim a disproportionate share of the total revenue, including unclaimed amounts from previous epochs.
Impact Details
The potential losses and impacts from this vulnerability include:
Unfair Distribution: Users who participate early receive fewer rewards than expected, as their share is diluted by unclaimed balances.
Exploit by Malicious Users: Users can exploit the system by locking large amounts just before epoch transitions, claiming a large share of total revenues, including unclaimed previous revenues.
Financial Imbalance: Continuous unfair distribution can lead to significant financial imbalance, depleting the treasury or other revenue sources, and potentially threatening the protocol’s sustainability.
Mitigation Analysis
To mitigate this vulnerability, the checkpoint function needs to be revised to accurately track and calculate the revenue generated in each epoch. The correct approach should involve:
Tracking deposits and withdrawals separately for each epoch.
Calculating the new revenue by subtracting last epoch revenues (excluding its withdrawals (claims)) from the current balance to ensure only the new revenue is distributed.
Proof of Concept
The test can be added to a new file under the current test suite src/test/RevenueHandlerPoC.t.sol, then specify the file name in FILE flag under Makefile configuration. Run using make test_file
Last updated
Was this helpful?