CVE-2026-29972nanoMODBUS库在v1.22.0及之前的版本中存在严重的安全漏洞,具体位于nanomodbus.c文件的recv_read_registers_res()函数内。当客户端调用nmbs_read_holding_registers()或nmbs_read_input_registers()读取寄存器时,库会直接根据服务器响应中的byte_count字段向调用者提供的缓冲区写入数据。由于系统在写入前未验证该字段是否与客户端请求的数量相匹配,恶意的Modbus TCP服务器可以发送包含超大byte_count(如250)的响应包。这将导致多达248字节的受控数据溢出缓冲区,攻击者可利用此漏洞在目标设备上执行任意代码。
该漏洞的根源是典型的缺乏边界检查。在正常的Modbus通信中,服务器响应的byte_count应与客户端请求的寄存器数量相对应。然而,受影响的nanoMODBUS实现存在逻辑缺陷,它先执行内存拷贝操作,后验证(或根本未验证)数据长度。具体而言,当客户端请求少量寄存器(例如只请求1个寄存器,栈上仅分配少量空间)时,攻击者控制的服务器可以响应一个声称包含125个寄存器(byte_count=250)的数据包。recv_read_registers_res()函数会忠实地将这250字节的数据复制到为少量数据分配的栈缓冲区中,从而导致栈溢出。这种溢出允许攻击者覆盖返回地址或函数指针,由于攻击者控制了溢出数据的内容,因此可以劫持控制流并实现远程代码执行(RCE)。鉴于该漏洞通过网络(AV:N)触发且无需用户交互(UI:N),其对物联网(IoT)和工业控制系统(ICS)构成严重威胁。