Blame SOURCES/0001-Xtest-disallow-GenericEvents-in-XTestSwapFakeInput.patch

b25474
From 8dba686dc277d6d262ad0c77b4632a5b276697ba Mon Sep 17 00:00:00 2001
b25474
From: Peter Hutterer <peter.hutterer@who-t.net>
b25474
Date: Tue, 29 Nov 2022 12:55:45 +1000
b25474
Subject: [PATCH xserver 1/7] Xtest: disallow GenericEvents in
b25474
 XTestSwapFakeInput
b25474
b25474
XTestSwapFakeInput assumes all events in this request are
b25474
sizeof(xEvent) and iterates through these in 32-byte increments.
b25474
However, a GenericEvent may be of arbitrary length longer than 32 bytes,
b25474
so any GenericEvent in this list would result in subsequent events to be
b25474
misparsed.
b25474
b25474
Additional, the swapped event is written into a stack-allocated struct
b25474
xEvent (size 32 bytes). For any GenericEvent longer than 32 bytes,
b25474
swapping the event may thus smash the stack like an avocado on toast.
b25474
b25474
Catch this case early and return BadValue for any GenericEvent.
b25474
Which is what would happen in unswapped setups anyway since XTest
b25474
doesn't support GenericEvent.
b25474
b25474
CVE-2022-46340, ZDI-CAN 19265
b25474
b25474
This vulnerability was discovered by:
b25474
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
b25474
b25474
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
b25474
Acked-by: Olivier Fourdan <ofourdan@redhat.com>
b25474
---
b25474
 Xext/xtest.c | 5 +++--
b25474
 1 file changed, 3 insertions(+), 2 deletions(-)
b25474
b25474
diff --git a/Xext/xtest.c b/Xext/xtest.c
b25474
index bf27eb590b..2985a4ce6e 100644
b25474
--- a/Xext/xtest.c
b25474
+++ b/Xext/xtest.c
b25474
@@ -502,10 +502,11 @@ XTestSwapFakeInput(ClientPtr client, xReq * req)
b25474
 
b25474
     nev = ((req->length << 2) - sizeof(xReq)) / sizeof(xEvent);
b25474
     for (ev = (xEvent *) &req[1]; --nev >= 0; ev++) {
b25474
+        int evtype = ev->u.u.type & 0x177;
b25474
         /* Swap event */
b25474
-        proc = EventSwapVector[ev->u.u.type & 0177];
b25474
+        proc = EventSwapVector[evtype];
b25474
         /* no swapping proc; invalid event type? */
b25474
-        if (!proc || proc == NotImplemented) {
b25474
+        if (!proc || proc == NotImplemented || evtype == GenericEvent) {
b25474
             client->errorValue = ev->u.u.type;
b25474
             return BadValue;
b25474
         }
b25474
-- 
b25474
2.38.1
b25474