finian
22 小时 36 分钟前
准确来说,你这个并不是「零值转账」,区块浏览器现在都默认不会显示「零值转账」交易记录了。我梳理下目前的地址投毒手法:
假设黑客监测到受害者的转账记录:
A --> B (X Y)
A 地址向 B 地址转账 X 枚 Y 代币。
黑客可以选择实施以下地址投毒攻击:
> B' 地址和 B 地址的首尾多个字符相同,不仔细辨认容易认错。
> 投毒攻击的最终目的,是期待受害者下次转账时转到黑客构造的 B' 地址。
1. A --> B' (0 Y)
构造 A 地址向 B' 地址转账 0 枚 Y 代币的交易。由于绝大多数 ERC20 代币合约的 `transferFrom` 方法未严格区分「未授权」和「授权数量 0 」,导致使用 `transferFrom` 转移 0 数量代币可以绕过授权检查( Maybe it's a feature, not a bug ),即任何人都可以构造 A 地址转移 0 枚 Y 代币的交易。但目前几乎所有 Ethereum 浏览器都默认不会显示 0 数量代币的交易记录,所以这个方法已经不再使用。
2. B' --> A (小额 Y)
构造 B' 地址向 A 地址转移小额 Y 代币的交易。由于 0 数量代币交易记录已经不会默认显示了,所以黑客转而构造小额代币转移交易。但由于授权机制的限制,黑客不能将 A 地址构造成发送者,只能向 A 地址转账。由于 B' 地址是发送者不是目的地址,受害者上当的概率会小一些。
3. A --> B' (X Y')
构造 A 地址向 B' 地址转移 X 枚 Y' 代币的交易。Y' 代币是黑客构造的假代币。黑客可以通过合约随意构造 A 地址转移 Y' 代币的交易记录。而且为了让受害者更容易上当,转移数量会和受害者真实的转移数量保持一致。这是目前最常见的攻击手法,也是 OP 遇到的攻击类型。
总之,转账前一定要再三确认目的地址,不能只看前后几位。大额转账先小额转下确认没问题再转剩下的。