$1,000,000 in security audit grants are live now, Apply here →

← Resource Hub

Permit2 Phishing: How One Signature Drains a Wallet

By the Guardian team Updated 5 min read

Permit2 Phishing: How One Signature Drains a Wallet

Quick answer. A phishing site asks you to sign a Permit or Permit2 message naming the attacker as spender. The attacker submits the signature onchain and moves your tokens, with no approval transaction from you.

Watch: Permit2 Phishing: How One Signature Drains a Wallet 1:35
Video transcript

One signature, framed as a login or a claim, can let an attacker drain your tokens. No approval transaction required.

A normal approval is an onchain transaction, with gas and a wallet warning. A permit is only a signature, and anyone holding it can turn it into an allowance.

A fake airdrop or mint page asks you to connect. It requests a signature. You sign, and no gas is paid. Then the attacker submits it and moves your tokens.

ScamSniffer names Permit as the main signature type behind large phishing thefts in both 2024 and 2025. In 2025, Permit and Permit2 drove 38 percent of large-case losses.

In a Permit2 request, three fields decide the damage. The spender should be the app you meant to use. An unlimited amount or an expiration years away is a red flag.

Before signing, read the typed data, not the site's description. Simulate first. Sign exact amounts with short expirations. On treasury wallets, two people check every signature.

Signed something bad? Act fast. Revoke existing allowances, or batch them with lockdown. Invalidate the nonces of unused signatures, since revoke tools cannot see them until they are submitted.

Guardian's browser extension pentest checks that the signed payload matches the screen. Read the full article, or talk to Guardian at guardian.security.

A token approval is normally an onchain transaction, with a gas fee and a wallet warning. A permit is only a signature.

That makes it a favorite of drainer kits. ScamSniffer's annual reports name Permit as the main signature type behind large phishing thefts in both 2024 and 2025.

Here is how permits work, what a malicious request looks like field by field, and the controls that stop it.

Permits vs Approvals

EIP-2612 adds a permit function to ERC-20 tokens. The owner signs an EIP-712 message naming the owner, spender, value, nonce and deadline.

The standard says: "The caller of the permit function can be any address." So whoever holds the signature can turn it into an allowance.

Permit2 is Uniswap's version for any ERC-20 token. You approve the Permit2 contract once per token, then grant spenders access by signature.

It has two parts:

  • AllowanceTransfer: a stored allowance with an amount and an expiration.
  • SignatureTransfer: a one-time transfer, valid only in the transaction that spends the signature.
approve()EIP-2612 permitPermit2
Who sends the transactionThe token ownerAnyone with the signatureAnyone with the signature
Owner pays gasYesNoOnly for the one-time Permit2 approval
Tokens coveredAny ERC-20Only tokens that implement itAny ERC-20 approved to Permit2
Built-in expiryNoneSignature deadlineSignature deadline and allowance expiration
Visible in revoke toolsAfter the transactionOnly after it is submittedOnly after it is submitted

How the Scam Works

  1. A fake airdrop, mint or support page asks you to connect a wallet.
  2. It requests a signature, often framed as a login or a claim.
  3. You sign. No transaction is sent and no gas is paid.
  4. The attacker submits your signature, gains the allowance and transfers your tokens.

Revoke.cash puts it simply: "it may look like you're simply signing into a website, but you're actually granting an approval." It notes that the warnings wallets show for approval transactions are missing for permit signatures.

Permit2 needs one precondition: a standing approval from you to the Permit2 contract. Uniswap's docs recommend a maximum approval, so anyone who has used a Permit2 app may already have one.

A single Permit2 signature can also cover several tokens. Revoke.cash warns that this flexibility makes requests harder to understand, and phishing sites abuse it.

The losses

ScamSniffer's figures cover wallet drainer phishing on EVM chains.

20242025
Total lostAbout $494M$83.85M (down 83%)
Victims332,000 addresses106,106
Large cases30 cases exceeding $1M11 cases of $1M or more
Share of large-case lossesPermit: 56.7%Permit and Permit2: 38%

The Permit shares cover only those large cases, not all losses.

The largest 2025 theft was $6.5M in stETH and aEthWBTC, in September, through a Permit signature.

Decoding a Permit2 Request

The request below is illustrative, not a captured attack. The field names are Permit2's own; the values show what a drainer typically asks for.

FieldIllustrative valueWhat it means
domain.namePermit2You are authorizing the Permit2 contract
domain.verifyingContract0x000000000022D473030F116dDEE9F6B43aC78BA3Permit2's address on Uniswap chains except zkSync
details.tokenYour largest stablecoinThe token exposed
details.amount1461501637330902918203684832716283019655932542975type(uint160).max: unlimited
details.expirationA date years awayWhen the allowance stops working
details.nonce0Replay protection
spenderAn address you do not recognizeWho can move your tokens
sigDeadlineMinutes or hours from nowLast moment the signature can be used

Three fields decide the damage: spender, amount and expiration.

The spender should be a contract of the app you meant to use. An unknown spender with an unlimited amount is a drain.

A SignatureTransfer request is shorter: a token and amount, a spender, a nonce and a deadline. It moves tokens once, in the transaction that uses it.

A plain EIP-2612 permit usually names the token contract in the domain. Check the same things: spender, value and deadline.

Controls for Teams

Before signing

  • Read the typed data, not the site's description of it.
  • Check spender, token, amount and expiry against the app you meant to use.
  • Sign exact amounts with short expirations. Refuse unlimited, long-lived permits.
  • Simulate the request first, in the wallet or a simulator, and read the result.
  • Never sign a permit from a link, airdrop or login prompt you did not seek out.
  • On treasury wallets, treat a signature like a transaction: two people check it.

Signing data you cannot read is blind signing. Our explainer on what blind signing is covers the wider habit.

After a bad signature

Permit2 has its own functions for this. Revoke.cash shows Permit2 allowances and can revoke them for you.

SituationCallEffect
Permit2 allowance activeapprove(token, spender, 0, 0)Sets the allowance to zero
Several Permit2 allowanceslockdown(pairs)Batch-revokes token and spender pairs
Allowance signature not yet usedinvalidateNonces(token, spender, newNonce)Invalidates every nonce below newNonce
One-time transfer not yet usedinvalidateUnorderedNonces(wordPos, mask)Burns the chosen nonces
EIP-2612 permit already usedapprove(spender, 0) on the tokenClears the normal allowance
No longer using Permit2approve(Permit2, 0) on the tokenRemoves the base approval

Act fast. Revoke.cash notes that scammers try to use a signature as soon as possible, and that no tool can list a signature until it is submitted onchain.

If tokens are already gone, follow our first-hour checklist for a drained wallet.

For wallet teams

  • Decode Permit, Permit2 and batch requests into token, amount, spender and expiry.
  • Warn on unlimited amounts, unknown spenders and long expirations.
  • Give signatures the same warnings as approval transactions.

Our browser extension pentest guide for crypto wallets covers the rest of the signing screen.

How Guardian Helps

Guardian's browser extension pentest checks signing flows: what the user sees before approving, and whether the signed payload matches the screen.

An SDK audit covers what a library encodes and hands to a wallet.

For institutions, Guardian designs approval thresholds and key custody. Managed Security reviews every multisig transaction before it is signed.

Frequently Asked Questions

What is Permit2?

A Uniswap contract that lets apps get token access by signature. You approve Permit2 once per token, then sign messages that give a spender an expiring allowance or a one-time transfer.

Can I cancel a Permit2 signature before it is used?

Yes, if you act before it is submitted. Call invalidateNonces for an allowance signature, or invalidateUnorderedNonces for a one-time transfer. Drainers try to submit signatures at once, so also revoke any allowance that already exists.

Does revoking approvals stop a permit drain?

It removes allowances that already exist onchain. A signature that has not been submitted does not appear in revoke tools, per Revoke.cash, so invalidate its nonce or move the tokens.

Is signing a message safer than sending a transaction?

Not always. A Permit or Permit2 message can grant the same spending power as an approval transaction, without gas and sometimes without a wallet warning. Read every field before you sign.

Sources

Make every signature readable before it is signed

Guardian tests wallet signing flows, checking that what users see matches what they sign, and advises institutions on custody and signing models.