Skip to content

Commit 8dab7d0

Browse files
bukkaremicollet
authored andcommitted
Fix GHSA-c5f2-jwm7-mmq2: stream HTTP fulluri CRLF injection
(cherry picked from commit 426a6d4539ebee34879ac5de857036bb6ff0e732) (cherry picked from commit bc1f192) (cherry picked from commit 8d130e1) (cherry picked from commit 494de65) (cherry picked from commit dcb89ed) (cherry picked from commit 1178705) (cherry picked from commit 59bfc16)
1 parent 46d6c59 commit 8dab7d0

File tree

2 files changed

+40
-6
lines changed

2 files changed

+40
-6
lines changed

ext/standard/http_fopen_wrapper.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
182182
return NULL;
183183
}
184184

185+
/* Should we send the entire path in the request line, default to no. */
186+
if (context && (tmpzval = php_stream_context_get_option(context, "http", "request_fulluri")) != NULL) {
187+
request_fulluri = zend_is_true(tmpzval);
188+
}
189+
185190
use_ssl = resource->scheme && (strlen(resource->scheme) > 4) && resource->scheme[4] == 's';
186191
/* choose default ports */
187192
if (use_ssl && resource->port == 0)
@@ -201,6 +206,13 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
201206
}
202207
}
203208

209+
if (request_fulluri && (strchr(path, '\n') != NULL || strchr(path, '\r') != NULL)) {
210+
php_stream_wrapper_log_error(wrapper, options, "HTTP wrapper full URI path does not allow CR or LF characters");
211+
php_url_free(resource);
212+
efree(transport_string);
213+
return NULL;
214+
}
215+
204216
if (context && (tmpzval = php_stream_context_get_option(context, wrapper->wops->label, "timeout")) != NULL) {
205217
double d = zval_get_double(tmpzval);
206218
#ifndef PHP_WIN32
@@ -387,12 +399,6 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
387399
strncpy(scratch, "GET ", scratch_len);
388400
}
389401

390-
/* Should we send the entire path in the request line, default to no. */
391-
if (!request_fulluri && context &&
392-
(tmpzval = php_stream_context_get_option(context, "http", "request_fulluri")) != NULL) {
393-
request_fulluri = zend_is_true(tmpzval);
394-
}
395-
396402
if (request_fulluri) {
397403
/* Ask for everything */
398404
strcat(scratch, path);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
GHSA-c5f2-jwm7-mmq2 (Configuring a proxy in a stream context might allow for CRLF injection in URIs)
3+
--INI--
4+
allow_url_fopen=1
5+
--CONFLICTS--
6+
server
7+
--FILE--
8+
<?php
9+
$serverCode = <<<'CODE'
10+
echo $_SERVER['REQUEST_URI'];
11+
CODE;
12+
13+
include __DIR__."/../../../../sapi/cli/tests/php_cli_server.inc";
14+
php_cli_server_start($serverCode, null);
15+
16+
$host = PHP_CLI_SERVER_ADDRESS;
17+
$userinput = "index.php HTTP/1.1\r\nHost: $host\r\n\r\nGET /index2.php HTTP/1.1\r\nHost: $host\r\n\r\nGET /index.php";
18+
$context = stream_context_create(['http' => ['proxy' => 'tcp://' . $host, 'request_fulluri' => true]]);
19+
echo file_get_contents("http://$host/$userinput", false, $context);
20+
?>
21+
--EXPECTF--
22+
Warning: file_get_contents(http://localhost:%d/index.php HTTP/1.1
23+
Host: localhost:%d
24+
25+
GET /index2.php HTTP/1.1
26+
Host: localhost:%d
27+
28+
GET /index.php): failed to open stream: HTTP wrapper full URI path does not allow CR or LF characters in %s on line %d

0 commit comments

Comments
 (0)