思科Snort Modbus OT预处理器DoS漏洞分析

思科Snort Modbus OT预处理器DoS漏洞分析

时间:2022-07-07 作者:安帝科技


Snort是一款开源入侵防御系统(IPS),基于预定义的规则集执行协议分析、内容搜索和匹配流量包,以此发现恶意网络活动并为用户生成告警。Snort预处理器在处理Modbus流量时存在整数溢出缺陷而导致拒绝服务漏洞,未授权的攻击者可利用此漏洞造成Snort进程挂起,停止流量检测而实现拒绝服务。

Part1 漏洞状态

Part2 漏洞描述

此漏洞是由于处理Modbus流量时出现整数溢出造成的。攻击者可以通过受影响的设备发送精心设计的Modbus流量来利用此漏洞。成功的利用可能允许攻击者导致Snort进程挂起,从而导致流量检查停止。

Part3 漏洞分析

Snort中包含的一些预处理器有ARP、DNS、SSH和一些OT协议,例如MODBUS/DNP3。Snort的默认配置(snort.conf):

Modbus预处理器属性的snort规则示例:

Modbus写文件记录命令(0x15)用于将多组文件寄存器写入Modbus服务器。每个文件最多可包含10,000条记录,地址为十进制0000到9999或0x0000到0x270F。写文件记录Modbus命令允许写入多组参考。用含有7个字节和数据的独立“子请求”字段定义每个组:引用类型:1字节(必须指定为6);文件号:2字节;文件内起始记录号:2字节;要写入的记录长度:2字节;要写入的数据:每个寄存器2个字节的数据。要写入的寄存器数量与请求中的所有其他字段相结合,不得超过Modbus协议数据单元(PDU)的允许长度,即253个字节。

以下是写文件记录Modbus命令请求的摘要:

SnortModbus预处理器使用modbus_decode.c中的ModbusCheckRequestLengths函数来计算每个数据包的预期大小。通过while循环遍历数据包中的所有组,以此计算总记录长度。

tmp_count参数使用来自packet->payload的值进行初始化,并根据payload_length参数表示有效载荷中剩余的字节数。设置tmp_count后进入一个while循环,退出条件为bytes_processed < tmp_count。此时tmp_count=10,且在循环期间恒定不变。因此只要bytes_processed小于10,while循环会一直继续。 while循环中,bytes_processed受record_length参数的影响,该参数由modbus有效负载中的两个字节组成。record_length参数的类型为uint16_t,其值来自用户控制的modbus有效负载,bytes_processed也是uint16_t,计算方法是record_length*2+子请求标头大小,即7。

但是,乘法的结果可能超过最大uint16_t大小,从而溢出值。
例如:
记录长度=0xfffe
MODBUS_FILE_RECORD_SUB_REQUEST_SIZE=7
bytes_processed=7+(2*0xfffe)
在此示例中,bytes_processed将为0x20003,即:
0000000000000010|0000000000000011
在二进制中,当结果转换为uint_16t时,保留低16位,这意味着bytes_processed将为0000000000000011,即3。如果bytes_processed为3,while循环将继续执行。
新的record_length值将从由用户控制的有效负载中获取,来自特定的偏移量,该偏移量部分受bytes_processed值的影响。由于可以使用整数溢出错误完全控制bytes_processed的值,因此可以制作有效负载,使新计算的record_length将是任由攻击者选择的数字。
如果读取到record_length的下一个值是0xfffb,那么bytes_processed将按如下方式计算:
bytes_processed=bytes_processed+MODBUS_FILE_RECORD_SUB_REQUEST_SIZE+2*record_length
bytes_processed=3+7+2*(0xfffb)=0
进入下次while循环时,bytes_processed还将是0,因此Snort将一直执行此循环,直到进程被终止。在不停执行循环的状态下,Snort不会处理新的数据包,也不会发出警报。

Part4 总结

Snort Modbus OT 预处理器中用来计算每个数据包大小的函数ModbusCheckRequestLengths存在整数溢出漏洞,未授权的攻击者能够远程向易受攻击的系统发送精心制作的数据包,从而触发无限while 循环并创建拒绝服务条件。

Part5 修复建议

1.升级到2.9.19或3.1.11.0及以上版本。
2.由 Firepower 管理中心 (FMC) 管理的 FTD 软件,可以禁用 Modbus 预处理器以缓解此漏洞的攻击向量。
———————————————————
获取更多情报
联系我们,获取更多漏洞情报详情及处置建议,让企业远离漏洞威胁。
电话:18511745601
邮箱:shiliangang@andisec.com