You can simplify your subject line to just: [OE-core][dunfell] libinput: Add fix for CVE-2022-1215
Unfortunately the patches in the recipe still do not apply. Have you done a test build? ERROR: libinput-1.15.2-r0 do_patch: Applying patch 'CVE-2022-1215.patch' on target directory '/home/steve/builds/poky-contrib-dunfell/build/tmp/work/core2-64-poky-linux/libinput/1.15.2-r0/libinput-1.15.2' Command Error: 'quilt --quiltrc /home/steve/builds/poky-contrib-dunfell/build/tmp/work/core2-64-poky-linux/libinput/1.15.2-r0/recipe-sysroot-native/etc/quiltrc push' exited with 0 Output: Applying patch CVE-2022-1215.patch patching file meson.build Hunk #1 FAILED at 787. 1 out of 1 hunk FAILED -- rejects in file meson.build patching file src/evdev.c Hunk #1 FAILED at 2356. Hunk #2 FAILED at 2382. Hunk #3 FAILED at 2411. Hunk #4 FAILED at 2238. 4 out of 4 hunks FAILED -- rejects in file src/evdev.c patching file src/evdev.h Hunk #1 FAILED at 169. Hunk #2 FAILED at 786. Hunk #3 FAILED at 824. 3 out of 3 hunks FAILED -- rejects in file src/evdev.h patching file src/util-strings.h Hunk #2 succeeded at 313 with fuzz 2. patching file test/litest-device-format-string.c patching file test/litest.h Hunk #1 FAILED at 303. 1 out of 1 hunk FAILED -- rejects in file test/litest.h patching file test/test-utils.c Hunk #1 succeeded at 1033 with fuzz 1 (offset -234 lines). Hunk #2 FAILED at 1163. 1 out of 2 hunks FAILED -- rejects in file test/test-utils.c Patch CVE-2022-1215.patch does not apply (enforce with -f) Steve On Thu, May 5, 2022 at 10:07 PM Pawan via lists.openembedded.org <pawan.badganchi=kpit....@lists.openembedded.org> wrote: > > From: Pawan Badganchi <pawan.badgan...@kpit.com> > > Add below patch to fix CVE-2022-1215 > > CVE-2022-1215.patch > Link: > https://gitlab.freedesktop.org/libinput/libinput/-/commit/2a8b8fde90d63d48ce09ddae44142674bbca1c28 > > Signed-off-by: Pawan Badganchi <pawan.badgan...@kpit.com> > --- > .../wayland/libinput/CVE-2022-1215.patch | 361 ++++++++++++++++++ > .../wayland/libinput_1.15.2.bb | 1 + > 2 files changed, 362 insertions(+) > create mode 100644 meta/recipes-graphics/wayland/libinput/CVE-2022-1215.patch > > diff --git a/meta/recipes-graphics/wayland/libinput/CVE-2022-1215.patch > b/meta/recipes-graphics/wayland/libinput/CVE-2022-1215.patch > new file mode 100644 > index 0000000000..5f8f7a9894 > --- /dev/null > +++ b/meta/recipes-graphics/wayland/libinput/CVE-2022-1215.patch > @@ -0,0 +1,361 @@ > +From 2a8b8fde90d63d48ce09ddae44142674bbca1c28 Mon Sep 17 00:00:00 2001 > +From: Peter Hutterer <peter.hutte...@who-t.net> > +Date: Wed, 30 Mar 2022 09:25:22 +1000 > +Subject: [PATCH] evdev: strip the device name of format directives > +MIME-Version: 1.0 > +Content-Type: text/plain; charset=UTF-8 > +Content-Transfer-Encoding: 8bit > + > +This fixes a format string vulnerabilty. > + > +evdev_log_message() composes a format string consisting of a fixed > +prefix (including the rendered device name) and the passed-in format > +buffer. This format string is then passed with the arguments to the > +actual log handler, which usually and eventually ends up being printf. > + > +If the device name contains a printf-style format directive, these ended > +up in the format string and thus get interpreted correctly, e.g. for a > +device "Foo%sBar" the log message vs printf invocation ends up being: > + evdev_log_message(device, "some message %s", "some argument"); > + printf("event9 - Foo%sBar: some message %s", "some argument"); > + > +This can enable an attacker to execute malicious code with the > +privileges of the process using libinput. > + > +To exploit this, an attacker needs to be able to create a kernel device > +with a malicious name, e.g. through /dev/uinput or a Bluetooth device. > + > +To fix this, convert any potential format directives in the device name > +by duplicating percentages. > + > +Pre-rendering the device to avoid the issue altogether would be nicer > +but the current log level hooks do not easily allow for this. The device > +name is the only user-controlled part of the format string. > + > +A second potential issue is the sysname of the device which is also > +sanitized. > + > +This issue was found by Albin Eldstål-Ahrens and Benjamin Svensson from > +Assured AB, and independently by Lukas Lamster. > + > +Fixes #752 > + > +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> > +(cherry picked from commit a423d7d3269dc32a87384f79e29bb5ac021c83d1) > + > +CVE: CVE-2022-1215 > +Upstream Status: Backport > [https://gitlab.freedesktop.org/libinput/libinput/-/commit/2a8b8fde90d63d48ce09ddae44142674bbca1c28] > +Signed-off-by: Pawan Badganchi <pawan.badgan...@kpit.com> > + > +--- > + meson.build | 1 + > + src/evdev.c | 31 +++++++++++------ > + src/evdev.h | 6 ++-- > + src/util-strings.h | 30 ++++++++++++++++ > + test/litest-device-format-string.c | 56 ++++++++++++++++++++++++++++++ > + test/litest.h | 1 + > + test/test-utils.c | 26 ++++++++++++++ > + 7 files changed, 139 insertions(+), 12 deletions(-) > + create mode 100644 test/litest-device-format-string.c > + > +diff --git a/meson.build b/meson.build > +index 90f528e6..1f6159e7 100644 > +--- a/meson.build > ++++ b/meson.build > +@@ -787,6 +787,7 @@ > + 'test/litest-device-dell-canvas-totem-touch.c', > + 'test/litest-device-elantech-touchpad.c', > + 'test/litest-device-elan-tablet.c', > ++ 'test/litest-device-format-string.c', > + 'test/litest-device-generic-singletouch.c', > + 'test/litest-device-gpio-keys.c', > + 'test/litest-device-huion-pentablet.c', > +diff --git a/src/evdev.c b/src/evdev.c > +index 6d81f58f..d1c35c07 100644 > +--- a/src/evdev.c > ++++ b/src/evdev.c > +@@ -2356,19 +2356,19 @@ evdev_device_create(struct libinput_seat *seat, > + struct libinput *libinput = seat->libinput; > + struct evdev_device *device = NULL; > + int rc; > +- int fd; > ++ int fd = -1; > + int unhandled_device = 0; > + const char *devnode = udev_device_get_devnode(udev_device); > +- const char *sysname = udev_device_get_sysname(udev_device); > ++ char *sysname = str_sanitize(udev_device_get_sysname(udev_device)); > + > + if (!devnode) { > + log_info(libinput, "%s: no device node associated\n", > sysname); > +- return NULL; > ++ goto err; > + } > + > + if (udev_device_should_be_ignored(udev_device)) { > + log_debug(libinput, "%s: device is ignored\n", sysname); > +- return NULL; > ++ goto err; > + } > + > + /* Use non-blocking mode so that we can loop on read on > +@@ -2382,13 +2382,15 @@ evdev_device_create(struct libinput_seat *seat, > + sysname, > + devnode, > + strerror(-fd)); > +- return NULL; > ++ goto err; > + } > + > + if (!evdev_device_have_same_syspath(udev_device, fd)) > + goto err; > + > + device = zalloc(sizeof *device); > ++ device->sysname = sysname; > ++ sysname = NULL; > + > + libinput_device_init(&device->base, seat); > + libinput_seat_ref(seat); > +@@ -2411,6 +2413,9 @@ evdev_device_create(struct libinput_seat *seat, > + device->dispatch = NULL; > + device->fd = fd; > + device->devname = libevdev_get_name(device->evdev); > ++ /* the log_prefix_name is used as part of a printf format string and > ++ * must not contain % directives, see evdev_log_msg */ > ++ device->log_prefix_name = str_sanitize(device->devname); > + device->scroll.threshold = 5.0; /* Default may be overridden */ > + device->scroll.direction_lock_threshold = 5.0; /* Default may be > overridden */ > + device->scroll.direction = 0; > +@@ -2238,9 +2238,14 @@ > + return device; > + > + err: > +- close_restricted(libinput, fd); > +- if (device) > +- evdev_device_destroy(device); > ++ if (fd >= 0) { > ++ close_restricted(libinput, fd); > ++ if (device) { > ++ unhandled_device = device->seat_caps == 0; > ++ evdev_device_destroy(device); > ++ } > ++ } > ++ free(sysname); > + > + return unhandled_device ? EVDEV_UNHANDLED_DEVICE : NULL; > + } > + > +@@ -2469,7 +2478,7 @@ evdev_device_get_output(struct evdev_device *device) > + const char * > + evdev_device_get_sysname(struct evdev_device *device) > + { > +- return udev_device_get_sysname(device->udev_device); > ++ return device->sysname; > + } > + > + const char * > +@@ -3066,6 +3075,8 @@ evdev_device_destroy(struct evdev_device *device) > + if (device->base.group) > + libinput_device_group_unref(device->base.group); > + > ++ free(device->log_prefix_name); > ++ free(device->sysname); > + free(device->output_name); > + filter_destroy(device->pointer.filter); > + libinput_timer_destroy(&device->scroll.timer); > +diff --git a/src/evdev.h b/src/evdev.h > +index c7d130f8..980c5943 100644 > +--- a/src/evdev.h > ++++ b/src/evdev.h > +@@ -169,6 +169,8 @@ struct evdev_device { > + struct udev_device *udev_device; > + char *output_name; > + const char *devname; > ++ char *log_prefix_name; > ++ char *sysname; > + bool was_removed; > + int fd; > + enum evdev_device_seat_capability seat_caps; > +@@ -786,7 +788,7 @@ evdev_log_msg(struct evdev_device *device, > + sizeof(buf), > + "%-7s - %s%s%s", > + evdev_device_get_sysname(device), > +- (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ? device->devname > : "", > ++ (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ? > device->log_prefix_name : "", > + (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ? ": " : "", > + format); > + > +@@ -824,7 +826,7 @@ evdev_log_msg_ratelimit(struct evdev_device *device, > + sizeof(buf), > + "%-7s - %s%s%s", > + evdev_device_get_sysname(device), > +- (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ? device->devname > : "", > ++ (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ? > device->log_prefix_name : "", > + (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ? ": " : "", > + format); > + > +diff --git a/src/util-strings.h b/src/util-strings.h > +index 2a15fab3..d5a84146 100644 > +--- a/src/util-strings.h > ++++ b/src/util-strings.h > +@@ -42,6 +42,7 @@ > + #ifdef HAVE_XLOCALE_H > + #include <xlocale.h> > + #endif > ++#include "util-macros.h" > + > + #define streq(s1, s2) (strcmp((s1), (s2)) == 0) > + #define strneq(s1, s2, n) (strncmp((s1), (s2), (n)) == 0) > +@@ -312,3 +313,31 @@ > + free(result); > + return -1; > + } > ++ > ++/** > ++ * Return a copy of str with all % converted to %% to make the string > ++ * acceptable as printf format. > ++ */ > ++static inline char * > ++str_sanitize(const char *str) > ++{ > ++ if (!str) > ++ return NULL; > ++ > ++ if (!strchr(str, '%')) > ++ return strdup(str); > ++ > ++ size_t slen = min(strlen(str), 512); > ++ char *sanitized = zalloc(2 * slen + 1); > ++ const char *src = str; > ++ char *dst = sanitized; > ++ > ++ for (size_t i = 0; i < slen; i++) { > ++ if (*src == '%') > ++ *dst++ = '%'; > ++ *dst++ = *src++; > ++ } > ++ *dst = '\0'; > ++ > ++ return sanitized; > ++} > +diff --git a/test/litest-device-format-string.c > b/test/litest-device-format-string.c > +new file mode 100644 > +index 00000000..aed15db4 > +--- /dev/null > ++++ b/test/litest-device-format-string.c > +@@ -0,0 +1,56 @@ > ++ > ++/* > ++ * Copyright © 2013 Red Hat, Inc. > ++ * > ++ * Permission is hereby granted, free of charge, to any person obtaining a > ++ * copy of this software and associated documentation files (the > "Software"), > ++ * to deal in the Software without restriction, including without limitation > ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, > ++ * and/or sell copies of the Software, and to permit persons to whom the > ++ * Software is furnished to do so, subject to the following conditions: > ++ * > ++ * The above copyright notice and this permission notice (including the next > ++ * paragraph) shall be included in all copies or substantial portions of the > ++ * Software. > ++ * > ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS > OR > ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > ++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > OTHER > ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > ++ * DEALINGS IN THE SOFTWARE. > ++ */ > ++ > ++#include "config.h" > ++ > ++#include "litest.h" > ++#include "litest-int.h" > ++ > ++static struct input_id input_id = { > ++ .bustype = 0x3, > ++ .vendor = 0x0123, > ++ .product = 0x0456, > ++}; > ++ > ++static int events[] = { > ++ EV_KEY, BTN_LEFT, > ++ EV_KEY, BTN_RIGHT, > ++ EV_KEY, BTN_MIDDLE, > ++ EV_REL, REL_X, > ++ EV_REL, REL_Y, > ++ EV_REL, REL_WHEEL, > ++ EV_REL, REL_WHEEL_HI_RES, > ++ -1 , -1, > ++}; > ++ > ++TEST_DEVICE("mouse-format-string", > ++ .type = LITEST_MOUSE_FORMAT_STRING, > ++ .features = LITEST_RELATIVE | LITEST_BUTTON | LITEST_WHEEL, > ++ .interface = NULL, > ++ > ++ .name = "Evil %s %d %x Mouse %p %", > ++ .id = &input_id, > ++ .absinfo = NULL, > ++ .events = events, > ++) > +diff --git a/test/litest.h b/test/litest.h > +index 4982e516..1b1daa90 100644 > +--- a/test/litest.h > ++++ b/test/litest.h > +@@ -303,6 +303,7 @@ > + LITEST_ALPS_3FG, > + LITEST_ELAN_TABLET, > + LITEST_ABSINFO_OVERRIDE, > ++ LITEST_MOUSE_FORMAT_STRING, > + }; > + > + #define LITEST_DEVICELESS -2 > +diff --git a/test/test-utils.c b/test/test-utils.c > +index 989adecd..e80754be 100644 > +--- a/test/test-utils.c > ++++ b/test/test-utils.c > +@@ -1267,6 +1267,31 @@ START_TEST(strstartswith_test) > + } > + END_TEST > + > ++START_TEST(strsanitize_test) > ++{ > ++ struct strsanitize_test { > ++ const char *string; > ++ const char *expected; > ++ } tests[] = { > ++ { "foobar", "foobar" }, > ++ { "", "" }, > ++ { "%", "%%" }, > ++ { "%%%%", "%%%%%%%%" }, > ++ { "x %s", "x %%s" }, > ++ { "x %", "x %%" }, > ++ { "%sx", "%%sx" }, > ++ { "%s%s", "%%s%%s" }, > ++ { NULL, NULL }, > ++ }; > ++ > ++ for (struct strsanitize_test *t = tests; t->string; t++) { > ++ char *sanitized = str_sanitize(t->string); > ++ ck_assert_str_eq(sanitized, t->expected); > ++ free(sanitized); > ++ } > ++} > ++END_TEST > ++ > + START_TEST(list_test_insert) > + { > + struct list_test { > +@@ -1138,6 +1138,7 @@ > + tcase_add_test(tc, strsplit_test); > + tcase_add_test(tc, kvsplit_double_test); > + tcase_add_test(tc, strjoin_test); > ++ tcase_add_test(tc, strsanitize_test); > + tcase_add_test(tc, time_conversion); > + > + tcase_add_test(tc, list_test_insert); > + > +-- > +GitLab > + > diff --git a/meta/recipes-graphics/wayland/libinput_1.15.2.bb > b/meta/recipes-graphics/wayland/libinput_1.15.2.bb > index 810532774e..d7927d132a 100644 > --- a/meta/recipes-graphics/wayland/libinput_1.15.2.bb > +++ b/meta/recipes-graphics/wayland/libinput_1.15.2.bb > @@ -14,6 +14,7 @@ DEPENDS = "libevdev udev mtdev" > > SRC_URI = "http://www.freedesktop.org/software/${BPN}/${BP}.tar.xz \ > file://determinism.patch \ > + file://CVE-2022-1215.patch \ > " > SRC_URI[md5sum] = "eb6bd2907ad33d53954d70dfb881a643" > SRC_URI[sha256sum] = > "971c3fbfb624f95c911adeb2803c372e4e3647d1b98f278f660051f834597747" > -- > 2.17.1 > > This message contains information that may be privileged or confidential and > is the property of the KPIT Technologies Ltd. It is intended only for the > person to whom it is addressed. If you are not the intended recipient, you > are not authorized to read, print, retain copy, disseminate, distribute, or > use this message or any part thereof. If you receive this message in error, > please notify the sender immediately and delete all copies of this message. > KPIT Technologies Ltd. does not accept any liability for virus infected mails. > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#165341): https://lists.openembedded.org/g/openembedded-core/message/165341 Mute This Topic: https://lists.openembedded.org/mt/90929209/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-