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

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