George0Papasotiriou/CVE-2026-9090-Modbus-TCP-Write-to-Read-Only-Coils-via-Function-Code-Spoofing
GitHub: George0Papasotiriou/CVE-2026-9090-Modbus-TCP-Write-to-Read-Only-Coils-via-Function-Code-Spoofing
该项目演示了工业 PLC 通过 Modbus TCP 协议因访问控制不足导致只读线圈可被非法写入的安全漏洞概念验证。
Stars: 0 | Forks: 0
## CVE-2026-9090 – 通过 Function Code 欺骗对只读 Coils 进行 Modbus TCP 写入
### **程序代码(使用 pymodbus 模拟的 Python 代码)**
```
# modbus_plc_sim.py - 具有只读线圈的模拟 Modbus PLC
from pymodbus.server.sync import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
store = ModbusSlaveContext(
di=ModbusSequentialDataBlock(0, [1]*100), # coils – should be read‑only
co=ModbusSequentialDataBlock(0, [0]*100), # discrete inputs
hr=ModbusSequentialDataBlock(0, [0]*100),
ir=ModbusSequentialDataBlock(0, [0]*100)
)
# 漏洞:线圈块 (di) 通常可通过 function code 5 (Write Single Coil) 写入,但可能存在配置错误。
# 为了模拟一个缺陷,我们将允许使用 function code 15 (Write Multiple Coils) 写入线圈,即使它们应该是只读的。
# pymodbus 默认允许写入线圈。我们只是来演示写入一个应该是 safety‑critical 的线圈。
context = ModbusServerContext(slaves=store, single=True)
StartTcpServer(context, address=("0.0.0.0", 5020))
```
# CVE-2026-9090 – 对只读 Coils 进行 Modbus TCP 写入

## 概述
某工业 PLC 暴露了本应为只读的 coils(例如,报警状态)。然而,由于配置错误,Modbus 服务器接受对这些 coils 的写入命令(function code 5 或 15),从而允许攻击者操纵安全系统。
## 漏洞详情
- **类型:** 访问控制不足
- **影响:** 物理损坏,安全覆盖。
- **根本原因:** Modbus 内存映射未正确配置以拒绝对某些地址的写入命令。
## 漏洞利用演示
1. 启动模拟 PLC:
pip install pymodbus
python modbus_plc_sim.py
2. 运行漏洞利用程序:
python exploit_modbus_write.py
标签:Modbus协议, PKINIT, PLC仿真, Python, 工控安全, 无后门, 逆向工具