Blame SOURCES/0004-Xi-disallow-passive-grabs-with-a-detail-255.patch

290b8e
From 0dab0b527ac5c4fe0272ea679522bd87238a733b Mon Sep 17 00:00:00 2001
290b8e
From: Peter Hutterer <peter.hutterer@who-t.net>
290b8e
Date: Tue, 29 Nov 2022 13:55:32 +1000
290b8e
Subject: [PATCH xserver 4/7] Xi: disallow passive grabs with a detail > 255
290b8e
290b8e
The XKB protocol effectively prevents us from ever using keycodes above
290b8e
255. For buttons it's theoretically possible but realistically too niche
290b8e
to worry about. For all other passive grabs, the detail must be zero
290b8e
anyway.
290b8e
290b8e
This fixes an OOB write:
290b8e
290b8e
ProcXIPassiveUngrabDevice() calls DeletePassiveGrabFromList with a
290b8e
temporary grab struct which contains tempGrab->detail.exact = stuff->detail.
290b8e
For matching existing grabs, DeleteDetailFromMask is called with the
290b8e
stuff->detail value. This function creates a new mask with the one bit
290b8e
representing stuff->detail cleared.
290b8e
290b8e
However, the array size for the new mask is 8 * sizeof(CARD32) bits,
290b8e
thus any detail above 255 results in an OOB array write.
290b8e
290b8e
CVE-2022-46341, ZDI-CAN 19381
290b8e
290b8e
This vulnerability was discovered by:
290b8e
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
290b8e
290b8e
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
290b8e
Acked-by: Olivier Fourdan <ofourdan@redhat.com>
290b8e
---
290b8e
 Xi/xipassivegrab.c | 12 ++++++++++++
290b8e
 1 file changed, 12 insertions(+)
290b8e
290b8e
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
290b8e
index 65d5870f6f..89a591098a 100644
290b8e
--- a/Xi/xipassivegrab.c
290b8e
+++ b/Xi/xipassivegrab.c
290b8e
@@ -133,6 +133,12 @@ ProcXIPassiveGrabDevice(ClientPtr client)
290b8e
         return BadValue;
290b8e
     }
290b8e
290b8e
+    /* XI2 allows 32-bit keycodes but thanks to XKB we can never
290b8e
+     * implement this. Just return an error for all keycodes that
290b8e
+     * cannot work anyway, same for buttons > 255. */
290b8e
+    if (stuff->detail > 255)
290b8e
+        return XIAlreadyGrabbed;
290b8e
+
290b8e
     if (XICheckInvalidMaskBits(client, (unsigned char *) &stuff[1],
290b8e
                                stuff->mask_len * 4) != Success)
290b8e
         return BadValue;
290b8e
@@ -313,6 +319,12 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
290b8e
         return BadValue;
290b8e
     }
290b8e
290b8e
+    /* We don't allow passive grabs for details > 255 anyway */
290b8e
+    if (stuff->detail > 255) {
290b8e
+        client->errorValue = stuff->detail;
290b8e
+        return BadValue;
290b8e
+    }
290b8e
+
290b8e
     rc = dixLookupWindow(&win, stuff->grab_window, client, DixSetAttrAccess);
290b8e
     if (rc != Success)
290b8e
         return rc;
290b8e
--
290b8e
2.38.1