返回论坛

EOS 新型攻击手法深度解析:hard_fail 状态攻击

查找币 漏洞披露 安全研究 Web3安全 区块链安全

查找币安全研究院

钱包恢复评估 | 链上取证分析 | Web3 事件响应
以合法授权、证据保全、隐私保护和可复核流程为前提,不要求用户在线提交完整私钥或助记词。

查看研究院 研究报告中心
## 前言 2019年3月10日凌晨,EOS生态中的游戏项目Vegas Town(合约账户:eosvegasgame)遭遇了一次精心策划的攻击,损失数千枚EOS。查找币安全团队在第一时间捕获了这笔异常交易,并迅速同步给相关交易所及项目方。本次攻击手法在EOS安全事件中尚属首次出现,但其本质可以归类为假充值攻击的一种变种。本文将由查找币安全团队为您深入剖析这一新型攻击手法的技术细节。 ## 攻击回顾 通过查找币安全团队的持续追踪分析,本次攻击的发起账户为 `fortherest12`。在通过EOS区块链浏览器eosq对该账户进行查询时,我们发现其首页存在大量异常的错误执行交易记录: - 交易数量异常庞大 - 交易状态均显示为失败 - 失败类型统一为 `hard_fail` 查看其中任意一笔交易的详细数据,可以清晰地看到失败类型均标注为 `hard_fail`,这与我们之前分析过的EOS黑名单攻击手法有着相似的原理——核心问题在于项目方未对下注交易的状态进行充分校验。 ## 攻击技术分析 ### 核心要点一:hard_fail 状态机制 根据EOS官方开发文档([How to Monitor State with State History Plugin](https://developers.eos.io/eosio-nodeos/docs/how-to-monitor-state-with-state-history-plugin))的说明,EOS交易失败状态分为两种类型: - **soft_fail**:这是最常见的失败类型。当合约内部执行 `eosio_assert` 时触发,属于“客观错误且错误处理器正确执行”的情况。例如: ```cpp // do something eosio_assert(0, "This is assert by myself"); // do others ``` 上述代码中,用户自定义的断言错误属于客观错误,错误处理器(error handler)会正确执行并输出提示信息。 - **hard_fail**:定义为“客观错误且错误处理器未正确执行”。简单理解,就是错误发生后,合约没有使用 `onerror` 等错误处理器进行捕获和处理。当合约中缺少 `onerror` 处理逻辑时,交易就会以 `hard_fail` 状态结束。 ### 核心要点二:延迟交易机制 攻击交易中另一个关键特征是**延迟时间**。观察发现,攻击交易的延迟时间竟然长达2小时之久。这引发了一个关键疑问:为什么普通账户可以执行延迟交易? 通过进一步分析,我们了解到: - 常规的延迟交易通常由合约账户发出 - 但通过 `cleos` 工具的特定参数设置,**非合约账户也可以执行延迟交易** - 延迟交易不同于合约内通过 `eosio_assert` 抛出的错误,它没有对应的错误处理机制 - 根据官方文档,这种无错误处理的交易自然会被标记为 `hard_fail` - 最关键的是:`hard_fail` 状态会在链上生成交易记录 ## 攻击细节剖析 根据EOS Live钱包开发者jerry的技术讲解,本次攻击利用了EOS底层机制的特性: - 当交易延迟时间不为0时,系统不会立即校验交易执行结果 - 延迟交易的处理路径为 `push_schedule_transaction` - 而延迟时间为0的交易则直接通过 `push_transaction` 处理 - 这两种处理机制存在本质区别 攻击者正是利用这一差异,通过构造延迟交易来绕过项目方的实时校验逻辑。 ## 攻击成因 经过深入分析,本次攻击的根本原因在于: **项目方仅对交易是否存在进行了判断,而忽略了交易执行状态的校验。** 具体表现为: - 只检查链上是否有该笔交易的记录 - 未验证交易的实际执行状态(success/fail) - 导致 `hard_fail` 状态的交易被错误地视为有效下注 ## 防护建议 针对此类攻击,查找币安全团队建议项目方采取以下防御措施: 1. **完善交易状态校验逻辑** - 在离线开奖或处理下注时,必须校验交易的实际执行状态 - 不能仅判断交易是否存在链上记录 2. **关键校验流程示例** ```python # 错误做法:仅检查交易存在 if transaction_exists(tx_id): process_bet() # 正确做法:检查交易状态 if transaction_exists(tx_id) and transaction_status(tx_id) == "executed": process_bet() ``` 3. **建立多层验证机制** - 对延迟交易设置超时拒绝策略 - 引入交易状态过滤,自动排除 `hard_fail` 和 `soft_fail` 交易 - 监控异常交易模式,建立预警机制 ## 总结 本次EOS新型攻击手法再次提醒我们,区块链安全防御需要持续演进。攻击者利用项目方对交易状态校验的盲区,通过构造 `hard_fail` 状态的延迟交易实现假充值。查找币安全团队建议所有EOS生态项目方立即检查自身交易校验逻辑,避免类似漏洞被利用。 --- 本文由查找币安全团队整理发布
在论坛中查看和回复