区块链安全—深入分析ATN漏洞
字数 2084 2025-08-22 12:22:30

ATN区块链漏洞深入分析与复现教学文档

一、ATN项目背景介绍

ATN是全球首个区块链+AI项目,是一个去中心化的、无需授权的、用户自定义人工智能即服务(AIaaS)和使用接口的开放区块链平台。其核心特点包括:

  1. 引入DBot的Oracle预言机技术
  2. 采用跨链互操作技术
  3. 基于石墨烯架构实现高并发TPS
  4. 重点解决AIaaS与EVM兼容智能合约间的互操作性问题

二、漏洞事件概述

2018年5月11日,ATN安全团队发现其智能合约存在严重漏洞并被攻击。黑客利用以下两个关键特征实施攻击:

  1. ERC223合约可传入自定义接收调用函数
  2. ds-auth权限校验机制

攻击导致合约内部权限控制失效,黑客成功获取合约控制权并增发大量代币。

三、合约技术分析

1. ERC223与ERC20的区别

ERC223由Dexaran于2017年提出,旨在改进ERC20标准,解决其无法处理发往合约自身Token的问题:

  • ERC20转账机制:

    • 直接调用transfer()
    • 先approve()再transferFrom()
  • ERC223改进:

    • 当转账对象为智能合约时,ERC20必须使用approve+transferFrom组合
    • ERC223解决了转往合约地址的Token无法再次转出的问题

2. 关键合约组件分析

DSAuth权限控制合约

contract DSAuth is DSAuthEvents {
    DSAuthority public authority;
    address public owner;
    
    function setOwner(address owner_) public auth {
        owner = owner_;
        LogSetOwner(owner);
    }
    
    modifier auth {
        require(isAuthorized(msg.sender, msg.sig));
        _;
    }
    
    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }
}

关键点:

  • 使用auth修饰器进行权限控制
  • isAuthorized函数检查三种授权情况:
    1. 调用者是合约自身
    2. 调用者是owner
    3. 调用者被authority授权

DSStop合约管理

contract DSStop is DSNote, DSAuth {
    bool public stopped;
    
    modifier stoppable {
        require(!stopped);
        _;
    }
    
    function stop() public auth note { stopped = true; }
    function start() public auth note { stopped = false; }
}

功能:提供合约暂停/恢复机制

DSTokenBase基础代币合约

实现标准ERC20功能:

  • 余额管理(_balances)
  • 授权管理(_approvals)
  • 转账功能(transfer/transferFrom)

DSToken主合约

contract DSToken is DSTokenBase(0), DSStop {
    mapping (address => mapping (address => bool)) _trusted;
    
    function mint(address guy, uint wad) public auth stoppable {
        _balances[guy] = add(_balances[guy], wad);
        _supply = add(_supply, wad);
        Mint(guy, wad);
    }
    
    // 其他关键功能...
}

关键功能:

  • 信任机制(_trusted)
  • 代币铸造(mint) - 需要auth权限
  • 代币销毁(burn)

3. 漏洞核心函数分析

function transferFrom(address _from, address _to, uint256 _amount, bytes _data, string _custom_fallback) 
    public returns (bool success) {
    
    require(super.transferFrom(_from, _to, _amount));
    
    if (isContract(_to)) {
        ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
        receiver.call.value(0)(bytes4(keccak256(_custom_fallback)), _from, _amount, _data);
    }
    
    ERC223Transfer(_from, _to, _amount, _data);
    return true;
}

漏洞原理:

  1. 函数允许传入自定义回调函数名(_custom_fallback)
  2. 转账后会尝试调用目标合约的指定函数
  3. 当_to地址为合约自身时,可以调用任意函数
  4. 由于合约自身调用自身会通过isAuthorized检查(src == address(this)返回true)
  5. 从而绕过权限控制执行特权函数

四、漏洞复现步骤

1. 环境准备

  • 以太坊测试网络或本地开发链
  • 部署ATN合约代码
  • 准备两个账户:正常用户和攻击者

2. 攻击流程

  1. 初始状态检查

    • 查询当前合约owner
    • 确认攻击者账户余额为0
  2. 构造恶意交易
    参数设置:

    _from: 攻击者地址
    _to: ATN合约地址
    _amount: 0
    _data: 0x00
    _custom_fallback: "setOwner(address)"
    
  3. 执行攻击

    • 调用transferFrom函数传入上述参数
    • 由于_to是合约自身,会执行setOwner函数
    • 权限检查时msg.sender是合约地址,通过验证
  4. 验证攻击结果

    • 查询合约owner已变更为攻击者地址
    • 攻击者可以调用mint函数为自己增发代币
  5. 隐藏踪迹

    • 将owner改回原地址
    • 转移盗取的代币

3. 真实攻击交易分析

  1. 黑客获得提权交易:
    https://etherscan.io/tx/0x3b7bd618c49e693c92b2d6bfb3a5adeae498d9d170c15fcc79dd374166d28b7b

  2. 增发1100万ATN交易:
    https://etherscan.io/tx/0x9b559ffae76d4b75d2f21bd643d44d1b96ee013c79918511e3127664f8f7a910

  3. 恢复owner交易:
    https://etherscan.io/tx/0xfd5c2180f002539cd636132f1baae0e318d8f1162fb62fb5e3493788a034545a

五、漏洞修复建议

  1. 严格限制回调函数

    • 白名单允许的回调函数
    • 禁止调用敏感函数
  2. 改进权限检查

    • 区分合约自身调用和外部调用
    • 对特权函数增加额外验证
  3. 使用更安全的ERC标准

    • 考虑使用更新的ERC677或ERC827
    • 或实现更严格的安全检查
  4. 代码审计

    • 所有涉及外部调用的函数需要重点审计
    • 使用形式化验证工具检查权限控制

六、总结

ATN漏洞的核心在于:

  1. ERC223的自定义回调机制被滥用
  2. ds-auth的权限检查在合约自调用时过于宽松
  3. 转账函数与权限管理函数的组合产生意外行为

此案例展示了区块链智能合约开发中:

  • 外部调用危险性的典型示例
  • 权限管理的重要性
  • 合约组合时的安全考虑必要性

七、参考资源

  1. ERC223标准介绍:http://btsabc.org/article-1449-1.html
  2. ATN合约代码:https://etherscan.io/address/0x461733c17b0755ca5649b6db08b3e213fcf22546#code
  3. 漏洞分析文章:https://paper.seebug.org/621/
  4. 技术解析:https://www.jianshu.com/p/38cbf879ac72
ATN区块链漏洞深入分析与复现教学文档 一、ATN项目背景介绍 ATN是全球首个区块链+AI项目,是一个去中心化的、无需授权的、用户自定义人工智能即服务(AIaaS)和使用接口的开放区块链平台。其核心特点包括: 引入DBot的Oracle预言机技术 采用跨链互操作技术 基于石墨烯架构实现高并发TPS 重点解决AIaaS与EVM兼容智能合约间的互操作性问题 二、漏洞事件概述 2018年5月11日,ATN安全团队发现其智能合约存在严重漏洞并被攻击。黑客利用以下两个关键特征实施攻击: ERC223合约可传入自定义接收调用函数 ds-auth权限校验机制 攻击导致合约内部权限控制失效,黑客成功获取合约控制权并增发大量代币。 三、合约技术分析 1. ERC223与ERC20的区别 ERC223由Dexaran于2017年提出,旨在改进ERC20标准,解决其无法处理发往合约自身Token的问题: ERC20转账机制: 直接调用transfer() 先approve()再transferFrom() ERC223改进: 当转账对象为智能合约时,ERC20必须使用approve+transferFrom组合 ERC223解决了转往合约地址的Token无法再次转出的问题 2. 关键合约组件分析 DSAuth权限控制合约 关键点: 使用auth修饰器进行权限控制 isAuthorized函数检查三种授权情况: 调用者是合约自身 调用者是owner 调用者被authority授权 DSStop合约管理 功能:提供合约暂停/恢复机制 DSTokenBase基础代币合约 实现标准ERC20功能: 余额管理(_ balances) 授权管理(_ approvals) 转账功能(transfer/transferFrom) DSToken主合约 关键功能: 信任机制(_ trusted) 代币铸造(mint) - 需要auth权限 代币销毁(burn) 3. 漏洞核心函数分析 漏洞原理: 函数允许传入自定义回调函数名(_ custom_ fallback) 转账后会尝试调用目标合约的指定函数 当_ to地址为合约自身时,可以调用任意函数 由于合约自身调用自身会通过isAuthorized检查(src == address(this)返回true) 从而绕过权限控制执行特权函数 四、漏洞复现步骤 1. 环境准备 以太坊测试网络或本地开发链 部署ATN合约代码 准备两个账户:正常用户和攻击者 2. 攻击流程 初始状态检查 查询当前合约owner 确认攻击者账户余额为0 构造恶意交易 参数设置: 执行攻击 调用transferFrom函数传入上述参数 由于_ to是合约自身,会执行setOwner函数 权限检查时msg.sender是合约地址,通过验证 验证攻击结果 查询合约owner已变更为攻击者地址 攻击者可以调用mint函数为自己增发代币 隐藏踪迹 将owner改回原地址 转移盗取的代币 3. 真实攻击交易分析 黑客获得提权交易: https://etherscan.io/tx/0x3b7bd618c49e693c92b2d6bfb3a5adeae498d9d170c15fcc79dd374166d28b7b 增发1100万ATN交易: https://etherscan.io/tx/0x9b559ffae76d4b75d2f21bd643d44d1b96ee013c79918511e3127664f8f7a910 恢复owner交易: https://etherscan.io/tx/0xfd5c2180f002539cd636132f1baae0e318d8f1162fb62fb5e3493788a034545a 五、漏洞修复建议 严格限制回调函数 白名单允许的回调函数 禁止调用敏感函数 改进权限检查 区分合约自身调用和外部调用 对特权函数增加额外验证 使用更安全的ERC标准 考虑使用更新的ERC677或ERC827 或实现更严格的安全检查 代码审计 所有涉及外部调用的函数需要重点审计 使用形式化验证工具检查权限控制 六、总结 ATN漏洞的核心在于: ERC223的自定义回调机制被滥用 ds-auth的权限检查在合约自调用时过于宽松 转账函数与权限管理函数的组合产生意外行为 此案例展示了区块链智能合约开发中: 外部调用危险性的典型示例 权限管理的重要性 合约组合时的安全考虑必要性 七、参考资源 ERC223标准介绍:http://btsabc.org/article-1449-1.html ATN合约代码:https://etherscan.io/address/0x461733c17b0755ca5649b6db08b3e213fcf22546#code 漏洞分析文章:https://paper.seebug.org/621/ 技术解析:https://www.jianshu.com/p/38cbf879ac72