VYPR
Low severity3.7NVD Advisory· Published Jan 8, 2016· Updated May 6, 2026

CVE-2015-7519

CVE-2015-7519

Description

agent/Core/Controller/SendRequest.cpp in Phusion Passenger before 4.0.60 and 5.0.x before 5.0.22, when used in Apache integration mode or in standalone mode without a filtering proxy, allows remote attackers to spoof headers passed to applications by using an _ (underscore) character instead of a - (dash) character in an HTTP header, as demonstrated by an X_User header.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
passengerRubyGems
< 4.0.604.0.60
passengerRubyGems
>= 5.0.0, < 5.0.225.0.22

Affected products

28
  • cpe:2.3:a:phusionpassenger:phusion_passenger:*:*:*:*:*:*:*:*+ 27 more
    • cpe:2.3:a:phusionpassenger:phusion_passenger:*:*:*:*:*:*:*:*range: <=4.0.59
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.0:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.0:beta1:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.0:beta2:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.0:beta3:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.0:rc1:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.0:rc2:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.1:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.10:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.11:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.12:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.13:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.14:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.15:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.16:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.17:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.18:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.19:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.2:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.20:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.21:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.3:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.4:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.5:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.6:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.7:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.8:*:*:*:*:*:*:*
    • cpe:2.3:a:phusionpassenger:phusion_passenger:5.0.9:*:*:*:*:*:*:*

Patches

1
ddb8ecc4ebf2

Fix CVE-2015-7519 header collision vulnerability

https://github.com/phusion/passengerHongli Lai (Phusion)Dec 7, 2015via ghsa
2 files changed · +40 6
  • CHANGELOG+1 0 modified
    @@ -1,6 +1,7 @@
     Release 5.0.22
     --------------
     
    + * Fixes a header collision vulnerability (CVE-2015-7519, medium severity). Please see our blog for detailed vulnerability description and advisory. Thanks to the SUSE security team for reporting this issue.
      * [Apache] Fixes compatibility with Apache 2.4.17's mod_autoindex. Fix contributed by Eric Covener. Closes GH-1642.
      * [Standalone] Passenger Standalone now [accepts configuration options from environment variables](https://www.phusionpassenger.com/library/config/standalone/intro.html). This makes using Passenger Standalone significantly easier on Heroku or on systems that follow the 12-factor principle. Closes GH-1661.
      * [Standalone] The Nginx configuration template has been cleaned up. It is now significantly easier to edit the Nginx configuration template without breaking compatibility with future versions.
    
  • src/agent/Core/Controller/SendRequest.cpp+39 6 modified
    @@ -204,6 +204,33 @@ Controller::sendBodyToAppWhenAppSinkIdle(Channel *_channel, unsigned int size) {
     	}
     }
     
    +static bool
    +isAlphaNum(char ch) {
    +	return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
    +}
    +
    +/**
    + * For CGI, alphanum headers with optional dashes are mapped to UPP3R_CAS3. This
    + * function can be used to reject non-alphanum/dash headers that would end up with
    + * the same mapping (e.g. upp3r_cas3 and upp3r-cas3 would end up the same, and
    + * potentially collide each other in the receiving application). This is
    + * used to fix CVE-2015-7519.
    + */
    +static bool
    +containsNonAlphaNumDash(const LString &s) {
    +	const LString::Part *part = s.start;
    +	while (part != NULL) {
    +		for (unsigned int i = 0; i < part->size; i++) {
    +			const char start = part->data[i];
    +			if (start != '-' && !isAlphaNum(start)) {
    +				return true;
    +			}
    +		}
    +		part = part->next;
    +	}
    +	return false;
    +}
    +
     static void
     httpHeaderToScgiUpperCase(unsigned char *data, unsigned int size) {
     	static const boost::uint8_t toUpperMap[256] = {
    @@ -529,12 +556,18 @@ Controller::constructHeaderForSessionProtocol(Request *req, char * restrict buff
     
     	ServerKit::HeaderTable::Iterator it(req->headers);
     	while (*it != NULL) {
    -		if ((it->header->hash == HTTP_CONTENT_LENGTH.hash()
    -			|| it->header->hash == HTTP_CONTENT_TYPE.hash()
    -			|| it->header->hash == HTTP_CONNECTION.hash())
    -		 && (psg_lstr_cmp(&it->header->key, P_STATIC_STRING("content-type"))
    -			|| psg_lstr_cmp(&it->header->key, P_STATIC_STRING("content-length"))
    -			|| psg_lstr_cmp(&it->header->key, P_STATIC_STRING("connection"))))
    +		// This header-skipping is not accounted for in determineHeaderSizeForSessionProtocol(), but
    +		// since we are only reducing the size it just wastes some mem bytes.
    +		if ((
    +				(it->header->hash == HTTP_CONTENT_LENGTH.hash()
    +						|| it->header->hash == HTTP_CONTENT_TYPE.hash()
    +						|| it->header->hash == HTTP_CONNECTION.hash()
    +				) && (psg_lstr_cmp(&it->header->key, P_STATIC_STRING("content-type"))
    +						|| psg_lstr_cmp(&it->header->key, P_STATIC_STRING("content-length"))
    +						|| psg_lstr_cmp(&it->header->key, P_STATIC_STRING("connection"))
    +				)
    +			) || containsNonAlphaNumDash(it->header->key)
    +		   )
     		{
     			it.next();
     			continue;
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

13

News mentions

0

No linked articles in our index yet.