链上名字记录的攻击面:把名字当协议配置来源怎么核验 图 1
链上名字记录的攻击面:把名字当协议配置来源怎么核验 · 图 1

把域名解析到地址这件事早已平常,真正的变化发生在后面:不少协议的文档、钱包和前端开始把链上名字服务的记录当成一个配置来源,从官方合约地址列表、前端地址,到渠道标识都写进记录字段。于是名字解析从转账前的便利功能升级成了信任链条的一环。既然进入信任链,它就有了攻击面,而这一层的攻击面和普通钓鱼完全不同,值得单独拆一遍。

名字服务暴露给使用者的数据通常分三层。第一层是正向解析:一个名字解析出地址和若干记录,由注册表到解析器的两段合约决定,解析器本身是可替换的实现,这意味着名字指向什么,最终取决于当前生效的解析器合约逻辑。第二层是反向解析:一个地址反查它声明的名字,由地址所有者一侧的子记录控制,它回答的是这个地址自称是谁。第三层是文本记录:键值对的自由字段,协议常用它存放文档链接、合约清单或者验证信息,谁能改这些字段,谁就在替协议发配置。三层的控制方不同,正向归名字所有者,反向归地址所有者,文本归名字所有者或其委派,任何一把私钥失守都是一条独立的可篡改路径。

攻击者利用这些路径的方式和传统钓鱼的区别在于留痕。传统钓鱼靠假网页,关掉就消失;名字记录劫持是在公开可查的存储里改一行数据,改完所有实时解析的人在同一时刻都吃到脏数据。可行的剧本大致三类:一是劫持名字所有者的控制密钥,把文本记录里的官方地址清单换掉,下游前端如果缓存了这个字段,影响是批量的。二是利用过期窗口,高价名字到期后进入宽限期与公开拍卖,原持有者的旧解析行为与新持有者的接管之间有一段时间差,依赖该名字做历史配置的脚本可能拉错。三是利用反向解析的声明性质,任何地址都能自称某个名字,核验者如果把反向声明当证据,就被一行可自填的字段误导。

对应的核验动线也要独立于被核验的那一层。第一步,不用前端给你的解析结果核验前端自己,用第二来源解析:自己的钱包原生解析,加上直接对注册表与解析器合约发起静态调用,两条路径结果不一致就停止。第二步,查这个名字的链上履历:所有者控制地址最近是否变更、解析器合约是否近期被换、注册到期时间落在哪里,这些信息全部在浏览器上可查,变更时间点前后的行为差异值得警惕。第三步,对任何名字记录里给出的合约地址,永远执行既有的地址核验动线——和审计报告、官方多签、历史部署记录交叉,名字记录只能是线索的起点,不能是终点。第四步,把反向解析只当便利显示用,它天然可以被地址所有者自填,凡是需要这个地址确实是某某协议的位置,都要回到正向链路和官方渠道闭环。

还需要一个组织层面的习惯:给常用的几个协议名字建立自己的解析基线,把官方地址抄在自己管理的清单里,定期用链上直查比对一次,发现漂移立即以本地清单为准并去官方公告频道核实。这等于把自己的信任从别人的存储上迁回自己的记录上,名字服务退化成一个通知渠道而不是权威来源,正好是它最合适的定位。

最后给清单:第二来源解析;查名字所有者与解析器变更履历;查到期时间与注册状态;记录字段里的地址全部走独立地址核验;反向解析不作为信任证据。技术细节以名字服务协议与相关文档当前版本为准,记录内容随时可能被其控制方修改,本内容仅为机制与核验方法说明,不构成投资建议,也不构成对任何名字或地址真伪的保证。

链上名字记录的攻击面:把名字当协议配置来源怎么核验 图 2
链上名字记录的攻击面:把名字当协议配置来源怎么核验 · 图 2