区块链安全—详谈共识攻击(二)
字数 1500 2025-08-22 18:37:15

区块链共识攻击详解:PBFT、日蚀攻击与整数溢出

一、拜占庭容错算法(PBFT)

1.1 算法背景与问题

拜占庭将军问题(Byzantine Generals Problem)由莱斯利·兰波特提出,描述了分布式系统中节点间达成共识的困难:

  • 核心问题:在分布式网络中,当部分节点可能出错或发送错误信息时,如何确保剩余节点能达成一致行动
  • 关键特征
    • 存在强大外部威胁
    • 参与者实力均等
    • 联合行动才能成功
    • 任何参与者退出都会导致失败

1.2 算法原理

PBFT(实用拜占庭容错)算法解决思路:

  1. 节点要求:系统中有"3f+1"个节点,最多容忍f个恶意节点

  2. 共识流程

    • 客户端向主节点请求服务
    • 主节点广播给副节点
    • 副节点执行内容并反馈
    • 客户端收到f+1个相同答案后确认
  3. 签名机制

    • 提议者(如将军A)发布消息并签名【3点进攻+将军A签名】
    • 其他节点依次确认并附加签名
    • 达到足够数量签名后执行共识
  4. 分叉处理

    • 多个提议同时出现时按广播时间排序
    • 采用最长链原则解决分叉

二、授权拜占庭容错算法(DBFT)

2.1 算法改进

DBFT在PBFT基础上做了以下改进:

  1. 议会制度模型

    • 区块生成由议长主持,议员共同协商
    • 议长选举公式:(当前区块高度+1-视图编号) mod 议员人数
  2. 共识流程

    • 议长更新视图编号后发起共识
    • 议员验证消息后参与共识
    • 2/3议员同意则达成共识
  3. 动态性改进

    • 从C/S架构改为P2P对等节点
    • 支持节点动态加入退出
    • 引入基于权益比例的投票机制
    • 使用数字证书认证节点身份

2.2 安全隐患

  1. 网络延迟问题

    • 部分节点收到2f+1投票,部分未收到
    • 未收到方发起change-view重新选举
    • 导致信息不匹配和分叉
  2. 恶意节点攻击

    • 黑客控制记账节点
    • 故意在超时前发起提议
    • 人为制造分叉现象

三、日蚀攻击(Eclipse Attack)

3.1 攻击原理

日蚀攻击通过控制目标节点的所有连接实现:

  1. 攻击步骤

    • 控制目标节点的输出连接(连接到攻击者节点)
    • 使用攻击节点连接输入节点
    • 不断刷新节点地址表
    • 必要时使用DDoS使节点重启
  2. 攻击效果

    • 隔离受害者节点与正常网络
    • 40%算力即可实现51%攻击效果
    • 可诱骗受害者查看虚假交易信息

3.2 平台差异

  1. 比特币

    • 每个IP对应一个节点
    • 最多8个输出TCP连接
    • 攻击者可垄断所有有效连接
  2. 以太坊

    • 每个IP可运行多个节点(不同公钥)
    • 需要13个连接
    • 使用点对点加密通道
    • 仍可被隔离攻击

四、贿赂攻击(Bribery Attacks)

4.1 攻击模型

通过区块链外部的经济激励影响共识:

  1. 基本形式

    • 攻击者提供额外奖励(E)改变节点投票
    • 打破原有纳什均衡
    • 所有节点收益从P变为P+E
  2. 攻击特点

    • 不需要提升算力
    • 通过经济手段影响共识
    • 对区块链系统造成损失

五、整数溢出攻击

5.1 漏洞原理

智能合约中的整数溢出问题:

  1. 上溢示例

    uint8 a = 255;
    uint8 b = 1;
    return a+b; // 返回0
    
  2. 下溢示例

    uint8 a = 0;
    uint8 b = 1;
    return a-b; // 返回255
    

5.2 实际案例(SMT事件)

  1. 漏洞代码

    if(balances[_from] < _feeSmt + _value) revert();
    
  2. 攻击方式

    • 设置_feeSmt为极大值(0x9fff...ffff)
    • 设置_value使两者相加溢出为0
    • 绕过余额检查执行转账
  3. 防御措施

    • 使用SafeMath库进行算术运算
    • 严格检查输入参数范围
    • 充分测试边界条件

六、防御建议

  1. 共识层防御

    • 增加节点准入机制
    • 实现动态节点权重
    • 优化视图切换协议
  2. 网络层防御

    • 限制单个IP的连接数
    • 实现连接随机化
    • 加强节点身份认证
  3. 合约层防御

    • 使用经过验证的数学库
    • 实现全面的输入验证
    • 进行严格的安全审计
  4. 经济层防御

    • 设计抗贿赂的共识机制
    • 增加作恶经济成本
    • 实现透明的激励机制
区块链共识攻击详解:PBFT、日蚀攻击与整数溢出 一、拜占庭容错算法(PBFT) 1.1 算法背景与问题 拜占庭将军问题(Byzantine Generals Problem)由莱斯利·兰波特提出,描述了分布式系统中节点间达成共识的困难: 核心问题 :在分布式网络中,当部分节点可能出错或发送错误信息时,如何确保剩余节点能达成一致行动 关键特征 : 存在强大外部威胁 参与者实力均等 联合行动才能成功 任何参与者退出都会导致失败 1.2 算法原理 PBFT(实用拜占庭容错)算法解决思路: 节点要求 :系统中有"3f+1"个节点,最多容忍f个恶意节点 共识流程 : 客户端向主节点请求服务 主节点广播给副节点 副节点执行内容并反馈 客户端收到f+1个相同答案后确认 签名机制 : 提议者(如将军A)发布消息并签名【3点进攻+将军A签名】 其他节点依次确认并附加签名 达到足够数量签名后执行共识 分叉处理 : 多个提议同时出现时按广播时间排序 采用最长链原则解决分叉 二、授权拜占庭容错算法(DBFT) 2.1 算法改进 DBFT在PBFT基础上做了以下改进: 议会制度模型 : 区块生成由议长主持,议员共同协商 议长选举公式:(当前区块高度+1-视图编号) mod 议员人数 共识流程 : 议长更新视图编号后发起共识 议员验证消息后参与共识 2/3议员同意则达成共识 动态性改进 : 从C/S架构改为P2P对等节点 支持节点动态加入退出 引入基于权益比例的投票机制 使用数字证书认证节点身份 2.2 安全隐患 网络延迟问题 : 部分节点收到2f+1投票,部分未收到 未收到方发起change-view重新选举 导致信息不匹配和分叉 恶意节点攻击 : 黑客控制记账节点 故意在超时前发起提议 人为制造分叉现象 三、日蚀攻击(Eclipse Attack) 3.1 攻击原理 日蚀攻击通过控制目标节点的所有连接实现: 攻击步骤 : 控制目标节点的输出连接(连接到攻击者节点) 使用攻击节点连接输入节点 不断刷新节点地址表 必要时使用DDoS使节点重启 攻击效果 : 隔离受害者节点与正常网络 40%算力即可实现51%攻击效果 可诱骗受害者查看虚假交易信息 3.2 平台差异 比特币 : 每个IP对应一个节点 最多8个输出TCP连接 攻击者可垄断所有有效连接 以太坊 : 每个IP可运行多个节点(不同公钥) 需要13个连接 使用点对点加密通道 仍可被隔离攻击 四、贿赂攻击(Bribery Attacks) 4.1 攻击模型 通过区块链外部的经济激励影响共识: 基本形式 : 攻击者提供额外奖励(E)改变节点投票 打破原有纳什均衡 所有节点收益从P变为P+E 攻击特点 : 不需要提升算力 通过经济手段影响共识 对区块链系统造成损失 五、整数溢出攻击 5.1 漏洞原理 智能合约中的整数溢出问题: 上溢示例 : 下溢示例 : 5.2 实际案例(SMT事件) 漏洞代码 : 攻击方式 : 设置_ feeSmt为极大值(0x9fff...ffff) 设置_ value使两者相加溢出为0 绕过余额检查执行转账 防御措施 : 使用SafeMath库进行算术运算 严格检查输入参数范围 充分测试边界条件 六、防御建议 共识层防御 : 增加节点准入机制 实现动态节点权重 优化视图切换协议 网络层防御 : 限制单个IP的连接数 实现连接随机化 加强节点身份认证 合约层防御 : 使用经过验证的数学库 实现全面的输入验证 进行严格的安全审计 经济层防御 : 设计抗贿赂的共识机制 增加作恶经济成本 实现透明的激励机制