漏洞描述
Asterisk是一款开放源码的软件PBX,支持各种VoIP协议和设备。
Asterisk包含的h264_format_attr_sdp_parse()函数(res/res_format_attr_h264.c)存在一个溢出条件。问题是由于在处理H.264视频的媒体属性时没有正确校验用户提交的输入,允许攻击者提交特制的SDP标头,远程攻击者可以利用漏洞触发基于栈的缓冲区溢出,可以应用程序上下文执行任意代码。
某些告警监测设备产生原因
char sps[H264_MAX_SPS_PPS_SIZE], pps[H264_MAX_SPS_PPS_SIZE];
if (sscanf(attrib, "profile-level-id=%lx", &val2) == 1) {
format_attr->format_attr[H264_ATTR_KEY_PROFILE_IDC] = ((val2 >> 16) & 0xFF);
format_attr->format_attr[H264_ATTR_KEY_PROFILE_IOP] = ((val2 >> 8) & 0xFF);
format_attr->format_attr[H264_ATTR_KEY_LEVEL] = (val2 & 0xFF);
} else if (sscanf(attrib, "sprop-parameter-sets=%[^','],%s", sps, pps) == 2) {
在上述代码中存在函数sprop-parameter-sets,正常我们在使用上述函数的时候我们需要我们需要将字符串的长度限制为堆栈缓冲区的长度 - 1。
所以在某些告警设备的留恋告警包中我们可以仔细查找一下,是否存在sprop-parameter-sets后面的参数(应该是二进制的)我们从二进制转换为十进制是不是不是-1,如果不是-1,就证明告警产生。
修复建议
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
Index of /pub/security