cookie: reject cookies with "control bytes"

Rejects 0x01 - 0x1f (except 0x09) plus 0x7f

Reported-by: Axel Chong

Bug: https://curl.se/docs/CVE-2022-35252.html

CVE-2022-35252

Closes #9381
This commit is contained in:
Daniel Stenberg 2022-08-29 00:09:17 +02:00
Родитель 74e156d00f
Коммит 8dfc93e573
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
1 изменённых файлов: 29 добавлений и 0 удалений

Просмотреть файл

@ -441,6 +441,30 @@ static bool bad_domain(const char *domain)
return TRUE;
}
/*
RFC 6265 section 4.1.1 says a server should accept this range:
cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
But Firefox and Chrome as of June 2022 accept space, comma and double-quotes
fine. The prime reason for filtering out control bytes is that some HTTP
servers return 400 for requests that contain such.
*/
static int invalid_octets(const char *p)
{
/* Reject all bytes \x01 - \x1f (*except* \x09, TAB) + \x7f */
static const char badoctets[] = {
"\x01\x02\x03\x04\x05\x06\x07\x08\x0a"
"\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14"
"\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x7f"
};
size_t vlen, len;
/* scan for all the octets that are *not* in cookie-octet */
len = strcspn(p, badoctets);
vlen = strlen(p);
return (len != vlen);
}
/*
* Curl_cookie_add
*
@ -595,6 +619,11 @@ Curl_cookie_add(struct Curl_easy *data,
badcookie = TRUE;
break;
}
if(invalid_octets(whatptr) || invalid_octets(name)) {
infof(data, "invalid octets in name/value, cookie dropped");
badcookie = TRUE;
break;
}
}
else if(!len) {
/*