]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
content_encoding: return error on too many compression steps
authorDaniel Stenberg <daniel@haxx.se>
Mon, 16 May 2022 14:28:13 +0000 (16:28 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 25 Jun 2022 20:14:21 +0000 (22:14 +0200)
The max allowed steps is arbitrarily set to 5.

Bug: https://curl.se/docs/CVE-2022-32206.html
CVE-2022-32206
Reported-by: Harry Sintonen
Closes #9049

lib/content_encoding.c

index c5591ca48ac78dd1ae673c47f69b0a9fda2280d0..95ba48a2dd5631711c4defbfdd5e874402275a74 100644 (file)
@@ -1028,12 +1028,16 @@ static const struct content_encoding *find_encoding(const char *name,
   return NULL;
 }
 
+/* allow no more than 5 "chained" compression steps */
+#define MAX_ENCODE_STACK 5
+
 /* Set-up the unencoding stack from the Content-Encoding header value.
  * See RFC 7231 section 3.1.2.2. */
 CURLcode Curl_build_unencoding_stack(struct Curl_easy *data,
                                      const char *enclist, int maybechunked)
 {
   struct SingleRequest *k = &data->req;
+  int counter = 0;
 
   do {
     const char *name;
@@ -1068,6 +1072,11 @@ CURLcode Curl_build_unencoding_stack(struct Curl_easy *data,
       if(!encoding)
         encoding = &error_encoding;  /* Defer error at stack use. */
 
+      if(++counter >= MAX_ENCODE_STACK) {
+        failf(data, "Reject response due to %u content encodings",
+              counter);
+        return CURLE_BAD_CONTENT_ENCODING;
+      }
       /* Stack the unencoding stage. */
       writer = new_unencoding_writer(data, encoding, k->writer_stack);
       if(!writer)