Apache mod_proxy_ftp模块Null指针拒绝服务漏洞

漏洞起因
异常条件处理失败错误
 
影响系统
Apache Software Foundation mod_proxy_ftp
Apache Software Foundation Apache 2.2.13
Apache Software Foundation Apache 2.0.63
 
不受影响系统
 
危害
远程攻击者可以利用漏洞使应用程序崩溃。
 
攻击所需条件
攻击者必须访问Apache mod_proxy_ftp。
 
漏洞信息
Apache mod_proxy_ftp是一款用于处理FTP代理请求的Apache模块。
当处理FTP服务器的应答时mod_proxy_ftp存在错误,可导致Null指针应用而造成一个用程序崩溃。
使用./configure –enable-proxy –enable-proxy-ftp启用代理支持,并在httpd.conf文件中设置‘ProxyRequests’选项,如下代码的漏洞可导致应用程序崩溃:
(modules/proxy/proxy_ftp.c):
int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf,
                             char *url, const char *proxyhost,
                             apr_port_t proxyport)
{
    …
    {
        apr_sockaddr_t *data_addr;
        char *data_ip;
        apr_port_t data_port;
        rc = proxy_ftp_command("EPSV" CRLF,
                           r, origin, bb, &ftpmessage);
        if (rc == -1 || rc == 421) {
            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
                                 "Error reading from remote server");
        }
        if (rc != 229 && rc != 500 && rc != 501 && rc != 502) {
            return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
        }
        else if (rc == 229) {
            char *pstr;
            char *tok_cntx;
            …
            …
[1]         pstr = ftpmessage;
            pstr = apr_strtok(pstr, " ", &tok_cntx);    /* separate result code */
            if (pstr != NULL) {
                if (*(pstr + strlen(pstr) + 1) == ‘=’) {
                    pstr += strlen(pstr) + 2;
                }
                else {
                    pstr = apr_strtok(NULL, "(", &tok_cntx);    /* separate address &
                                                                 * port params */
                    if (pstr != NULL)
                        pstr = apr_strtok(NULL, ")", &tok_cntx);
                }
            }
[2]         if (pstr) {
                apr_sockaddr_t *epsv_addr;
                data_port = atoi(pstr + 3);
                ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                       "proxy: FTP: EPSV contacting remote host on port %d",
                             data_port);
                …
                …
            }
            else {
[3]             apr_socket_close(data_sock);
            }
        …
}
#1行解析EPSV FTP服务器应答,如果FTP服务器发送特殊构建的EPSV应答,‘pstr’就会等于Null,行3会使用未初始化‘data_sock’变量执行。
Intevydis公司发布的商业漏洞利用工具已经提供相关的攻击信息。
 
测试方法
 
厂商解决方案
目前没有解决方案提供:
http://httpd.apache.org/docs/2.0/mod/mod_proxy_ftp.html
 
漏洞提供者
Evgeny Legerov

发表评论?

0 条评论。

发表评论