文章

零订单钓鱼攻击原理与防御

案例

这是一个典型的 Seaport 零订单钓鱼攻击。攻击者创建了一个看似提供高价(100 ETH)购买您 NFT 的订单,但实际上订单中的对价被设置为 0 ETH。

在这个钓鱼订单中,关键问题是:

"consideration": [
                    {
                      "itemType": 0,
                      "token": "0x0000000000000000000000000000000000000000",
                      "identifierOrCriteria": "0",
                      "startAmount": 0",
                      "endAmount": 0",
                      "recipient": "0x6278A1E803A76796a3A1F7F6344fE874ebfe94B2"
                    }
                  ]

注意 startAmount 和 endAmount 都被设置为"0",这意味着如果您接受这个订单,您将免费赠送您的 NFT,而不会收到任何 ETH 作为回报。

如何保护自己:

  • 始终仔细检查 Seaport 订单中的对价部分

  • 验证 startAmount 和 endAmount 是否与显示的价格相符

  • 使用具有内置保护功能的可信 NFT 交易市场

  • 不要点击来自未知来源的链接

  • 如果价格看起来好得不真实,那可能确实如此

合法订单与钓鱼订单的比较:

参数

合法订单

钓鱼订单(当前案例)

offer

买方提供的 ETH

卖方的 NFT

consideration

卖方的 NFT

0 ETH

startAmount/endAmount

与显示价格相符(如 100 ETH)

设定为 0

防御:

一、解析:还原订单真实意图(避免被“100 ETH”文案迷惑)

  • 解码 EIP-712/Seaport 结构:识别 fulfillBasicOrder/fulfillAdvancedOrder 等调用,提取 parameters.offer/parameters.consideration。

  • 做“净资产流”建模:以“当前账户”为基准,计算本次交易中用户将转出/将收取的所有资产。

  • 针对本页案例:offer 是你要转出的 BAYC #8865;consideration 金额全为 0,且收款人是对方地址,说明你没有任何入账。

  • 人类可读摘要:把“你将失去:BAYC #8865;你将收到:0 ETH”渲染为大号红色提示,覆盖任何站点自定义的“100 ETH”文案。

示例伪代码:

二、模拟:链下/本地沙盒执行,得到真实转移结果

  • 本地 EVM 模拟:在目标链节点上用 call/staticcall 复现交易(fork 模式或节点 debug_traceCall),得到 tokenTransfer/ethTransfer 列表。

  • 余额差值校验:对用户地址做“模拟前后余额快照”,包含 ETH、ERC20、ERC721/1155 的转移事件,输出 delta。

  • 拦截规则

  • 若 netIn(对用户) == 0 且存在 NFT/代币净流出 → 高危,默认阻断。

  • 若 incoming 的 recipient 里没有用户地址 → 高危。

  • 存在“向对方地址转移且价格为 0”的组合 → 高危。

三、告警:把风控结论用强提示呈现

  • 强提示内容(显著、不可忽略的小窗/全屏警告):

  • 你即将转出:BAYC #8865。

  • 你将收到:0 ETH。

  • 原因:订单对价(consideration)金额为 0,收款人为对方地址。

  • 风险等级:高危|疑似“零价格钓鱼”。提供“查看参数”链接展开原始 JSON(便于高级用户核验)。

  • 交互策略

  • 高危时默认禁用“签名/发送”按钮,要求二次确认并输入短语(例如“我了解这是零对价”)才可继续。

  • 在设置中提供“禁止零对价转出”开关,默认开启。

四、签名与调用层安全控制

  • 限制危险签名:默认禁用 eth_sign/personal_sign 等原始签名;仅允许 EIP-712 且明确展示域、类型、值。

  • 域隔离与链隔离:检验 EIP-712 域的 chainId、verifyingContract 是否与当前网络匹配,防跨链/跨合约复用签名。

  • 合约/方法白名单:对 Seaport 官方合约和常见 DEX/市场做指纹识别;遇到未知路由器或代理时提示“非受信合约”。

  • Permit/Approval 审核

  • 展示 ERC20 Permit/无限额授权的额度、到期、spender。

  • 对 NFT 的 setApprovalForAll 调用做强红警,提示“此操作允许合约转走你全部该集合 NFT”。

许可协议:  CC BY 4.0