diff options
author | Yuanjie Huang <yuanjie.huang@windriver.com> | 2016-04-27 02:32:55 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-05-11 12:37:06 +0100 |
commit | 49ce0e7d4a7bb3223aa33188fc987d651334ffe5 (patch) | |
tree | bb17b1ff2e9b415b1f6601a8a3df91e488f7aa58 /meta/recipes-core | |
parent | 6b2102cd59c1ac48b8550dbbea0b83eada7e7b32 (diff) | |
download | poky-49ce0e7d4a7bb3223aa33188fc987d651334ffe5.tar.gz |
glibc: Fix CVE-2015-8778
CVE: CVE-2015-8778
Improve check against integer wraparound in hcreate_r [BZ #18240]
This is an integer overflow in hcreate and hcreate_r which can result in
an out-of-bound memory access. This could lead to application crashes
or, potentially, arbitrary code execution.
Upstream-Status: Backport [2.23]
(cherry-picked from commit bae7c7c7, 4bd228c8)
(From OE-Core rev: 71b051f51a44dad1fdca7ca6b3552d0aebdc91d3)
Signed-off-by: Yuanjie Huang <yuanjie.huang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-core')
-rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2015-8778.patch | 199 | ||||
-rw-r--r-- | meta/recipes-core/glibc/glibc_2.22.bb | 1 |
2 files changed, 200 insertions, 0 deletions
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-8778.patch b/meta/recipes-core/glibc/glibc/CVE-2015-8778.patch new file mode 100644 index 0000000000..c505c10c89 --- /dev/null +++ b/meta/recipes-core/glibc/glibc/CVE-2015-8778.patch | |||
@@ -0,0 +1,199 @@ | |||
1 | From d0f05d1e39adb336a8bbccbc276a344e6ff427e3 Mon Sep 17 00:00:00 2001 | ||
2 | From: Florian Weimer <fweimer@redhat.com> | ||
3 | Date: Thu, 28 Jan 2016 13:59:11 +0100 | ||
4 | Subject: [PATCH] Improve check against integer wraparound in hcreate_r [BZ | ||
5 | #18240] | ||
6 | |||
7 | CVE: CVE-2015-8778 | ||
8 | |||
9 | Improve check against integer wraparound in hcreate_r [BZ #18240] | ||
10 | |||
11 | This is an integer overflow in hcreate and hcreate_r which can result in | ||
12 | an out-of-bound memory access. This could lead to application crashes | ||
13 | or, potentially, arbitrary code execution. | ||
14 | |||
15 | Upstream-Status: Backport [2.23] | ||
16 | (cherry-picked from commit bae7c7c7, 4bd228c8) | ||
17 | |||
18 | Signed-off-by: Yuanjie Huang <yuanjie.huang@windriver.com> | ||
19 | --- | ||
20 | ChangeLog | 6 +++++ | ||
21 | NEWS | 2 +- | ||
22 | misc/Makefile | 2 +- | ||
23 | misc/bug18240.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
24 | misc/hsearch_r.c | 28 ++++++++++++--------- | ||
25 | 5 files changed, 100 insertions(+), 13 deletions(-) | ||
26 | create mode 100644 misc/bug18240.c | ||
27 | |||
28 | diff --git a/ChangeLog b/ChangeLog | ||
29 | index b7701d1..a9dc8a2 100644 | ||
30 | --- a/ChangeLog | ||
31 | +++ b/ChangeLog | ||
32 | @@ -1,3 +1,9 @@ | ||
33 | +2016-01-27 Paul Eggert <eggert@cs.ucla.edu> | ||
34 | + | ||
35 | + [BZ #18240] | ||
36 | + * misc/hsearch_r.c (isprime, __hcreate_r): Protect against | ||
37 | + unsigned int wraparound. | ||
38 | + | ||
39 | 2016-02-15 Carlos O'Donell <carlos@redhat.com> | ||
40 | |||
41 | [BZ #18665] | ||
42 | diff --git a/NEWS b/NEWS | ||
43 | index cda7a73..fd77c27 100644 | ||
44 | --- a/NEWS | ||
45 | +++ b/NEWS | ||
46 | @@ -9,7 +9,7 @@ Version 2.22.1 | ||
47 | |||
48 | * The following bugs are resolved with this release: | ||
49 | |||
50 | - 18778, 18781, 18787, 17905. | ||
51 | + 18240, 18778, 18781, 18787, 17905. | ||
52 | |||
53 | Version 2.22 | ||
54 | |||
55 | diff --git a/misc/Makefile b/misc/Makefile | ||
56 | index e6b7c23..463a238 100644 | ||
57 | --- a/misc/Makefile | ||
58 | +++ b/misc/Makefile | ||
59 | @@ -83,7 +83,7 @@ install-lib := libg.a | ||
60 | gpl2lgpl := error.c error.h | ||
61 | |||
62 | tests := tst-dirname tst-tsearch tst-fdset tst-mntent tst-hsearch \ | ||
63 | - tst-pselect tst-insremque tst-mntent2 bug-hsearch1 | ||
64 | + tst-pselect tst-insremque tst-mntent2 bug-hsearch1 bug18240 | ||
65 | tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) += tst-error1 | ||
66 | tests-$(OPTION_EGLIBC_FCVT) += tst-efgcvt | ||
67 | ifeq ($(run-built-tests),yes) | ||
68 | diff --git a/misc/bug18240.c b/misc/bug18240.c | ||
69 | new file mode 100644 | ||
70 | index 0000000..4b26865 | ||
71 | --- /dev/null | ||
72 | +++ b/misc/bug18240.c | ||
73 | @@ -0,0 +1,75 @@ | ||
74 | +/* Test integer wraparound in hcreate. | ||
75 | + Copyright (C) 2016 Free Software Foundation, Inc. | ||
76 | + This file is part of the GNU C Library. | ||
77 | + | ||
78 | + The GNU C Library is free software; you can redistribute it and/or | ||
79 | + modify it under the terms of the GNU Lesser General Public | ||
80 | + License as published by the Free Software Foundation; either | ||
81 | + version 2.1 of the License, or (at your option) any later version. | ||
82 | + | ||
83 | + The GNU C Library is distributed in the hope that it will be useful, | ||
84 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
85 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
86 | + Lesser General Public License for more details. | ||
87 | + | ||
88 | + You should have received a copy of the GNU Lesser General Public | ||
89 | + License along with the GNU C Library; if not, see | ||
90 | + <http://www.gnu.org/licenses/>. */ | ||
91 | + | ||
92 | +#include <errno.h> | ||
93 | +#include <limits.h> | ||
94 | +#include <search.h> | ||
95 | +#include <stdbool.h> | ||
96 | +#include <stdio.h> | ||
97 | +#include <stdlib.h> | ||
98 | + | ||
99 | +static void | ||
100 | +test_size (size_t size) | ||
101 | +{ | ||
102 | + int res = hcreate (size); | ||
103 | + if (res == 0) | ||
104 | + { | ||
105 | + if (errno == ENOMEM) | ||
106 | + return; | ||
107 | + printf ("error: hcreate (%zu): %m\n", size); | ||
108 | + exit (1); | ||
109 | + } | ||
110 | + char *keys[100]; | ||
111 | + for (int i = 0; i < 100; ++i) | ||
112 | + { | ||
113 | + if (asprintf (keys + i, "%d", i) < 0) | ||
114 | + { | ||
115 | + printf ("error: asprintf: %m\n"); | ||
116 | + exit (1); | ||
117 | + } | ||
118 | + ENTRY e = { keys[i], (char *) "value" }; | ||
119 | + if (hsearch (e, ENTER) == NULL) | ||
120 | + { | ||
121 | + printf ("error: hsearch (\"%s\"): %m\n", keys[i]); | ||
122 | + exit (1); | ||
123 | + } | ||
124 | + } | ||
125 | + hdestroy (); | ||
126 | + | ||
127 | + for (int i = 0; i < 100; ++i) | ||
128 | + free (keys[i]); | ||
129 | +} | ||
130 | + | ||
131 | +static int | ||
132 | +do_test (void) | ||
133 | +{ | ||
134 | + test_size (500); | ||
135 | + test_size (-1); | ||
136 | + test_size (-3); | ||
137 | + test_size (INT_MAX - 2); | ||
138 | + test_size (INT_MAX - 1); | ||
139 | + test_size (INT_MAX); | ||
140 | + test_size (((unsigned) INT_MAX) + 1); | ||
141 | + test_size (UINT_MAX - 2); | ||
142 | + test_size (UINT_MAX - 1); | ||
143 | + test_size (UINT_MAX); | ||
144 | + return 0; | ||
145 | +} | ||
146 | + | ||
147 | +#define TEST_FUNCTION do_test () | ||
148 | +#include "../test-skeleton.c" | ||
149 | diff --git a/misc/hsearch_r.c b/misc/hsearch_r.c | ||
150 | index 9f55e84..6000ce2 100644 | ||
151 | --- a/misc/hsearch_r.c | ||
152 | +++ b/misc/hsearch_r.c | ||
153 | @@ -46,15 +46,12 @@ static int | ||
154 | isprime (unsigned int number) | ||
155 | { | ||
156 | /* no even number will be passed */ | ||
157 | - unsigned int div = 3; | ||
158 | - | ||
159 | - while (div * div < number && number % div != 0) | ||
160 | - div += 2; | ||
161 | - | ||
162 | - return number % div != 0; | ||
163 | + for (unsigned int div = 3; div <= number / div; div += 2) | ||
164 | + if (number % div == 0) | ||
165 | + return 0; | ||
166 | + return 1; | ||
167 | } | ||
168 | |||
169 | - | ||
170 | /* Before using the hash table we must allocate memory for it. | ||
171 | Test for an existing table are done. We allocate one element | ||
172 | more as the found prime number says. This is done for more effective | ||
173 | @@ -81,10 +78,19 @@ __hcreate_r (nel, htab) | ||
174 | use will not work. */ | ||
175 | if (nel < 3) | ||
176 | nel = 3; | ||
177 | - /* Change nel to the first prime number not smaller as nel. */ | ||
178 | - nel |= 1; /* make odd */ | ||
179 | - while (!isprime (nel)) | ||
180 | - nel += 2; | ||
181 | + | ||
182 | + /* Change nel to the first prime number in the range [nel, UINT_MAX - 2], | ||
183 | + The '- 2' means 'nel += 2' cannot overflow. */ | ||
184 | + for (nel |= 1; ; nel += 2) | ||
185 | + { | ||
186 | + if (UINT_MAX - 2 < nel) | ||
187 | + { | ||
188 | + __set_errno (ENOMEM); | ||
189 | + return 0; | ||
190 | + } | ||
191 | + if (isprime (nel)) | ||
192 | + break; | ||
193 | + } | ||
194 | |||
195 | htab->size = nel; | ||
196 | htab->filled = 0; | ||
197 | -- | ||
198 | 2.7.4 | ||
199 | |||
diff --git a/meta/recipes-core/glibc/glibc_2.22.bb b/meta/recipes-core/glibc/glibc_2.22.bb index a13b7f94bb..7b25847392 100644 --- a/meta/recipes-core/glibc/glibc_2.22.bb +++ b/meta/recipes-core/glibc/glibc_2.22.bb | |||
@@ -47,6 +47,7 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \ | |||
47 | file://CVE-2015-9761_2.patch \ | 47 | file://CVE-2015-9761_2.patch \ |
48 | file://CVE-2015-8776.patch \ | 48 | file://CVE-2015-8776.patch \ |
49 | file://CVE-2015-7547.patch \ | 49 | file://CVE-2015-7547.patch \ |
50 | file://CVE-2015-8778.patch \ | ||
50 | " | 51 | " |
51 | 52 | ||
52 | SRC_URI += "\ | 53 | SRC_URI += "\ |