以太坊CVE-2018–10468与CVE-2018–11411合约漏洞分析
字数 2026 2025-08-22 12:22:36
以太坊CVE-2018–10468与CVE-2018–11411合约漏洞分析教学文档
一、漏洞概述
本文分析的两个以太坊智能合约漏洞CVE-2018–10468和CVE-2018–11411,都是由于合约编写者在转账函数中错误地撰写了判断条件,导致攻击者可以通过构造特定参数绕过正常检查,从而实施恶意操作。这两个漏洞原理相似,危害性极大。
二、漏洞合约分析
1. UselessEthereumToken合约(CVE-2018–10468)
合约基本功能
- 标准ERC20代币功能:转账、余额查询、授权等
- 购买控制功能:
enablePurchasing()和disablePurchasing() - 外币提取功能:
withdrawForeignTokens() - 代币购买功能:通过fallback函数实现
关键漏洞函数
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
// mitigates the ERC20 short address attack
if(msg.data.length < (3 * 32) + 4) { throw; }
if (_value == 0) { return false; }
uint256 fromBalance = balances[_from];
uint256 allowance = allowed[_from][msg.sender];
bool sufficientFunds = fromBalance <= _value; // 错误条件
bool sufficientAllowance = allowance <= _value; // 错误条件
bool overflowed = balances[_to] + _value > balances[_to];
if (sufficientFunds && sufficientAllowance && !overflowed) {
balances[_to] += _value;
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
} else {
return false;
}
}
2. DimonCoin合约(CVE-2018–11411)
与UselessEthereumToken类似,但多了一个distributeFUD函数,用于批量减少地址余额。
三、漏洞原理详解
1. 错误条件分析
在transferFrom函数中,存在三个关键判断条件:
-
sufficientFunds = fromBalance <= _value
错误:本应检查转账人余额是否大于等于转账金额,但实际检查的是是否小于等于 -
sufficientAllowance = allowance <= _value
错误:本应检查授权金额是否大于等于转账金额,但实际检查的是是否小于等于 -
overflowed = balances[_to] + _value > balances[_to]
这是正确的溢出检查,但结合前两个错误条件,会导致严重问题
2. 正确条件应为
bool sufficientFunds = fromBalance >= _value;
bool sufficientAllowance = allowance >= _value;
bool overflowed = balances[_to] + _value > balances[_to];
3. 漏洞利用条件
攻击者需要满足:
fromBalance <= _value(转账人余额小于等于转账金额)allowance <= _value(授权金额小于等于转账金额)!overflowed(接收方余额加上转账金额不溢出)
四、漏洞利用实战
攻击步骤
-
合约部署:owner部署合约并通过fallback函数存入2 ether作为启动资金
-
用户操作:新用户存入少量资金(如10 wei)获取初始代币
-
构造攻击交易:
- 攻击者账户只有少量代币(如1000)
- 构造转账参数:
_from: "0x583031d1113ad414f02576bd6afabfb302140225" _to: "0xca35b7d915458ef540ade6068dfe2f44e8fa733c" _value: 0xfffffffffffffffffffffffffffffffffffffffffffffde1e61f36454dbfffff - 这个超大_value值满足:
- 远大于攻击者余额(满足fromBalance <= _value)
- 远大于授权金额(满足allowance <= _value)
- 加上接收方余额不溢出(满足!overflowed)
-
执行攻击:
- 每次调用都会凭空增加大量代币
- 攻击者可以重复此操作窃取代币
五、漏洞修复建议
-
修正条件判断:
bool sufficientFunds = fromBalance >= _value; bool sufficientAllowance = allowance >= _value; -
添加安全检查:
- 检查_value不为负数
- 添加更严格的溢出保护
-
使用SafeMath库:
using SafeMath for uint256; // 然后使用SafeMath的方法进行数学运算 -
全面审计:对所有条件判断进行仔细检查
六、参考链接
-
漏洞合约地址:
- https://etherscan.io/address/0xf084d5bc3e35e3d903260267ebd545c49c6013d0#code
- https://etherscan.io/address/0x27f706edde3aD952EF647Dd67E24e38CD0803DD6#code
-
漏洞分析文章:
- https://medium.com/coinmonks/uselessethereumtoken-uet-erc20-token-allows-attackers-to-steal-all-victims-balances-543d42ac808e
- https://medium.com/coinmonks/dimoncoin-fud-erc20-token-allows-attackers-to-steal-all-victims-balances-cve-2018-11411-ba9a320604f9
-
攻击交易示例:
- https://etherscan.io/tx/0x122ee230d86cea0d1c1df42599e722a849067598777a0f43ccf83b12d0dfd485
- https://etherscan.io/tx/0x50a100eaf74469520177db55ea28f6046492034fdf5f5d264768d87c60ec3f3b
七、总结
这两个漏洞都是由于简单的条件判断错误导致的,但危害性极大。智能合约开发中需要特别注意:
- 所有条件判断必须仔细验证逻辑是否正确
- 数学运算必须考虑溢出情况
- 使用成熟的库(如SafeMath)可以减少错误
- 合约上线前必须经过严格审计
此类漏洞再次证明了智能合约"代码即法律"的特性,任何小的编码错误都可能导致严重后果。