|
| 1 | +From 904d31283928071ab7e755880100c2c96ad12437 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Olivier Fourdan < [email protected]> |
| 3 | +Date: Wed, 2 Jul 2025 09:46:22 +0200 |
| 4 | +Subject: [PATCH] present: Fix use-after-free in present_create_notifies() |
| 5 | + |
| 6 | +Using the Present extension, if an error occurs while processing and |
| 7 | +adding the notifications after presenting a pixmap, the function |
| 8 | +present_create_notifies() will clean up and remove the notifications |
| 9 | +it added. |
| 10 | + |
| 11 | +However, there are two different code paths that can lead to an error |
| 12 | +creating the notify, one being before the notify is being added to the |
| 13 | +list, and another one after the notify is added. |
| 14 | + |
| 15 | +When the error occurs before it's been added, it removes the elements up |
| 16 | +to the last added element, instead of the actual number of elements |
| 17 | +which were added. |
| 18 | + |
| 19 | +As a result, in case of error, as with an invalid window for example, it |
| 20 | +leaves a dangling pointer to the last element, leading to a use after |
| 21 | +free case later: |
| 22 | + |
| 23 | + | Invalid write of size 8 |
| 24 | + | at 0x5361D5: present_clear_window_notifies (present_notify.c:42) |
| 25 | + | by 0x534A56: present_destroy_window (present_screen.c:107) |
| 26 | + | by 0x41E441: xwl_destroy_window (xwayland-window.c:1959) |
| 27 | + | by 0x4F9EC9: compDestroyWindow (compwindow.c:622) |
| 28 | + | by 0x51EAC4: damageDestroyWindow (damage.c:1592) |
| 29 | + | by 0x4FDC29: DbeDestroyWindow (dbe.c:1291) |
| 30 | + | by 0x4EAC55: FreeWindowResources (window.c:1023) |
| 31 | + | by 0x4EAF59: DeleteWindow (window.c:1091) |
| 32 | + | by 0x4DE59A: doFreeResource (resource.c:890) |
| 33 | + | by 0x4DEFB2: FreeClientResources (resource.c:1156) |
| 34 | + | by 0x4A9AFB: CloseDownClient (dispatch.c:3567) |
| 35 | + | by 0x5DCC78: ClientReady (connection.c:603) |
| 36 | + | Address 0x16126200 is 16 bytes inside a block of size 2,048 free'd |
| 37 | + | at 0x4841E43: free (vg_replace_malloc.c:989) |
| 38 | + | by 0x5363DD: present_destroy_notifies (present_notify.c:111) |
| 39 | + | by 0x53638D: present_create_notifies (present_notify.c:100) |
| 40 | + | by 0x5368E9: proc_present_pixmap_common (present_request.c:164) |
| 41 | + | by 0x536A7D: proc_present_pixmap (present_request.c:189) |
| 42 | + | by 0x536FA9: proc_present_dispatch (present_request.c:337) |
| 43 | + | by 0x4A1E4E: Dispatch (dispatch.c:561) |
| 44 | + | by 0x4B00F1: dix_main (main.c:284) |
| 45 | + | by 0x42879D: main (stubmain.c:34) |
| 46 | + | Block was alloc'd at |
| 47 | + | at 0x48463F3: calloc (vg_replace_malloc.c:1675) |
| 48 | + | by 0x5362A1: present_create_notifies (present_notify.c:81) |
| 49 | + | by 0x5368E9: proc_present_pixmap_common (present_request.c:164) |
| 50 | + | by 0x536A7D: proc_present_pixmap (present_request.c:189) |
| 51 | + | by 0x536FA9: proc_present_dispatch (present_request.c:337) |
| 52 | + | by 0x4A1E4E: Dispatch (dispatch.c:561) |
| 53 | + | by 0x4B00F1: dix_main (main.c:284) |
| 54 | + | by 0x42879D: main (stubmain.c:34) |
| 55 | + |
| 56 | +To fix the issue, count and remove the actual number of notify elements |
| 57 | +added in case of error. |
| 58 | + |
| 59 | +CVE-2025-62229, ZDI-CAN-27238 |
| 60 | + |
| 61 | +This vulnerability was discovered by: |
| 62 | +Jan-Niklas Sohn working with Trend Micro Zero Day Initiative |
| 63 | + |
| 64 | +Signed-off-by: Olivier Fourdan < [email protected]> |
| 65 | +Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2086> |
| 66 | +Signed-off-by: rpm-build <rpm-build> |
| 67 | +Upstream-reference: https://gitlab.freedesktop.org/xorg/xserver/-/commit/5a4286b1.patch |
| 68 | +--- |
| 69 | + present/present_notify.c | 2 +- |
| 70 | + 1 file changed, 1 insertion(+), 1 deletion(-) |
| 71 | + |
| 72 | +diff --git a/present/present_notify.c b/present/present_notify.c |
| 73 | +index 4459549..00b3b68 100644 |
| 74 | +--- a/present/present_notify.c |
| 75 | ++++ b/present/present_notify.c |
| 76 | +@@ -90,7 +90,7 @@ present_create_notifies(ClientPtr client, int num_notifies, xPresentNotify *x_no |
| 77 | + if (status != Success) |
| 78 | + goto bail; |
| 79 | + |
| 80 | +- added = i; |
| 81 | ++ added++; |
| 82 | + } |
| 83 | + return Success; |
| 84 | + |
| 85 | +-- |
| 86 | +2.45.4 |
| 87 | + |
0 commit comments