1. Incident Overview & Financial Impact
Over the past 48 hours, security monitoring identified a surge in off-chain signature phishing campaigns targeting decentralized finance users via Uniswap's universal Permit2 contract (0x000000000022d473030f116ddee9f6b43ac78ba3).
Unlike standard ERC-20 approval exploits that require an on-chain approval transaction costing gas, this exploit vector leverages cryptographic EIP-712 signatures signed entirely off-chain in the victim's wallet. Because many web3 wallets lack native deep-decoding for complex nested typed arrays, users sign what appears to be a benign gasless verification, inadvertently authorizing the attacker's contract to sweep multiple token balances simultaneously.
The cumulative financial impact across affected liquidity providers and retail traders exceeds $3.8M in bridged ERC-20 assets (primarily WETH, USDC, and USDT).
2. Technical Root Cause & Vulnerability Mechanism
The underlying mechanism exploits the core architecture of Uniswap Permit2. Permit2 is designed to optimize token management by having users approve the canonical Permit2 contract once, after which all integrated protocols can transfer tokens using signed off-chain messages (PermitSingle or PermitBatch).
struct PermitDetails {
address token;
uint160 amount;
uint48 expiration;
uint48 nonce;
}
struct PermitBatch {
PermitDetails[] details;
address spender;
uint256 sigDeadline;
}
The Vulnerability Vectors:
- Unconstrained Spender Assignment: The phishing dApp populates the
spenderfield with an unverified smart contract deployed by the adversary. - MAX_UINT160 Token Allowances: The
amountparameter is set totype(uint160).max(1461501637330902918203684832716283019655932542975), granting full access to the victim's entire balance. - Infinite Expiration Timestamps: The
expirationandsigDeadlinefields are set to timestamps years in the future (e.g. Unix epoch1924905600), ensuring the permit remains executable indefinitely.
Once the user signs the EIP-712 digest, the phishing backend captures the raw signature (r, s, v) and immediately relays it to their contract, invoking permit2.permit(...) and permit2.transferFrom(...) in a single atomic transaction.
3. On-Chain Flow, Evidence & Remediation Checklist
Transaction Execution Flow:
- User Sign: Victim signs EIP-712 message containing
PermitBatchdetails. - Relay: Attacker sweeps the signature and initiates the transaction from an externally owned account (EOA).
- Permit Execution: The attacker contract submits
permit(address owner, PermitBatch batch, bytes signature). - Token Drain: Permit2 validates ECDSA recovery, verifies nonce, updates internal allowance mapping, and transfers tokens to the attacker's sweep wallet.
Emergency Mitigation & Recovery Steps:
- Step 1 - Audit Active Signatures: Use our Permit2 Signature Inspector to paste and decode suspicious EIP-712 payloads before signing.
- Step 2 - On-Chain Invalidation: Execute
invalidateUnorderedNonces(uint256 wordPos, uint256 mask)directly on the Permit2 smart contract to cancel all pending signed permits. - Step 3 - Full Allowance Lockdown: In severe incidents, invoke
lockdown(TokenSpenderPair[] approvals)on Permit2 to reset all active allowances to zero immediately.