近日,慢雾安全团队披露了以太坊代币“假充值”漏洞的细节。该漏洞影响范围广泛,涉及中心化交易所、中心化钱包以及代币合约等多个对象。据不完全统计,至少有3619份代币合约存在此漏洞风险,其中包括多个知名代币。慢雾团队强调,此次事件不仅是潜在漏洞,更是真实发生的攻击,相关项目方需立即采取自查和修复措施。
漏洞背景与影响范围
以太坊代币“假充值”漏洞的影响面极为广泛。受影响对象主要包括:
- 中心化交易所
- 中心化钱包
- 各类代币合约
根据慢雾区的统计,目前至少有3619份代币合约存在这一漏洞风险。慢雾安全团队分析认为,此次事件的影响可能大于之前发生的USDT“假充值”漏洞攻击事件。
漏洞披露时间线
慢雾团队采取了负责任的披露流程,整个事件的时间线如下:
- 2018年6月28日:慢雾区披露USDT“假充值”漏洞攻击事件
- 2018年7月1日:慢雾安全团队开始分析知名公链是否存在类似问题
- 2018年7月7日:团队捕获并确认以太坊代币“假充值”漏洞攻击事件
- 2018年7月8日:分析认为影响可能大于USDT事件,并通知相关客户与合作伙伴
- 2018年7月9日:对外发出第一次预警
- 2018年7月10日:将细节同步给至少10家区块链生态安全同行
- 2018年7月11日:正式公开细节报告
漏洞技术细节
交易状态判断机制
在以太坊交易中,交易回执的status字段值为0×1(true)或0×0(false),这取决于交易执行过程中是否抛出了异常。当用户调用代币合约的transfer函数进行转账时,如果函数正常运行未抛出异常,交易status即为0×1(true)。
存在问题的编码方式
某些代币合约的transfer函数对转账发起人(msg.sender)的余额检查使用if判断方式。当balances[msg.sender] < _value时,进入else逻辑部分并return false,最终没有抛出异常。
这种if/else的温和判断方式在transfer这类敏感函数场景中是一种不严谨的编码方式。相比之下,大多数代币合约会采用require/assert方式,当不满足条件时直接抛出异常,中断合约后续指令的执行。或者使用EIP 20推荐的if/else + revert/throw函数组合机制来显式抛出异常。
攻击原理
攻击者利用存在该缺陷的代币合约,向中心化交易所、钱包等服务平台发起充值操作。如果交易所仅判断TxReceipt Status为success(即status为0×1(true))就认为充币成功,就可能存在“假充值”漏洞。
修复方案与建议
对于平台方
除了判断交易事务success之外,还应二次判断充值钱包地址的balance是否准确增加。这个二次判断可以通过Event事件日志来进行,但需要特别注意合约作恶情况,因为Event是可以任意编写的,不是强制默认不可篡改的选项。
平台方在对接新上线的代币合约之前,应该做好严格的安全审计,这种安全审计必须强制代币合约方执行最佳安全实践。
对于代币合约方
在编码上应该严格执行最佳安全实践,并请第三方职业安全审计机构完成严谨完备的安全审计。对于存在漏洞的代币,一般来说最好的方式是重发,并做好新旧代币映射。
如果不采取这些措施,漏洞就像个“定时炸弹”,不能期望所有中心化交易所、中心化钱包等平台方都能做好安全对接。一旦没做好“假充值”漏洞的判断,损失将由平台方承担,进而对整个市场造成负面影响。
常见问题
什么是以太坊代币“假充值”漏洞?
这是指由于代币合约编码不严谨,攻击者可以利用缺陷向交易平台发起充值操作,平台仅根据交易状态判断为成功就会误以为充值到账,实际上资金并未真实增加的安全漏洞。
这个漏洞影响有多大?
据不完全统计,至少有3619份代币合约存在此漏洞风险,包括多个知名代币。影响范围涉及中心化交易所、钱包服务商和代币项目方,可能造成的损失规模较大。
如何检测我的代币是否存在此漏洞?
可以通过检查代币合约的transfer函数实现方式来判断。如果使用if/else方式处理余额检查并return false,而不是抛出异常,则可能存在漏洞。建议寻求专业安全审计团队的帮助。
平台方应该如何防范此类漏洞?
除了检查交易状态外,还应二次验证地址余额的实际变化情况。同时,在上线新代币前必须进行严格的安全审计,确保合约代码符合最佳安全实践。
代币项目方发现漏洞后应该怎么做?
建议立即采取重发代币并做好新旧代币映射的措施。同时聘请第三方安全审计机构对合约代码进行全面检查,确保所有潜在风险都被消除。
普通用户需要担心这个漏洞吗?
普通用户直接风险较小,主要风险集中在交易平台和钱包服务商。但建议用户选择那些重视安全、定期进行审计的交易平台进行资产存储和交易。
总结
以太坊代币“假充值”漏洞是一个严重的安全威胁,需要代币项目方和平台服务商高度重视。通过采用最佳编码实践、进行严格的安全审计和实施多重验证机制,可以有效地防范此类漏洞带来的风险。区块链安全是一个持续的过程,需要生态中各方的共同努力和维护。