区块链安全—详谈共识攻击(二)
字数 1500 2025-08-22 18:37:15
区块链共识攻击详解: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 漏洞原理
智能合约中的整数溢出问题:
-
上溢示例:
uint8 a = 255; uint8 b = 1; return a+b; // 返回0 -
下溢示例:
uint8 a = 0; uint8 b = 1; return a-b; // 返回255
5.2 实际案例(SMT事件)
-
漏洞代码:
if(balances[_from] < _feeSmt + _value) revert(); -
攻击方式:
- 设置_feeSmt为极大值(0x9fff...ffff)
- 设置_value使两者相加溢出为0
- 绕过余额检查执行转账
-
防御措施:
- 使用SafeMath库进行算术运算
- 严格检查输入参数范围
- 充分测试边界条件
六、防御建议
-
共识层防御:
- 增加节点准入机制
- 实现动态节点权重
- 优化视图切换协议
-
网络层防御:
- 限制单个IP的连接数
- 实现连接随机化
- 加强节点身份认证
-
合约层防御:
- 使用经过验证的数学库
- 实现全面的输入验证
- 进行严格的安全审计
-
经济层防御:
- 设计抗贿赂的共识机制
- 增加作恶经济成本
- 实现透明的激励机制