Platform: Code4rena
Start Date: 22/05/2024
Pot Size: $20,000 USDC
Total HM: 6
Participants: 126
Period: 5 days
Judge: 0xsomeone
Total Solo HM: 1
Id: 379
League: ETH
Rank: 83/126
Findings: 1
Award: $0.01
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: Circolors
Also found by: 0rpse, 0x175, 0xAadi, 0xHash, 0xMax1mus, 0xMosh, 0xblack_bird, 0xdice91, 0xfox, 0xhacksmithh, 0xloscar01, 0xrex, 4rdiii, Audinarey, AvantGard, Bigsam, DPS, Dots, Drynooo, Dudex_2004, Evo, Kaysoft, King_, Limbooo, MrPotatoMagic, PENGUN, Sabit, SovaSlava, SpicyMeatball, TheFabled, Utsav, Varun_05, Walter, adam-idarrha, araj, aslanbek, ayden, bctester, biakia, bigtone, brgltd, carrotsmuggler, cats, crypticdefense, dd0x7e8, dhank, fandonov, fyamf, grearlake, iamandreiski, ilchovski, jasonxiale, joaovwfreire, lanrebayode77, m4ttm, merlinboii, niser93, nnez, octeezy, oxchsyston, pamprikrumplikas, rouhsamad, tedox, trachev, turvy_fuzz, twcctop, yotov721, zhaojohnson
0.0056 USDC - $0.01
An attacker can use the lockOnBehalf
function to continuously extend the lock time of any player, resulting in the player's tokens being permanently locked. Additionally, since there is no minimum token amount restriction for calling the lockOnBehalf
function, the attack cost is very low.
The code for the lockOnBehalf
function is as follows:
function lockOnBehalf( address _tokenContract, uint256 _quantity, address _onBehalfOf ) external payable notPaused onlyActiveToken(_tokenContract) onlyConfiguredToken(_tokenContract) nonReentrant { address tokenOwner = msg.sender; address lockRecipient = msg.sender; if (_onBehalfOf != address(0)) { lockRecipient = _onBehalfOf; } _lock(_tokenContract, _quantity, tokenOwner, lockRecipient); }
The code for extending the lock time in the _lock
function is as follows:
function _lock( address _tokenContract, uint256 _quantity, address _tokenOwner, address _lockRecipient ) private { ... lockedToken.unlockTime = uint32(block.timestamp) + uint32(_lockDuration); }
The code for checking the unlockTime
when unlocking is as follows:
function unlock( address _tokenContract, uint256 _quantity ) external notPaused nonReentrant { ... if (lockedToken.unlockTime > uint32(block.timestamp)) revert TokenStillLockedError(); ... }
By analyzing the above code, it can be seen that an attacker can extend the lock time of any player.
Add restrictions when extending the lock time for other players, such as only allowing addresses authorized by the player to extend the lock time, or limiting the minimum token amount.
Other
#0 - c4-judge
2024-06-05T12:57:59Z
alex-ppg marked the issue as satisfactory