漏洞概述 漏洞名称: Stack Out-of-Bounds Read in Blind EPath Decoding #582 漏洞描述: 漏洞类型: 栈溢出读取(Stack Out-of-Bounds Read) 影响版本: OpEnet 2.3.0 (commit 785d5f) 漏洞原因: 在处理带有伪造EPath头的无效ENIP SendRRData帧时,CIP消息解析存在栈溢出读取问题。攻击者可以构造一个非常短的CIP负载,其 字段声称存在更多的路径字,但实际上并不存在。由于解析器信任攻击者控制的 并继续解码路径元素,而没有剩余长度边界检查,导致读取超出栈接收缓冲区的末尾。此漏洞可通过网络流量远程利用,无需认证。 影响范围 影响: 可能导致服务器端数据包解析崩溃,造成拒绝服务(DoS)。 利用条件: 攻击者需要能够发送伪造的ENIP SendRRData帧。 修复方案 当前状态: 未提供具体修复方案。 建议: 开发者应检查并修复 函数中的路径长度验证逻辑,确保在解码路径元素时进行严格的长度边界检查。 POC代码 详细步骤 1. 构建: - 在POSIX环境中(如Ubuntu 22.04)构建OpEnet,启用 和ASAN。 - 编辑 ,确保设置以下标志: - 然后构建项目: 2. 运行目标: - 启动目标进程: 3. 发送攻击流量: - 在另一个终端中,发送PoC请求: 4. 观察行为: - 接收畸形请求后,目标触发ASAN栈溢出读取,进程以 退出。日志输出显示栈溢出读取的具体位置和堆栈跟踪。 日志输出示例 影响评估 远程利用: 该漏洞可通过正常的EtherNet/IP显式消息路径远程利用,导致服务器端数据包解析崩溃。 当前验证影响: 可靠的进程崩溃/拒绝服务。网络攻击者可以构造 和 序列,驱动 越过栈堆叠的TCP接收缓冲区末尾,导致OpEnet进程在ASAN下中止。即使没有ASAN,解码器也会越过预期的长度边界,并解释相邻的栈字节为CIP路径数据,这是未定义行为,应被视为具有远程DoS影响的内存安全漏洞。