mirror of
https://github.com/curl/curl.git
synced 2025-02-17 14:59:45 +08:00
transfer: redirects to other protocols or ports clear auth
... unless explicitly permitted. Bug: https://curl.se/docs/CVE-2022-27774.html Reported-by: Harry Sintonen Closes #8748
This commit is contained in:
parent
08b8ef4e72
commit
620ea21410
@ -1611,10 +1611,57 @@ CURLcode Curl_follow(struct Curl_easy *data,
|
|||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
|
uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
|
||||||
if(uc)
|
if(uc)
|
||||||
return Curl_uc_to_curlcode(uc);
|
return Curl_uc_to_curlcode(uc);
|
||||||
|
|
||||||
|
/* Clear auth if this redirects to a different port number or protocol,
|
||||||
|
unless permitted */
|
||||||
|
if(!data->set.allow_auth_to_other_hosts && (type != FOLLOW_FAKE)) {
|
||||||
|
char *portnum;
|
||||||
|
int port;
|
||||||
|
bool clear = FALSE;
|
||||||
|
|
||||||
|
if(data->set.use_port && data->state.allow_port)
|
||||||
|
/* a custom port is used */
|
||||||
|
port = (int)data->set.use_port;
|
||||||
|
else {
|
||||||
|
uc = curl_url_get(data->state.uh, CURLUPART_PORT, &portnum,
|
||||||
|
CURLU_DEFAULT_PORT);
|
||||||
|
if(uc) {
|
||||||
|
free(newurl);
|
||||||
|
return Curl_uc_to_curlcode(uc);
|
||||||
|
}
|
||||||
|
port = atoi(portnum);
|
||||||
|
free(portnum);
|
||||||
|
}
|
||||||
|
if(port != data->info.conn_remote_port) {
|
||||||
|
infof(data, "Clear auth, redirects to port from %u to %u",
|
||||||
|
data->info.conn_remote_port, port);
|
||||||
|
clear = TRUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char *scheme;
|
||||||
|
const struct Curl_handler *p;
|
||||||
|
uc = curl_url_get(data->state.uh, CURLUPART_SCHEME, &scheme, 0);
|
||||||
|
if(uc) {
|
||||||
|
free(newurl);
|
||||||
|
return Curl_uc_to_curlcode(uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
p = Curl_builtin_scheme(scheme);
|
||||||
|
if(p && (p->protocol != data->info.conn_protocol)) {
|
||||||
|
infof(data, "Clear auth, redirects scheme from %s to %s",
|
||||||
|
data->info.conn_scheme, scheme);
|
||||||
|
clear = TRUE;
|
||||||
|
}
|
||||||
|
free(scheme);
|
||||||
|
}
|
||||||
|
if(clear) {
|
||||||
|
Curl_safefree(data->state.aptr.user);
|
||||||
|
Curl_safefree(data->state.aptr.passwd);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(type == FOLLOW_FAKE) {
|
if(type == FOLLOW_FAKE) {
|
||||||
|
Loading…
Reference in New Issue
Block a user