MondrianWallet::_ValidateSignature function should validate a signature and cross check it with MondrianWallet::owner but it isn't actually being checked in the function which may allow any Malicious Users transaction to be validated even if it is not signed by MondrianWallet::owner
Any Malicious User can create a PackedUserOperation with a target MondrianWallet address as sender and any valid signature , can get validated by MondrianWallet::_ValidateSignaturesince there is no proper validation in place i.e The Recovered Addresses is not validated if it belongs to MondrianWallet::owner this may lead to complete loss of owner funds if the malicious user crafts a calldata to drain the MondrianWallet
The statement ECDSA.recover recovers the address of the signer and returns it but it is nevercompared with the MondrianWallet::owner , any malicious user can create a valid signature and bypass the validation.
Look at the points marked with @> in the below output
The wallet owner is 0x7c8999dC9a822c1f0Df42023113EDB4FDd543266
The Signature is signed by 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266's private key the first account in local nodes
The Validation only checks if the signer is the one who signed the userOp hence it returns 0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266 the recovered address
It never cross checks if this address belongs to MondrianWallet::owner and concludes the validation as SIG_VALIDATION_SUCCESS by returning 0
Once the ECDSA.recover is done in MondrianWallet::_ValidateSignature and an address is returned ,it should be cross checked with MondrianWallet::owner to ensure if the owner is the actual signer of the signature provided
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.