零订单钓鱼攻击原理与防御
案例
这是一个典型的 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 交易市场
不要点击来自未知来源的链接
如果价格看起来好得不真实,那可能确实如此
合法订单与钓鱼订单的比较:
防御:
一、解析:还原订单真实意图(避免被“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”。