Spragusa/hydroficient-replay-attack-defense
GitHub: Spragusa/hydroficient-replay-attack-defense
演示MQTT协议中重放攻击防御机制的IoT安全实验项目,通过时间戳验证、序列追踪和HMAC签名三层防护确保消息完整性与新鲜度。
Stars: 0 | Forks: 0
# MQTT 重放攻击防御 – Hydroficient 项目 6
## 概述
本项目演示了重放攻击如何影响 IoT 消息系统,以及分层防御如何防止这些攻击。该系统模拟通过 MQTT 管道发布数据的水流传感器,并评估不同的重放攻击防御措施。
该项目建立在早期工作的基础上,此前 TLS 和双向 TLS 已保护了设备与 Broker 之间的连接。在这个阶段,我们专注于保护消息本身的完整性和新鲜度。
## 问题所在
即使 TLS 加密了流量并对设备进行了身份验证,攻击者仍然可以捕获合法消息并在稍后重放。
这可能导致不正确的系统行为,例如:
- 错误的停机信号
- 不正确的传感器读数
- 重复的命令
重放攻击是 IoT 环境中已知的威胁,因为此类环境中消息传输频繁,且系统依赖实时数据。
## 实施的防御机制
在订阅者端实施了三层防御。
### 1. 时间戳验证
拒绝超过允许时间窗口的旧消息。
目的:
- 防止延迟重放攻击。
### 2. 序列计数器
每个设备发送带有递增序列号的消息。
目的:
- 检测重复消息。
- 阻止即时重放攻击。
### 3. HMAC 消息签名
消息包含使用共享密钥生成的加密签名。
目的:
- 检测消息篡改。
- 防止修改型重放攻击。
## 实验设计
针对三种攻击类型测试了四种防御配置。
防御配置:
- 无防御
- 仅时间戳验证
- 仅序列计数器
- 组合所有防御
攻击类型:
- 即时重放
- 延迟重放
- 修改型重放(篡改传感器值)
每个实验处理五条消息并测量拒绝率。
## 结果
| 防御措施 | 即时重放 | 延迟重放 | 修改型重放 |
|---|---:|---:|---:|
| 无防御 | 0% | 0% | 0% |
| 仅时间戳 | 0% | 100% | 0% |
| 仅计数器 | 100% | 100% | 0% |
| 所有防御 | 100% | 100% | 100% |
结果表明,没有单一防御能覆盖所有攻击类型,但结合这三者可提供全面保护。
## 防御对比图

## 文件
### 核心脚本
- [publisher_defended.py](./publisher_defended.py)
- [subscriber_defended.py](./subscriber_defended.py)
- [replay_attacker.py](./replay_attacker.py)
- [defense_tester.py](./defense_tester.py)
### 实验结果
- [experiment_results.json](./experiment_results.json)
- [captured_messages.json](./captured_messages.json)
- [defense_comparison.png](./defense_comparison.png)
### 截图:
- [防御实验截图](./screenshots-defense-experiments)
- [重放攻击截图](./screenshots-replay-attack)
## 关键要点
- TLS 保护通信通道,但不能防止重放攻击。
- 重放保护需要消息级验证。
- 分层防御比单一控制提供更强的保护。
- 这三项检查的性能开销可以忽略不计(每条消息不到 1 ms)。
## 下一步
项目的下一阶段是构建一个实时安全仪表板,将接受和拒绝的消息可视化,并在攻击发生时向操作员发出警报。
标签:HMAC签名, Homebrew安装, IoT安全, MITM防御, TLS/mTLS, 中间人攻击, 协议安全, 发布订阅模型, 安全实验, 嵌入式安全, 序列号追踪, 数据防篡改, 时间戳验证, 水流量传感器, 消息完整性, 消息认证, 物联网, 网络安全, 逆向工具, 重放攻击防御, 隐私保护