Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

HTTPoxy - JBoss や tomcat は影響を受けますか?

Solution Verified - Updated -

Environment

  • Red Hat JBoss Enterprise Application Platform (EAP) 6.x
  • Red Hat JBoss Enterprise Application Platform (EAP) 5.x
  • Red Hat JBoss Enterprise Web Server (EWS) 2.x
    • Tomcat 6
  • Red Hat JBoss Web Server (JWS) 3.x
    • Tomcat 6
    • Tomcat 7

Issue

JBoss EAP または Tomcat で CGIServlet を使用している場合、この問題の影響を受けます。攻撃者の元のリクエストから CGI スクリプトへ生成された送信リクエストはすべて攻撃者が制御するプロキシーにリダイレクトされる可能性があります。

Resolution

本番環境での CGIServlet の使用は推奨されません。可能な場合は CGIServlet を使用する Web アプリケーションを削除することが推奨されます。この代わりに、Proxy という名前の HTTP ヘッダーを検出したときに「400: Bad Request」を返すサーブレットフィルダーをアプリケーションに追加することもできます。例を以下に示します。

Proxy ヘッダーがあるリクエストをフィルターする サーブレットフィルター を CGI アプリケーション war に追加します。
注記: フィルターによってすべての CGI 実装の言語実装がブロックされます。

package com.redhat.prodsec.web.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebFilter;

/*
 *  This is a sample servlet filter to disallow requests with "Proxy" http header
 */
@WebFilter("/*")
public class ProxyHeaderFilter implements Filter {

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) req;
        Enumeration<String> headerNames = httpRequest.getHeaderNames();


        if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String headerName = headerNames.nextElement();
                    if(headerName.equalsIgnoreCase("Proxy"))
                        ((HttpServletResponse) res).sendError(HttpServletResponse.SC_BAD_REQUEST);
                }
        }

        chain.doFilter(req, res);

    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
    }

}

ProxyHeaderFilter.java のコンパイル後、roxyHeaderFilter.class が含まれる com.redhat.prodsec.web.filter という名前のパッケージが作成されます。

以下のコマンドを使用して ProxyHeaderFilter.class の jar を作成します。これにより、ProxyHeaderFilter.jar という jar が生成されます。

jar -cvf ProxyHeaderFilter.jar com

この jar を Web アプリケーションの WEB-INF/lib フォルダーに置きます。これにより、Web アプリケーションのサーブレットフィルターが有効になります。

Root Cause

詳細は HTTPoxy - CGI での HTTP_PROXY 変数名の競合 を参照してください。

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.