区块链安全—深入分析ATN漏洞
字数 2084 2025-08-22 12:22:30
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权限控制合约
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函数检查三种授权情况:
- 调用者是合约自身
- 调用者是owner
- 调用者被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;
}
漏洞原理:
- 函数允许传入自定义回调函数名(_custom_fallback)
- 转账后会尝试调用目标合约的指定函数
- 当_to地址为合约自身时,可以调用任意函数
- 由于合约自身调用自身会通过isAuthorized检查(src == address(this)返回true)
- 从而绕过权限控制执行特权函数
四、漏洞复现步骤
1. 环境准备
- 以太坊测试网络或本地开发链
- 部署ATN合约代码
- 准备两个账户:正常用户和攻击者
2. 攻击流程
-
初始状态检查
- 查询当前合约owner
- 确认攻击者账户余额为0
-
构造恶意交易
参数设置:_from: 攻击者地址 _to: ATN合约地址 _amount: 0 _data: 0x00 _custom_fallback: "setOwner(address)" -
执行攻击
- 调用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