Warning message

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

HTTPoxy - est-ce que mon JBoss/tomcat est affecté ?

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

Ce problème a lieu quand vous utilisez CGIServlet dans JBoss EAP, oruTomcat. Toutes les requêtes sortantes générées à partir de la requête d'orgine de l'attaquant vers le script CGI peuvent être redirigées vers un serveur proxy contrôlé par l'attaquant.

Resolution

Utiliser un CGIServlet en production n'est pas conseillé. Il vaut mieux supprimer l'application web en utilisant un CGIServlet si vous en avez la possibilité. Sinon, vous pouvez, malgré tout, ajouter un filtre de servlet à votre application qui retournera une réponse ‘400: Bad Request’ si un en-tête HTTP ayant pour nom « Proxy » est détecté. Exemple :

Ajouter un Servlet Filter à votre war d'application CGI qui filtre les requêtes avec l'en-tête « Proxy ».
REMARQUE: un filtre bloquera toute portion CGI de langage d'implémentation.

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;

/*
 * Voici un exemple de filtre de servlet qui n'autorise pas les requêtes ayant pour en-tête « Proxy »
 */
@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 {
    }

}

Après la compilation du ProxyHeaderFilter.java, il y aura création d'un paquet intitulé com.redhat.prodsec.web.filter containing ProxyHeaderFilter.class.

Créer un jar pour la ProxyHeaderFilter.class par la commande ci-dessous. Cela va générer un jar nommé ProxyHeaderFilter.jar.

jar -cvf ProxyHeaderFilter.jar com

Mettez ce jar dans le dossier WEB-INF/lib de votre application Web. Cela activera le filtre du Servlet dans l'application Web.

Root Cause

Voir HTTPoxy - A CGI application-code vulnerability affecting PHP, Go, Python, and others pour plus d'informations.

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.