Root Cause:
The EIP712Base contract incorrectly defines the EIP-712 domain separator. Specifically, it uses a bytes32 salt instead of the standard uint256 chainId. The domain separator is constructed with:
Instead of the standard:
Furthermore, the domain separator is set using bytes32(getChainId()) as the salt, which doesn't align with the standard EIP-712 implementation.
Impact:
This incorrect implementation can allow attackers to forge signatures for meta-transactions. By exploiting this, an attacker can:
Bypass signature verification in the NativeMetaTransaction contract.
Execute functions protected by role-based access control (e.g., onlyRole(DEFAULT_ADMIN_ROLE)) by spoofing _msgSender().
Gain unauthorized access to privileged functions like updateDAOMembership and callExternalContract, leading to arbitrary code execution, manipulation of DAO configurations, or unauthorized fund transfers.
Recommendation:
Update the EIP712Domain struct and EIP712_DOMAIN_TYPEHASH to match the standard EIP-712 implementation.
Replace bytes32 salt with uint256 chainId in both the struct and the domain separator hash.
Recompute the domain separator with the correct parameters.
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.