The L1BossBridge::sendToL1
can be called with the same signatures again and again until all funds are drained from the Vault. As there is no updation on-chain when one withdraws the amount using the signature and it is not tracked whether the signature being used was used earlier or not, as a result of which it can be used multiple times.
Also the parameters in the signature are not sufficient to track whether the signature being used is fresh or already used.
When one deposits token on L2 to bridge them on L1, the bridge operator approves it by signing a withdrawal message but the usage of signature is not tracked, thus it can be used multiple times to withdraw the tokens on L1 again and again, and potentially drain all the funds via the L1BossBridge::sendToL1
function.
Attacker: One who deposits token on L2 to bridge on L1 and use the same signature to withdraw multiple times and drain all the funds.
User: One who deposits on L1 and wants to bridge on L2.
Protocol: The L1BossBridge which handles all the token deposits and withdrawal.
Vault: The vault used to hold the deposited funds.
High. All funds can be drained out of the Vault by re-using the same signature.
High. One is only required to call the L1BossBridge::withdrawTokensToL1
to re-use the same signatures again and again, and potentially withdraw all the funds.
Manual Review, Foundry Test
Use a nonce in the withdrawal message which is signed by the bridge operator.
This way each signature can be uniquely identified and can be tracked via mapping(uint256 nonce => bool) isUsed
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.