自持钱包 · DApp 入口
Decode before you sign./No blind approvals./Server never sees the request.
手机上可以左右滑动看全图。
异常处理
异常处理
| 问题 | 方案 |
|---|---|
| 钓鱼网站 | 结论:黑名单挡一道,翻成人话兜底 现象:用户打开的是钓鱼网站 第一道:域名过钓鱼黑名单,命中直接拦 漏洞:挡不住刚冒出来的新域名 第二道(真兜底):把签名请求翻成人话,让用户自己看清在授权什么 |
| 无限额授权 | 结论:无限额标红,默认只授本次额度 现象:签名请求是一笔无限额授权 认:解码出被授权的合约地址和额度,额度等于 uint256 最大值就是无限额 做:确认页标红;默认改成本次需要的额度,用户可再改 |
| 伪装成登录 | 结论:EIP-712 结构化消息也要解析,认出 Permit 就标红 现象:看着只是一段「登录消息」,其实是授权 原因:Permit 类签名(EIP-2612、Permit2)不用上链,对方拿着签名就能划走代币 做:结构化消息(EIP-712)也解析,认出 Permit 翻成人话、标红 |
| 已签无限授权 | 结论:撤不回,只能覆盖成 0,越早越好 现象:已经给钓鱼合约签了无限额授权 做:授权管理页把额度改成 0 注意:这是一笔要付手续费的链上交易 |
| 资产被转走 | 结论:追不回,先断后续授权再转移资产 现象:资产已经被转走 做:① 立刻取消剩下的授权 ② 剩余资产转到新地址 边界:链上转账追不回;服务端没有私钥,也冻结不了别人的地址 |
| 会话被拿 | 结论:对方拿到会话也替不了用户签名 现象:WalletConnect 会话被别人拿到 原因:会话端到端加密;每一笔签名请求都要用户在手机上点确认 |
| 服务端被攻破 | 结论:最坏漏拦一个域名,第二道照样生效 现象:服务端被攻破,下发了假名单 影响:某个钓鱼域名没被拦住 兜底:「翻成人话」照样生效;签名请求不经过服务端,服务端改不了用户签的内容 |