漏洞概述 漏洞名称: ForwardOpen mixed-class application path causes type confusion in ConnectionData::CorrectSizes() and triggers remote out-of-bounds read #45 漏洞描述: 一个精心构造的ForwardOpen请求可以通过非Assembly对象的I/O端点提供混合类应用路径。当前代码接受此类路径,只要引用的类和实例存在,随后到达ConnectionData::CorrectSizes(),无条件地将属性3解析为字节数组。当端点不是Assembly对象(如Identity或Ethernet Link)时,属性3不是字节数组,而CorrectSizes()读取无效内存,导致AddressSanitizer报告远程越界读取和进程中止。该问题可通过正常的TCP显式消息/ForwardOpen服务器路径重现。 影响范围 远程客户端崩溃: 通过发送精心构造的ForwardOpen请求,远程客户端可以导致服务器崩溃。 内存安全后果: 远程越界读取,随后由进程终止。基于当前证据,这是一个可靠的远程拒绝服务漏洞。 修复方案 修复方向1: 拒绝非Assembly端点用于Class 0/1 I/O连接 对于Class 0/1 ForwardOpen,要求每个解析的配置/消费/生产端点使用Assembly数据端点,以具有CipAssemblyClass。如果任何端点解析为不同的类,则请求应使用适当的Connection Manager扩展状态失败,而不是继续进入OpenIO()或CorrectSizes()。这是最干净的修复,因为它恢复了CorrectSizes()当前假设的不变量。代码已经执行了类特定的端点检查,以匹配Message Router类3(消息路由器类)的现有结构。 修复方向2: 强化CorrectSizes()以防止类型混淆 即使有上游验证,CorrectSizes()也不应盲目地将class instance->data(attribute)强制转换为ByteBuf。防御性检查应验证解析的端点是否是Assembly实例,或者至少属性3是预期的字节数组类型,然后再将其作为ByteBuf使用。如果不返回错误,而是返回错误,这将把潜在的内存bug变成正常的协议拒绝。 POC代码