Overview
Web servers running in a CGI or CGI-like context may assign client request Proxy header values to internal HTTP_PROXY environment variables. This vulnerability can be leveraged to conduct man-in-the-middle (MITM) attacks on internal subrequests or to direct the server to initiate connections to arbitrary hosts.
Description
| CWE-807: Reliance on Untrusted Inputs in a Security Decision, CWE-454: External Initialization of Trusted Variables or Data Stores Web servers running in a CGI or CGI-like context may assign client request Proxy header values to internal HTTP_PROXY environment variables. The vulnerable behavior is the result of a naming convention for meta-variables, defined in RFC 3876, which leads to a name collision: "The HTTP header field name is converted to upper case, has all occurrences of "-" replaced with "_" and has "HTTP_" prepended to give the meta-variable name." 
 By sending a specially crafted request to a vulnerable server, a remote, unauthenticated attacker may be able to conduct MITM attacks on internal server subrequests or direct the server to initiate connections to arbitrary hosts. For more information, refer to httpoxy.org. | 
Impact
| A remote, unauthenticated attacker may be able to conduct MITM attacks on internal server subrequests or direct the server to initiate connections to arbitrary hosts. | 
Solution
| Apply an update | 
| Filter Proxy request headers 
 If you are using mod_security, you can use a rule like (vary the action to taste): 
 SecRule &REQUEST_HEADERS:Proxy "@gt 0" "id:1000005,log,deny,msg:'httpoxy denied'" Refer to Apache's response for more information. HAProxy httprequest delheader Proxy lighttpd <= 1.4.40 (reject requests containing "Proxy" header) Create "/path/to/deny-proxy.lua", read-only to lighttpd, with content: 
 
 magnet.attract-raw-url-to = ( "/path/to/deny-proxy.lua" ) lighttpd2 (development) (strip "Proxy" header from request) Add to lighttpd.conf: 
 Nginx/FastCGI Use this to block the Proxy header from being passed on to PHPFPM, PHPPM, etc. 
 Nginx with proxy_pass The following setting should work for people who are using "proxy_pass" with nginx: proxy_set_header Proxy ; Microsoft has provided the following guidance for IIS servers utilizing affected third-party frameworks: Microsoft IIS Mitigation steps: Update apphost.config with the following rule: <system.webServer> <rewrite> <rules> <rule name=3D"Erase HTTP_PROXY" patternSyntax=3D"Wildcard"> <match url=3D"*.*" /> <serverVariables> <set name=3D"HTTP_PROXY" value=3D /> </serverVariables> <action type=3D"None" /> </rule> </rules> </rewrite> </system.webServer> | 
Vendor Information
CVSS Metrics
| Group | Score | Vector | 
|---|---|---|
| Base | 5.1 | AV:N/AC:H/Au:N/C:P/I:P/A:P | 
| Temporal | 4.6 | E:POC/RL:ND/RC:C | 
| Environmental | 1.1 | CDP:ND/TD:L/CR:ND/IR:ND/AR:ND | 
References
Acknowledgements
Thanks to Dominic Scheirlinck and Scott Geary of Vend for reporting this vulnerability.
This document was written by Joel Land.
Other Information
| CVE IDs: | CVE-2016-5385, CVE-2016-5386, CVE-2016-5387, CVE-2016-5388, CVE-2016-1000109, CVE-2016-1000110 | 
| Date Public: | 2016-07-18 | 
| Date First Published: | 2016-07-18 | 
| Date Last Updated: | 2016-07-19 17:04 UTC | 
| Document Revision: | 66 |