安全研究

安全漏洞
Fenice远程溢出及拒绝服务漏洞

发布日期:2006-04-24
更新日期:2006-04-24

受影响系统:
(LS)3 Fenice 1.10
描述:
BUGTRAQ  ID: 17678

Fenice是符合IETF标准的多媒体流服务器。

Fenice的实现上存在多个漏洞,远程攻击者可能利用这些漏洞在服务器上执行任意指令或导致拒绝服务攻击。

-------------------------------
A] parse_url缓冲区溢出
-------------------------------

Fenice的RTSP模块使用parse_url函数解析URI中的服务器、端口和文件名。这个函数使用一些strcpy调用填充主函数所传送的服务器和file_name缓冲区,这就允许攻击者利用缓冲区溢出漏洞执行恶意指令。

在rtsp/parse_url.c中:

int parse_url(const char *url, char *server, unsigned short *port, char *file_name)
// Note: this routine comes from OMS
{
        /* expects format '[rtsp://server[:port/]]filename' */

    ...
                        strcpy(server, token);
    ...
                        token = strtok(NULL, " ");
                        if (token)
                                strcpy(file_name, token);
    ...
                char *token = strtok(full, " \t\n");
                if (token) {
                        strcpy(file_name, token);
                        server[0] = '\0';
                        valid_url = 1;
                }
        }
        free(full);
        return valid_url;
}

------------------------
B] RTSP_msg_len崩溃
------------------------

处理客户端发送的Content-Length字段的函数没有检查这个参数的大小/符号。在RTSP_msg_len函数中ml变量用于包含首部中的字节数,bl变量用于包含Content-Length值。当到达客户端请求的末尾时,程序将bl添加到ml。如果bl(Content-Length)是一个很大的值,如2147483647,ml就会变为负数,这样就可以绕过之后的ml> rtsp->in_size检查,导致访问无效的内存区,服务器会崩溃。

在rtsp/RTSP_msg_len.c中:

void RTSP_msg_len(int *hdr_len, int *body_len, RTSP_buffer * rtsp)
// This routine is from OMS.
{
        int eom; /* end of message found */
        int mb; /* message body exists */
        int tc; /* terminator count */
        int ws; /* white space */
        int ml; /* total message length including any message body */
        int bl; /* message body length */
        char c; /* character */
        char *p;

        eom = mb = ml = bl = 0;
        while (ml <= rtsp->in_size) {
        ...
                if (eom) {
                        ml += bl; /* add in the message body length */
                        break; /* all done finding the end of the message. */
                }
                if (ml >= rtsp->in_size)
                        break;
        ...
                                if (sscanf(&(rtsp->in_buffer[ml]), "%d", &bl) != 1) {
                                        fnc_log(FNC_LOG_FATAL,"invalid ContentLength encountered in message.");
                                        exit(-1);
                                }
                        }
                }
        }

        if (ml > rtsp->in_size) {
                fnc_log(FNC_LOG_FATAL,"buffer did not contain the entire RTSP message.");
                exit(-1);
        }
    ...
        *hdr_len = ml - bl;
        for (tc = rtsp->in_size - ml, p = &(rtsp->in_buffer[ml]); tc && (*p == '\0'); p++, bl++, tc--);
        *body_len = bl;
}

<*来源:Luigi Auriemma (aluigi@pivx.com
  
  链接:http://archives.neohapsis.com/archives/bugtraq/2006-04/0496.html
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

A] GET /[about 320 'a's] HTTP/1.0

B] GET / HTTP/1.0
    Content-Length: 4294967295

建议:
厂商补丁:

(LS)3
-----
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://streaming.polito.it/server

浏览次数:3326
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障