In May 2024, a victim connected their wallet to a fake phishing site pretending to be a DeFi protocol. They saw a routine “Sign to verify” prompt. No gas fee. No transaction. They clicked confirm.
Thirty seconds later, their entire holding of 1,155 WBTC — worth approximately $68 million — was transferred to the attacker’s address. It remains one of the largest individual phishing losses in crypto history.
The weapon wasn’t a smart contract exploit. It wasn’t a private key theft. It was a single Permit2 signature.
BLUF: Permit2 is a universal approval router created by Uniswap Labs. If you’ve ever used Uniswap, SushiSwap, or any protocol that integrates Permit2, you may have already granted it permission to move your tokens. A single Permit2 signature can authorize transfers of any token you’ve approved through Permit2 — not just one. The $68M WBTC attack worked because the victim didn’t realize their signature was a spending authorization, not a “verification.” Defense: (1) Check revoke.cash for Permit2 approvals, (2) use a wallet that simulates signatures like Rabby, (3) never sign messages on unfamiliar sites — even if they say “no gas needed.”
What Is Permit2?
Permit2 is an on-chain approval router developed by Uniswap Labs. It solves a real UX problem: traditional ERC-20 approvals require a separate on-chain transaction (paying gas) before you can swap tokens. Permit2 eliminates that step.
Here’s how it works:
Traditional ERC-20 Flow (Pre-Permit2)
- You approve the DEX to spend your USDC → on-chain transaction, pay gas
- You swap USDC for ETH → on-chain transaction, pay gas
- Total: 2 transactions, 2 gas payments
Permit2 Flow
- You approve Permit2 to spend ALL your tokens → one-time on-chain transaction
- For each future swap, you sign an off-chain Permit2 message → free, no gas
- The protocol uses your Permit2 signature + their Permit2 allowance to execute the swap → protocol pays gas
Permit2 acts as a middleman: you approve Permit2 once (on-chain), then authorize specific protocols to use Permit2’s allowance via off-chain signatures (free).
Why Permit2 Is More Dangerous Than Standard Approvals
The efficiency gain is also the security risk:
| Feature | Standard ERC-20 Approval | Permit2 Approval |
|---|---|---|
| Scope | One token, one spender | All approved tokens, one router |
| Authorization method | On-chain transaction (paid gas) | Off-chain signature (free) |
| User awareness | Wallet shows clear approval prompt | Wallet may show unreadable EIP-712 data |
| Revocation | revoke.cash, clear per-token | Must revoke at Permit2 contract level |
| Expiry | Often indefinite (unless time-limited) | Can be time-limited, but often set far out |
The critical difference: one Permit2 signature can authorize transfers of every token you’ve ever approved through Permit2. A standard approval limits exposure to one token. Permit2 creates a universal surface area.
The $68 Million WBTC Attack: Step by Step
Step 1: Bait
The victim received a link — likely via a hacked Twitter account or Discord message — to a phishing site impersonating a DeFi protocol. The site was a pixel-perfect clone.
Step 2: Connection
The victim connected their wallet. The site immediately requested a signature. The prompt said something like “Verify wallet ownership” or “Authenticate session.”
Step 3: The Signature
What the victim saw: a verification prompt, no gas fee, seems harmless.
What they actually signed: a Permit2 permitTransferFrom or permit message that authorized the attacker’s contract to transfer their WBTC through the Permit2 router.
The EIP-712 typed data included:
- Permit2 contract address:
0x000000000022D473030F116dDEE9F6B43aC78BA3(the real Permit2) - Token: WBTC
- Spender: attacker’s contract
- Amount: full balance
- Deadline: far future
Step 4: The Drain
The attacker called permitTransferFrom() on the Permit2 contract. Because:
- The victim had previously approved Permit2 to spend their WBTC (from using Uniswap or another integrated protocol)
- The victim signed a valid Permit2 permit authorizing the attacker as spender
Permit2 verified the signature, confirmed the allowance, and transferred the WBTC to the attacker. All within seconds.
The victim never sent a transaction. They only signed a message. But that signature was mathematically equivalent to approving an unlimited spend.
Other Major Permit2 Attacks
| Date | Loss | Token | Attack Vector |
|---|---|---|---|
| May 2024 | $68M | WBTC | Fake DeFi site, Permit2 signature |
| Feb 2024 | $6.5M | Various | Fake airdrop claim, Permit2 drain |
| Sep 2023 | $4.4M | Various | Fake newsletter site, Permit2 + setApprovalForAll |
| Ongoing | — | — | ScamSniffer reports 100s of Permit2 victims monthly |
According to ScamSniffer’s annual phishing report, Permit2-based draining accounts for a significant percentage of all wallet-draining losses.
How Attackers Exploit Permit2
The Technical Mechanism
Permit2 has two main permit functions attackers exploit:
permit() — Grants a spender ongoing allowance for a specific token:
function permit(address owner, PermitSingle calldata permitSingle, bytes calldata signature) external
permitTransferFrom() — Authorizes a one-time transfer of a specific token amount:
function permitTransferFrom(PermitTransferFrom calldata permit, SignatureData calldata signature, address spender, uint256 requestedAmount) external
Both require only the owner’s signature — no on-chain transaction from the owner. The attacker (or anyone) can call these functions with a valid signature.
Why Wallets Don’t Always Warn You
EIP-712 typed data is designed to be human-readable, but only if the wallet implements decoding for Permit2’s specific message structure. Many wallets:
- Show the raw EIP-712 fields without context (“What does ‘spender: 0x7a3f…’ mean?”)
- Don’t simulate the outcome of the Permit2 call
- Don’t check whether the spender address is a known malicious contract
This is why blind signing — confirming without understanding — is so dangerous with Permit2.
How to Check Your Permit2 Exposure
Method 1: revoke.cash
Go to revoke.cash, connect your wallet, and filter by the Permit2 contract (0x000000000022D473030F116dDEE9F6B43aC78BA3):
- Any active approvals to Permit2 mean your tokens are at risk if you sign a malicious Permit2 message
- You can revoke individual token approvals to Permit2
Method 2: Etherscan
- Go to your address on Etherscan
- Check your token approvals for the Permit2 contract address
- Look for any approvals with infinite allowance
Method 3: Use Our Risk API
Use our address risk scoring API to check if any contract requesting your signature has been flagged as malicious.
Defense: The Permit2 Security Checklist
-
Audit your Permit2 approvals: Visit revoke.cash and review all tokens approved to Permit2. Revoke any you don’t actively need.
-
Never sign on unfamiliar sites: Permit2 signatures are free — that’s what makes them dangerous. “No gas” doesn’t mean “no risk.”
-
Use a simulation wallet: Rabby Wallet, Pocket Universe, and Blockaid-powered wallets simulate signatures and show “You will lose X tokens” before you confirm.
-
Separate wallets: Keep your main holdings in a wallet that has never approved Permit2. Use a separate wallet for DeFi interactions.
-
Revoke after use: After using Uniswap or other Permit2-integrated protocols, revoke the Permit2 approval if you don’t plan to use it again soon.
-
Time-limit your approvals: Permit2 allows time-limited permits. When available, choose short expirations (1 hour, 1 day) instead of indefinite.
-
Be suspicious of “verification” prompts: Legitimate SIWE (Sign In With Ethereum) uses
personal_sign, notsignTypedData. If a site asks you to sign typed data (EIP-712) for “verification,” that’s a red flag.
Frequently Asked Questions
Q: I’ve used Uniswap. Am I already at risk?
A: If you’ve used Uniswap V3+ or any Permit2-integrated protocol, you likely have active Permit2 approvals. This doesn’t mean you’ve been hacked — it means your tokens are vulnerable if you sign a malicious Permit2 message in the future. Check revoke.cash to see your current exposure.
Q: Should I stop using Uniswap?
A: No. Permit2 is a legitimate and useful protocol. The risk isn’t in using Permit2 — it’s in signing messages on phishing sites. The solution is vigilance, not avoidance.
Q: How is Permit2 different from infinite approval?
A: Infinite approval is an ERC-20 concept — you approve a spender for the maximum uint256 amount. Permit2 is a routing layer that can hold infinite approvals for multiple tokens simultaneously. An attacker exploiting Permit2 can access all tokens you’ve approved through it, not just one.
Q: Can I revoke Permit2 approval without paying gas?
A: No. Revoking an approval requires an on-chain transaction, which costs gas. But the gas cost (typically $2-10) is far less than the potential loss.
Q: Does Ledger/Trezor protect me from Permit2 attacks?
A: Only if you read the data carefully. Hardware wallets force physical confirmation, but if you’re using blind signing (required for many DeFi interactions), the device shows raw hex data that’s nearly impossible to interpret. Always verify on a trusted screen what you’re signing before confirming on your hardware wallet.