domainSeperator in EIP712Base is only set during contract deployment and cannot be updated. Since it includes the chain ID, this means signatures remain valid across chain forks, enabling cross-chain replay attacks.
The current implementation sets domainSeperator once during contract deployment and stores it as an immutable value. The chain ID is embedded within the domain separator at deployment time, but remains static even if the contract is deployed on a forked chain.
This creates a scenario where signatures generated on the original chain remain valid on any fork of that chain, as the domain separator doesn't reflect the new chain's identity. The issue is made worse by the fact that there's no mechanism to update or refresh the domain separator after deployment.
Signatures created on the original chain can be replayed on forked chains and any meta-transaction using this signature verification can be replayed. This affects all contracts inheriting from EIP712Base (OWPIdentity, NativeMetaTransaction), which could lead to unauthorized actions being executed on forked chains, particularly dangerous for high-value operations like profit claiming or membership transfers.
Manual Review
The domain separator should be computed dynamically based on the current chain ID:
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.