diff options
author | Anuj Mittal <anuj.mittal@intel.com> | 2019-07-26 12:47:29 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-07-29 23:50:49 +0100 |
commit | 01b8a8b54bc569e5ef3f5e6fc6abcee365ab25d9 (patch) | |
tree | 733b43eab8490a9e9e5867c0ae38ee5eeacfa243 /meta/recipes-support | |
parent | 9773b89a2f371acbe1e40d7cef6afb6c2a24f9c5 (diff) | |
download | poky-01b8a8b54bc569e5ef3f5e6fc6abcee365ab25d9.tar.gz |
curl: fix CVE-2019-5435 CVE-2019-5436
(From OE-Core rev: 952bfcc3f4b9ee5ba584da0f991f95e80654355a)
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-support')
-rw-r--r-- | meta/recipes-support/curl/curl/CVE-2019-5435.patch | 266 | ||||
-rw-r--r-- | meta/recipes-support/curl/curl/CVE-2019-5436.patch | 30 | ||||
-rw-r--r-- | meta/recipes-support/curl/curl_7.64.1.bb | 2 |
3 files changed, 298 insertions, 0 deletions
diff --git a/meta/recipes-support/curl/curl/CVE-2019-5435.patch b/meta/recipes-support/curl/curl/CVE-2019-5435.patch new file mode 100644 index 0000000000..f72435f608 --- /dev/null +++ b/meta/recipes-support/curl/curl/CVE-2019-5435.patch | |||
@@ -0,0 +1,266 @@ | |||
1 | From 756380f74d58d5a877b26dc21be7b1316b617213 Mon Sep 17 00:00:00 2001 | ||
2 | From: Daniel Stenberg <daniel@haxx.se> | ||
3 | Date: Mon, 29 Apr 2019 08:00:49 +0200 | ||
4 | Subject: [PATCH] CURL_MAX_INPUT_LENGTH: largest acceptable string input size | ||
5 | |||
6 | This limits all accepted input strings passed to libcurl to be less than | ||
7 | CURL_MAX_INPUT_LENGTH (8000000) bytes, for these API calls: | ||
8 | curl_easy_setopt() and curl_url_set(). | ||
9 | |||
10 | The 8000000 number is arbitrary picked and is meant to detect mistakes | ||
11 | or abuse, not to limit actual practical use cases. By limiting the | ||
12 | acceptable string lengths we also reduce the risk of integer overflows | ||
13 | all over. | ||
14 | |||
15 | NOTE: This does not apply to `CURLOPT_POSTFIELDS`. | ||
16 | |||
17 | Test 1559 verifies. | ||
18 | |||
19 | Closes #3805 | ||
20 | |||
21 | Upstream-Status: Backport | ||
22 | CVE: CVE-2019-5435 | ||
23 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
24 | |||
25 | --- | ||
26 | lib/setopt.c | 7 +++++ | ||
27 | lib/urlapi.c | 8 +++++ | ||
28 | lib/urldata.h | 4 +++ | ||
29 | tests/data/Makefile.inc | 2 +- | ||
30 | tests/data/test1559 | 44 ++++++++++++++++++++++++++ | ||
31 | tests/libtest/Makefile.inc | 6 ++-- | ||
32 | tests/libtest/lib1559.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++ | ||
33 | 7 files changed, 146 insertions(+), 3 deletions(-) | ||
34 | create mode 100644 tests/data/test1559 | ||
35 | create mode 100644 tests/libtest/lib1559.c | ||
36 | |||
37 | diff --git a/lib/setopt.c b/lib/setopt.c | ||
38 | index b5f74a9..edf7165 100644 | ||
39 | --- a/lib/setopt.c | ||
40 | +++ b/lib/setopt.c | ||
41 | @@ -61,6 +61,13 @@ CURLcode Curl_setstropt(char **charp, const char *s) | ||
42 | if(s) { | ||
43 | char *str = strdup(s); | ||
44 | |||
45 | + if(str) { | ||
46 | + size_t len = strlen(str); | ||
47 | + if(len > CURL_MAX_INPUT_LENGTH) { | ||
48 | + free(str); | ||
49 | + return CURLE_BAD_FUNCTION_ARGUMENT; | ||
50 | + } | ||
51 | + } | ||
52 | if(!str) | ||
53 | return CURLE_OUT_OF_MEMORY; | ||
54 | |||
55 | diff --git a/lib/urlapi.c b/lib/urlapi.c | ||
56 | index a19867e..822e4b3 100644 | ||
57 | --- a/lib/urlapi.c | ||
58 | +++ b/lib/urlapi.c | ||
59 | @@ -642,6 +642,10 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags) | ||
60 | ************************************************************/ | ||
61 | /* allocate scratch area */ | ||
62 | urllen = strlen(url); | ||
63 | + if(urllen > CURL_MAX_INPUT_LENGTH) | ||
64 | + /* excessive input length */ | ||
65 | + return CURLUE_MALFORMED_INPUT; | ||
66 | + | ||
67 | path = u->scratch = malloc(urllen * 2 + 2); | ||
68 | if(!path) | ||
69 | return CURLUE_OUT_OF_MEMORY; | ||
70 | @@ -1272,6 +1276,10 @@ CURLUcode curl_url_set(CURLU *u, CURLUPart what, | ||
71 | const char *newp = part; | ||
72 | size_t nalloc = strlen(part); | ||
73 | |||
74 | + if(nalloc > CURL_MAX_INPUT_LENGTH) | ||
75 | + /* excessive input length */ | ||
76 | + return CURLUE_MALFORMED_INPUT; | ||
77 | + | ||
78 | if(urlencode) { | ||
79 | const char *i; | ||
80 | char *o; | ||
81 | diff --git a/lib/urldata.h b/lib/urldata.h | ||
82 | index 24187a4..049a34d 100644 | ||
83 | --- a/lib/urldata.h | ||
84 | +++ b/lib/urldata.h | ||
85 | @@ -79,6 +79,10 @@ | ||
86 | */ | ||
87 | #define RESP_TIMEOUT (120*1000) | ||
88 | |||
89 | +/* Max string intput length is a precaution against abuse and to detect junk | ||
90 | + input easier and better. */ | ||
91 | +#define CURL_MAX_INPUT_LENGTH 8000000 | ||
92 | + | ||
93 | #include "cookie.h" | ||
94 | #include "psl.h" | ||
95 | #include "formdata.h" | ||
96 | diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc | ||
97 | index 2eca9c6..3dd234f 100644 | ||
98 | --- a/tests/data/Makefile.inc | ||
99 | +++ b/tests/data/Makefile.inc | ||
100 | @@ -176,7 +176,7 @@ test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \ | ||
101 | test1533 test1534 test1535 test1536 test1537 test1538 \ | ||
102 | test1540 test1541 \ | ||
103 | test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \ | ||
104 | -test1558 test1560 test1561 test1562 \ | ||
105 | +test1558 test1559 test1560 test1561 test1562 \ | ||
106 | \ | ||
107 | test1590 test1591 test1592 \ | ||
108 | \ | ||
109 | diff --git a/tests/data/test1559 b/tests/data/test1559 | ||
110 | new file mode 100644 | ||
111 | index 0000000..cbed6fb | ||
112 | --- /dev/null | ||
113 | +++ b/tests/data/test1559 | ||
114 | @@ -0,0 +1,44 @@ | ||
115 | +<testcase> | ||
116 | +<info> | ||
117 | +<keywords> | ||
118 | +CURLOPT_URL | ||
119 | +</keywords> | ||
120 | +</info> | ||
121 | + | ||
122 | +<reply> | ||
123 | +</reply> | ||
124 | + | ||
125 | +<client> | ||
126 | +<server> | ||
127 | +none | ||
128 | +</server> | ||
129 | + | ||
130 | +# require HTTP so that CURLOPT_POSTFIELDS works as assumed | ||
131 | +<features> | ||
132 | +http | ||
133 | +</features> | ||
134 | +<tool> | ||
135 | +lib1559 | ||
136 | +</tool> | ||
137 | + | ||
138 | +<name> | ||
139 | +Set excessive URL lengths | ||
140 | +</name> | ||
141 | +</client> | ||
142 | + | ||
143 | +# | ||
144 | +# Verify that the test runs to completion without crashing | ||
145 | +<verify> | ||
146 | +<errorcode> | ||
147 | +0 | ||
148 | +</errorcode> | ||
149 | +<stdout> | ||
150 | +CURLOPT_URL 10000000 bytes URL == 43 | ||
151 | +CURLOPT_POSTFIELDS 10000000 bytes data == 0 | ||
152 | +CURLUPART_URL 10000000 bytes URL == 3 | ||
153 | +CURLUPART_SCHEME 10000000 bytes scheme == 3 | ||
154 | +CURLUPART_USER 10000000 bytes user == 3 | ||
155 | +</stdout> | ||
156 | +</verify> | ||
157 | + | ||
158 | +</testcase> | ||
159 | diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc | ||
160 | index e38f481..52b51c5 100644 | ||
161 | --- a/tests/libtest/Makefile.inc | ||
162 | +++ b/tests/libtest/Makefile.inc | ||
163 | @@ -31,8 +31,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \ | ||
164 | lib1534 lib1535 lib1536 lib1537 lib1538 \ | ||
165 | lib1540 lib1541 \ | ||
166 | lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \ | ||
167 | - lib1558 \ | ||
168 | - lib1560 \ | ||
169 | + lib1558 lib1559 lib1560 \ | ||
170 | lib1591 lib1592 \ | ||
171 | lib1900 lib1905 \ | ||
172 | lib2033 | ||
173 | @@ -529,6 +528,9 @@ lib1557_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1557 | ||
174 | lib1558_SOURCES = lib1558.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) | ||
175 | lib1558_LDADD = $(TESTUTIL_LIBS) | ||
176 | |||
177 | +lib1559_SOURCES = lib1559.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) | ||
178 | +lib1559_LDADD = $(TESTUTIL_LIBS) | ||
179 | + | ||
180 | lib1560_SOURCES = lib1560.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) | ||
181 | lib1560_LDADD = $(TESTUTIL_LIBS) | ||
182 | |||
183 | diff --git a/tests/libtest/lib1559.c b/tests/libtest/lib1559.c | ||
184 | new file mode 100644 | ||
185 | index 0000000..2aa3615 | ||
186 | --- /dev/null | ||
187 | +++ b/tests/libtest/lib1559.c | ||
188 | @@ -0,0 +1,78 @@ | ||
189 | +/*************************************************************************** | ||
190 | + * _ _ ____ _ | ||
191 | + * Project ___| | | | _ \| | | ||
192 | + * / __| | | | |_) | | | ||
193 | + * | (__| |_| | _ <| |___ | ||
194 | + * \___|\___/|_| \_\_____| | ||
195 | + * | ||
196 | + * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al. | ||
197 | + * | ||
198 | + * This software is licensed as described in the file COPYING, which | ||
199 | + * you should have received as part of this distribution. The terms | ||
200 | + * are also available at https://curl.haxx.se/docs/copyright.html. | ||
201 | + * | ||
202 | + * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||
203 | + * copies of the Software, and permit persons to whom the Software is | ||
204 | + * furnished to do so, under the terms of the COPYING file. | ||
205 | + * | ||
206 | + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
207 | + * KIND, either express or implied. | ||
208 | + * | ||
209 | + ***************************************************************************/ | ||
210 | +#include "test.h" | ||
211 | + | ||
212 | +#include "testutil.h" | ||
213 | +#include "warnless.h" | ||
214 | +#include "memdebug.h" | ||
215 | + | ||
216 | +#define EXCESSIVE 10*1000*1000 | ||
217 | +int test(char *URL) | ||
218 | +{ | ||
219 | + CURLcode res = 0; | ||
220 | + CURL *curl = NULL; | ||
221 | + char *longurl = malloc(EXCESSIVE); | ||
222 | + CURLU *u; | ||
223 | + (void)URL; | ||
224 | + | ||
225 | + memset(longurl, 'a', EXCESSIVE); | ||
226 | + longurl[EXCESSIVE-1] = 0; | ||
227 | + | ||
228 | + global_init(CURL_GLOBAL_ALL); | ||
229 | + easy_init(curl); | ||
230 | + | ||
231 | + res = curl_easy_setopt(curl, CURLOPT_URL, longurl); | ||
232 | + printf("CURLOPT_URL %d bytes URL == %d\n", | ||
233 | + EXCESSIVE, (int)res); | ||
234 | + | ||
235 | + res = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, longurl); | ||
236 | + printf("CURLOPT_POSTFIELDS %d bytes data == %d\n", | ||
237 | + EXCESSIVE, (int)res); | ||
238 | + | ||
239 | + u = curl_url(); | ||
240 | + if(u) { | ||
241 | + CURLUcode uc = curl_url_set(u, CURLUPART_URL, longurl, 0); | ||
242 | + printf("CURLUPART_URL %d bytes URL == %d\n", | ||
243 | + EXCESSIVE, (int)uc); | ||
244 | + uc = curl_url_set(u, CURLUPART_SCHEME, longurl, CURLU_NON_SUPPORT_SCHEME); | ||
245 | + printf("CURLUPART_SCHEME %d bytes scheme == %d\n", | ||
246 | + EXCESSIVE, (int)uc); | ||
247 | + uc = curl_url_set(u, CURLUPART_USER, longurl, 0); | ||
248 | + printf("CURLUPART_USER %d bytes user == %d\n", | ||
249 | + EXCESSIVE, (int)uc); | ||
250 | + curl_url_cleanup(u); | ||
251 | + } | ||
252 | + | ||
253 | + free(longurl); | ||
254 | + | ||
255 | + curl_easy_cleanup(curl); | ||
256 | + curl_global_cleanup(); | ||
257 | + | ||
258 | + return 0; | ||
259 | + | ||
260 | +test_cleanup: | ||
261 | + | ||
262 | + curl_easy_cleanup(curl); | ||
263 | + curl_global_cleanup(); | ||
264 | + | ||
265 | + return res; /* return the final return code */ | ||
266 | +} | ||
diff --git a/meta/recipes-support/curl/curl/CVE-2019-5436.patch b/meta/recipes-support/curl/curl/CVE-2019-5436.patch new file mode 100644 index 0000000000..eee26ce273 --- /dev/null +++ b/meta/recipes-support/curl/curl/CVE-2019-5436.patch | |||
@@ -0,0 +1,30 @@ | |||
1 | From 2da531b3068e22cf714f001b493a704b2e9b923f Mon Sep 17 00:00:00 2001 | ||
2 | From: Daniel Stenberg <daniel@haxx.se> | ||
3 | Date: Fri, 3 May 2019 22:20:37 +0200 | ||
4 | Subject: [PATCH] tftp: use the current blksize for recvfrom() | ||
5 | |||
6 | bug: https://curl.haxx.se/docs/CVE-2019-5436.html | ||
7 | Reported-by: l00p3r on hackerone | ||
8 | CVE-2019-5436 | ||
9 | |||
10 | Upstream-Status: Backport | ||
11 | CVE: CVE-2019-5436 | ||
12 | Signed-off-by: Anuj Mittal <anuj.mittal@intel.com> | ||
13 | |||
14 | --- | ||
15 | lib/tftp.c | 2 +- | ||
16 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
17 | |||
18 | diff --git a/lib/tftp.c b/lib/tftp.c | ||
19 | index 8b92b7b..289cda2 100644 | ||
20 | --- a/lib/tftp.c | ||
21 | +++ b/lib/tftp.c | ||
22 | @@ -1009,7 +1009,7 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done) | ||
23 | state->sockfd = state->conn->sock[FIRSTSOCKET]; | ||
24 | state->state = TFTP_STATE_START; | ||
25 | state->error = TFTP_ERR_NONE; | ||
26 | - state->blksize = TFTP_BLKSIZE_DEFAULT; | ||
27 | + state->blksize = blksize; | ||
28 | state->requested_blksize = blksize; | ||
29 | |||
30 | ((struct sockaddr *)&state->local_addr)->sa_family = | ||
diff --git a/meta/recipes-support/curl/curl_7.64.1.bb b/meta/recipes-support/curl/curl_7.64.1.bb index 47c28beff6..00c8c5a826 100644 --- a/meta/recipes-support/curl/curl_7.64.1.bb +++ b/meta/recipes-support/curl/curl_7.64.1.bb | |||
@@ -7,6 +7,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=be5d9e1419c4363f4b32037a2d3b7ffa" | |||
7 | 7 | ||
8 | SRC_URI = "http://curl.haxx.se/download/curl-${PV}.tar.bz2 \ | 8 | SRC_URI = "http://curl.haxx.se/download/curl-${PV}.tar.bz2 \ |
9 | file://0001-replace-krb5-config-with-pkg-config.patch \ | 9 | file://0001-replace-krb5-config-with-pkg-config.patch \ |
10 | file://CVE-2019-5435.patch \ | ||
11 | file://CVE-2019-5436.patch \ | ||
10 | " | 12 | " |
11 | 13 | ||
12 | SRC_URI[md5sum] = "790c101927845208a9d7e8c429ddd1b2" | 14 | SRC_URI[md5sum] = "790c101927845208a9d7e8c429ddd1b2" |