以太坊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函数中,存在三个关键判断条件:

  1. sufficientFunds = fromBalance <= _value
    错误:本应检查转账人余额是否大于等于转账金额,但实际检查的是是否小于等于

  2. sufficientAllowance = allowance <= _value
    错误:本应检查授权金额是否大于等于转账金额,但实际检查的是是否小于等于

  3. 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 (接收方余额加上转账金额不溢出)

四、漏洞利用实战

攻击步骤

  1. 合约部署:owner部署合约并通过fallback函数存入2 ether作为启动资金

  2. 用户操作:新用户存入少量资金(如10 wei)获取初始代币

  3. 构造攻击交易

    • 攻击者账户只有少量代币(如1000)
    • 构造转账参数:
      _from: "0x583031d1113ad414f02576bd6afabfb302140225"
      _to: "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
      _value: 0xfffffffffffffffffffffffffffffffffffffffffffffde1e61f36454dbfffff
      
    • 这个超大_value值满足:
      • 远大于攻击者余额(满足fromBalance <= _value)
      • 远大于授权金额(满足allowance <= _value)
      • 加上接收方余额不溢出(满足!overflowed)
  4. 执行攻击

    • 每次调用都会凭空增加大量代币
    • 攻击者可以重复此操作窃取代币

五、漏洞修复建议

  1. 修正条件判断

    bool sufficientFunds = fromBalance >= _value;
    bool sufficientAllowance = allowance >= _value;
    
  2. 添加安全检查

    • 检查_value不为负数
    • 添加更严格的溢出保护
  3. 使用SafeMath库

    using SafeMath for uint256;
    // 然后使用SafeMath的方法进行数学运算
    
  4. 全面审计:对所有条件判断进行仔细检查

六、参考链接

  1. 漏洞合约地址:

    • https://etherscan.io/address/0xf084d5bc3e35e3d903260267ebd545c49c6013d0#code
    • https://etherscan.io/address/0x27f706edde3aD952EF647Dd67E24e38CD0803DD6#code
  2. 漏洞分析文章:

    • 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
  3. 攻击交易示例:

    • https://etherscan.io/tx/0x122ee230d86cea0d1c1df42599e722a849067598777a0f43ccf83b12d0dfd485
    • https://etherscan.io/tx/0x50a100eaf74469520177db55ea28f6046492034fdf5f5d264768d87c60ec3f3b

七、总结

这两个漏洞都是由于简单的条件判断错误导致的,但危害性极大。智能合约开发中需要特别注意:

  1. 所有条件判断必须仔细验证逻辑是否正确
  2. 数学运算必须考虑溢出情况
  3. 使用成熟的库(如SafeMath)可以减少错误
  4. 合约上线前必须经过严格审计

此类漏洞再次证明了智能合约"代码即法律"的特性,任何小的编码错误都可能导致严重后果。

以太坊CVE-2018–10468与CVE-2018–11411合约漏洞分析教学文档 一、漏洞概述 本文分析的两个以太坊智能合约漏洞CVE-2018–10468和CVE-2018–11411,都是由于合约编写者在转账函数中错误地撰写了判断条件,导致攻击者可以通过构造特定参数绕过正常检查,从而实施恶意操作。这两个漏洞原理相似,危害性极大。 二、漏洞合约分析 1. UselessEthereumToken合约(CVE-2018–10468) 合约基本功能 标准ERC20代币功能:转账、余额查询、授权等 购买控制功能: enablePurchasing() 和 disablePurchasing() 外币提取功能: withdrawForeignTokens() 代币购买功能:通过fallback函数实现 关键漏洞函数 2. DimonCoin合约(CVE-2018–11411) 与UselessEthereumToken类似,但多了一个 distributeFUD 函数,用于批量减少地址余额。 三、漏洞原理详解 1. 错误条件分析 在 transferFrom 函数中,存在三个关键判断条件: sufficientFunds = fromBalance <= _value 错误 :本应检查转账人余额是否 大于等于 转账金额,但实际检查的是是否 小于等于 sufficientAllowance = allowance <= _value 错误 :本应检查授权金额是否 大于等于 转账金额,但实际检查的是是否 小于等于 overflowed = balances[_to] + _value > balances[_to] 这是正确的溢出检查,但结合前两个错误条件,会导致严重问题 2. 正确条件应为 3. 漏洞利用条件 攻击者需要满足: fromBalance <= _value (转账人余额小于等于转账金额) allowance <= _value (授权金额小于等于转账金额) !overflowed (接收方余额加上转账金额不溢出) 四、漏洞利用实战 攻击步骤 合约部署 :owner部署合约并通过fallback函数存入2 ether作为启动资金 用户操作 :新用户存入少量资金(如10 wei)获取初始代币 构造攻击交易 : 攻击者账户只有少量代币(如1000) 构造转账参数: 这个超大_ value值满足: 远大于攻击者余额(满足fromBalance <= _ value) 远大于授权金额(满足allowance <= _ value) 加上接收方余额不溢出(满足 !overflowed) 执行攻击 : 每次调用都会凭空增加大量代币 攻击者可以重复此操作窃取代币 五、漏洞修复建议 修正条件判断 : 添加安全检查 : 检查_ value不为负数 添加更严格的溢出保护 使用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)可以减少错误 合约上线前必须经过严格审计 此类漏洞再次证明了智能合约"代码即法律"的特性,任何小的编码错误都可能导致严重后果。