When a Signer approves a withdraw, signs the message, and 'L1BossBridge.sol::sendToL1' is called, the input parameters can be grabbed and used again by anyone. They can replay the withdraw request multiple times by calling the 'L1BossBridge.sol::sendToL1' function with the same parameters.
Because the input parameters for the 'L1BossBridge.sol::sendToL1' function will be public to anyone, someone can copy them and call the function again to replay any withdraw request. In the 'L1BossBridge.sol::sendToL1' function, only the signer of the message is being checked, this does not stop someone
from using the exact same signed message multiple times. Because a withdraw request can be used multiple times, this could lead to the entire protocols value being withdrawn.
The below test passes as true showing that 'user' withdrew all available funds using the same signed message multiple times.
--Foundry
It is recommended to use a unique nonce when hashing and signing the withdrawal message and to then check if that nonce has been used in the 'L1BossBridge.sol::sendToL1' function. This could prevent the same transaction from being use more than once.
Alternatively, the hash of the signed message could be stored after it has been used. Then in the 'L1BossBridge.sol::sendToL1' function, it can be checked if that exact hash has already been used and refuse it if it has.
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.