# Signature valid but signer identity unbound

Signature checks that trust a supplied key without binding it to the claimed owner or allowlisted forwarder

_Area: Smart contract access control and control flow. Seen in 3 disclosed reports; one confirmed bounty: $400,000; latest 2024-06-24. Updated 2026-11-02._

## How it works
A check confirms "this signature is valid for this key" and stops there. The missing step is proving the key belongs to the party the message claims to represent. Whoever supplies the key controls the identity: any keypair can sign data attributed to someone else, or a trusted relay can be pointed at an attacker-chosen key. The assumption that breaks is "valid signature implies the claimed signer." Validity and ownership are separate properties, and only the first is checked. The same gap appears when a trusted caller's privilege is allowed to stand in for per-user authorization: the relay is trusted, so its payload fields are trusted too.

## Where it shows up
- Signature verification that reads a pubkey or address from the same message it is validating, with no registry lookup [E3](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AH-15.md).
- Paymaster or meta-tx code where the trusted-forwarder check lives in a function that a subclass overrides or drops [E1](https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md).
- Whitelisted relay contracts that forward user-supplied structs; a `user`/`from` field is trusted because the caller is trusted [E2](https://bugbountylibrary.com/r/c4%3A2024-02-tapioca%3AH-01.md).

## How to review
For every signature or proof check, ask: where does the key come from, and is it looked up against a registry binding it to the claimed identity? The invariant: the verified key must equal the key registered for the claimed participant, and that binding must be checked in the same path that accepts the data. For relays and paymasters, confirm the trusted-forwarder allowlist check actually executes on every entry point, including overridden ones [E1](https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md). For whitelisted callers, enumerate every field of the forwarded struct and confirm each is authorized against the real sender, not the relay [E2](https://bugbountylibrary.com/r/c4%3A2024-02-tapioca%3AH-01.md).

## How finders spotted it
- Traced the GSN integration and noticed the external function holding the trusted-forwarder check was overridden, so `preRelayedCall` never validated the forwarder [E1](https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md).
- Read `_checkSender` whitelist logic and followed the compose flow, seeing `data.user` encoded without validation while USDO was whitelisted [E2](https://bugbountylibrary.com/r/c4%3A2024-02-tapioca%3AH-01.md).
- Read the `Validate` functions and saw signature verification used the supplied pubkey without binding it to the claimed signer; wrote a test proving a mismatched keypair is accepted [E3](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AH-15.md).

## Variants seen
- Overridden function silently removes the forwarder allowlist check [E1](https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md).
- Trusted relay acts on an attacker-controlled `user` field [E2](https://bugbountylibrary.com/r/c4%3A2024-02-tapioca%3AH-01.md).
- Pubkey not bound to registered worker/reputer identity [E3](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AH-15.md).

## Impact and severity
Drained Vaults via inflated relay fees, scaled across many small funds [E1](https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md); manipulated victim positions through a whitelisted relay [E2](https://bugbountylibrary.com/r/c4%3A2024-02-tapioca%3AH-01.md); tampered data attributed to innocent participants [E3](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AH-15.md). Severity rises with how much the trusted party can move and how many targets share the flaw [E1](https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md)[E2](https://bugbountylibrary.com/r/c4%3A2024-02-tapioca%3AH-01.md).

## Seen in real software
Open-source packages and projects, and products, where this pattern was found. If the target runs one, compare the version it runs with the fix.
- **Enzyme Finance** (GasRelayPaymasterLib) (version not stated): Enzyme Finance Missing Privilege Check Bugfix Review. Report: https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md

## Evidence
- E1: https://bugbountylibrary.com/r/blog%3Aimmunefi-com-blog-bug-fix-reviews-enzyme-finance-privilege-check.md
- E2: https://bugbountylibrary.com/r/c4%3A2024-02-tapioca%3AH-01.md
- E3: https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AH-15.md
