漏洞起因
异常条件处理失败错误
影响系统
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 条评论。