地址投毒(Address Poisoning)是一种精巧的诈骗手法。攻击者不入侵你的钱包,不破解你的私钥,而是利用区块链交易的公开性,在你的交易历史里植入伪造记录,骗你把钱转入错误的地址。
这种攻击在 2023 年开始大规模爆发,据慢雾(SlowMist)的不完全统计,仅 2024 年上半年,地址投毒攻击造成的损失就超过数千万美元。
核心要点: 地址投毒利用了用户从交易历史中复制地址的习惯。攻击者向你的钱包发一笔金额为零的转账,使用的发件地址与你常用的真实地址极其相似(前 6 位和后 4 位相同)。当你下次复制地址发款时,可能错误地复制了假地址。防御核心:每次转账前仔细核对地址的每一个字符,尤其是中间部分。
攻击原理
攻击的第一步是监控。攻击者使用链上分析工具监控目标地址的交易行为,特别是那些有频繁大额交易的地址。
第二步是制造伪造交易。当你向某个地址转了一笔款,攻击者立刻用链下签名(离线签名,零 Gas 成本)向你的钱包发送一笔金额为零或极小的代币转账。这笔转账的发送方地址,是攻击者精心构造的。
构造方式如下:攻击者使用”虚荣地址生成器”(vanity address generator)批量生成地址,直到找到一个与你常交互的真实地址前缀和后缀都相同的地址。比如你的真实收款地址是 0x7a314b...e9f2,攻击者就会生成一个 0x7a314b...9e8f 的地址,前 6 位完全相同,后 4 位也极其相似。
第三步是等待。这笔伪造交易会出现在你的钱包交易历史里。很多用户在发送资金时,习惯从交易历史中复制之前用过的地址,因为觉得方便和安全。但如果你复制的是攻击者植入的假地址,资金就会转入攻击者的钱包。
为什么这种攻击有效
地址投毒之所以成功率不低,有三个原因:
第一,钱包界面的地址显示方式。大多数钱包在显示交易历史时,会缩略显示地址(如 0x7a31...e9f2),只显示前几位和后几位。攻击者的假地址恰好在这些显示的位上与你真实地址一致,你的眼睛看不出区别。
第二,用户习惯。很多人不看完整地址,只核对前几位和后几位。如果前 6 位和后 4 位一致,他们就认为地址正确。攻击者正是利用了这个习惯。
第三,零 Gas 费攻击面。利用 EIP-712 离线签名或某些 ERC-20 代币的零值转账,攻击者可以几乎零成本地向大量地址发送伪造交易。这意味着攻击者可以广撒网,攻击成功率不需要很高就能获利。
变种:零转账投毒
最常见的地址投毒变种是零转账投毒。攻击者从合约地址(而非 EOA 地址)发起金额为 0 的代币转账。由于合约发起的交易在区块浏览器上的显示方式与普通转账略有不同,有些用户更容易混淆。
另一个变种利用的是 MetaMask 等钱包的”最近交互”列表。钱包会记录你最近交互过的合约地址,攻击者把假地址混入这个列表。当你在钱包里选地址时,可能选到假地址。
防范方法
防范地址投毒的核心是建立一个可靠的习惯:
每次转账都核对完整地址。 不要只看前几位和后几位。打开区块链浏览器,把收款方给你的地址粘贴进去搜索,确认它是一个真实存在的地址,有合理的交易历史。然后把你要发送到的地址也粘贴进去,确认两个地址完全一致。
不要从交易历史复制地址。 这是最安全的做法。从交易历史复制地址是地址投毒攻击的唯一利用点。如果你不这么做,攻击就不成立。
使用地址簿功能。 很多钱包支持保存常用收款地址。手动输入一次完整地址(或通过二维码扫描),保存到地址簿里。以后转账时从地址簿选择,而不是从交易历史复制。
小额测试。 在大额转账前,先发一小笔测试交易,确认对方收到了再发全额。多花一点 Gas 费,但能避免灾难性损失。
注意异常交易。 如果你发现钱包交易历史里出现了你没操作过的零值转账或极小额转账,说明你可能已经被地址投毒攻击。此时要格外小心后续的所有转账操作。
地址投毒攻击的技术门槛很低,一个有基础编程能力的攻击者就能实现。这意味着它会长期存在。你的防御很简单,但需要坚持:核对完整地址,不从交易历史复制。