Files
xserver/dix
Peter Hutterer 564ccf2ce9 mi: reset the PointerWindows reference on screen switch
PointerWindows[] keeps a reference to the last window our sprite
entered - changes are usually handled by CheckMotion().

If we switch between screens via XWarpPointer our
dev->spriteInfo->sprite->win is set to the new screen's root window.
If there's another window at the cursor location CheckMotion() will
trigger the right enter/leave events later. If there is not, it skips
that process and we never trigger LeaveWindow() - PointerWindows[] for
the device still refers to the previous window.

If that window is destroyed we have a dangling reference that will
eventually cause a use-after-free bug when checking the window hierarchy
later.

To trigger this, we require:
- two protocol screens
- XWarpPointer to the other screen's root window
- XDestroyWindow before entering any other window

This is a niche bug so we hack around it by making sure we reset the
PointerWindows[] entry so we cannot have a dangling pointer. This
doesn't handle Enter/Leave events correctly but the previous code didn't
either.

CVE-2023-5380, ZDI-CAN-21608

This vulnerability was discovered by:
Sri working with Trend Micro Zero Day Initiative

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Adam Jackson <ajax@redhat.com>
2023-10-25 00:37:47 +00:00
..
2020-07-05 13:07:33 -07:00
2015-07-08 16:41:29 -04:00
2020-07-05 13:07:33 -07:00
2014-11-12 10:25:00 +10:00
2017-10-30 13:45:20 -04:00
2021-05-30 13:26:42 +03:00
2019-10-30 16:17:04 +00:00
2015-04-21 16:57:07 -07:00
2020-07-05 13:07:33 -07:00
2020-07-05 13:07:33 -07:00
2013-07-23 23:56:58 +01:00
2020-07-05 13:07:33 -07:00
2014-11-12 10:25:00 +10:00
2021-09-06 21:19:46 +00:00