Asterisk SIP T.38 SDP解析远程栈溢出漏洞

2007-04-27T00:00:00
ID SSV:1692
Type seebug
Reporter Root
Modified 2007-04-27T00:00:00

Description

Asterisk是一款PBX系统的软件,运行在Linux系统上,支持使用SIP、IAX、H323协议进行IP通话。

Asterisk的SIP/SDP处理器中存在多个远程栈溢出漏洞,远程攻击者可能利用此漏洞控制服务器。

如果所发送SIP报文中的SDP数据包含有超长的T38参数的话,就可以触发这个溢出,导致执行任意代码。这个漏洞是由chan_sip.c文件中的process_sdp函数调用sscanf所导致的:

else if ((sscanf(a, "T38FaxRateManagement:%s", s) == 1)) {

found = 1;

if (option_debug > 2)

ast_log(LOG_DEBUG, "RateMangement: %s\n", s);

if (!strcasecmp(s, "localTCF"))

peert38capability |=

T38FAX_RATE_MANAGEMENT_LOCAL_TCF;

else if (!strcasecmp(s, "transferredTCF"))

peert38capability |=

T38FAX_RATE_MANAGEMENT_TRANSFERED_TCF;

上述代码试图从SIP报文中的SDP读取T38FaxRateManagement:选项,然后将后续的字符串拷贝到s。由于对这个字符串没有执行长度检查,因此可以写过s变量的边界,覆盖栈中临近的缓冲区。s在这个函数中被定义为仅256字节长的字符数组。

SIP/SDP处理器在处理SIP报文中SDP数据的超长T38FaxUdpEC参数时也存在类似的栈溢出:

else if ((sscanf(a, "T38FaxUdpEC:%s", s) == 1)) {

found = 1;

if (option_debug > 2)

ast_log(LOG_DEBUG, "UDP EC: %s\n", s);

if (!strcasecmp(s, "t38UDPRedundancy")) {

peert38capability |=

T38FAX_UDP_EC_REDUNDANCY;

ast_udptl_set_error_correction_scheme(p->udptl,

UDPTL_ERROR_CORRECTION_REDUNDANCY);

试图从SIP报文的SDP读取T38FaxUdpEC时会触发这个栈溢出,导致执行任意指令。

Asterisk Asterisk 1.4.x Asterisk AsteriskNOW <= Beta5 Asterisk Appliance Developer Kit 0.x.x 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

<a href="ftp://ftp.digium.com/pub/telephony/asterisk" target="_blank">ftp://ftp.digium.com/pub/telephony/asterisk</a> <a href="http://www.asterisknow.org/" target="_blank">http://www.asterisknow.org/</a> <a href="ftp://ftp.digium.com/pub/telephony/aadk" target="_blank">ftp://ftp.digium.com/pub/telephony/aadk</a>

                                        
                                            
                                                INVITE&nbsp;sip:200@127.0.0.1&nbsp;SIP/2.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs