现在回过头来思考整个ZhongHua代币的RugPull案例,发现其手法本身很简单,不过是取消特权地址的代币余额校验而已。但是为什么在分析这个案例的时候却并没有那么顺利?主要原因可能有2点:

1.安全防护和攻击的视野不同。对于安全从业者来说,代码中的余额校验是最基础需要完成的安全保障,因此大多数安全从业者都会潜意识地认为“transfer”函数理所应当地会完成对用户余额的校验,放松对这类漏洞的警惕(或者说认为这类漏洞太基础,攻击者不会采用)。

然而站在攻击者视角,最有效的攻击方式往往是最朴素的:不校验余额作为一种既有效又容易被忽略的RugPull手法,没有不使用的理由。事实也确实如此,至少从案例表征来看,ZhongHua代币案例的RugPull手法留下的痕迹是最少的,追踪起来难度远大于其他类型的RugPull,最后仍需要通过人工审计代码定位代码后门。

2.项目方在有意识地掩盖特权地址不需要校验余额的后门代码。项目方甚至单独为非特权地址实现了一套完整的税收转账计算逻辑、代币地址提现再复投的逻辑,使得代币实现了复杂的转账逻辑看上去也合情合理。而其他普通地址进行转账时也与正常行为无异,在不仔细看代码的前提下完全无法发现任何端倪。

对比这个团队针对MUMI代币和ZhongHua代币的RugPull手法案例,二者都是通过相对隐蔽的方式使得特权地址拥有支配大量代币的权利。

在MUMI代币RugPull案例中,项目方直接修改balance,且不修改totalSupply,也不触发Transfer事件,使得用户无法感知特权地址已经拥有巨额代币。

而ZhongHua代币案例则是更彻底,通过直接不校验特权地址的余额,使得除看源码以外的任何手段都无法发现特权地址已经拥有了无上限的代币(用balanceOf查询特权地址的余额会显示是0,但却可以转出无限的代币)。

ZhongHua代币的RugPull案例反映出代币标准的潜在安全问题,ERC20代币标准在安全性方面只能用来约束君子而无法防范小人。攻击者往往会在实现符合标准的业务逻辑的前提下,藏下令人难以发觉的后门。如果通过将代币行为标准化,虽然减少了功能的灵活性,但避免了隐藏后门的可能性,提供了更多的安全保障。