|
| 1 | +From c6353d52a931f5f126f79b4d7730ea1a295eb3b1 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 1/2] 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 | +--- |
| 67 | + present/present_notify.c | 2 +- |
| 68 | + 1 file changed, 1 insertion(+), 1 deletion(-) |
| 69 | + |
| 70 | +diff --git a/present/present_notify.c b/present/present_notify.c |
| 71 | +index 4459549..00b3b68 100644 |
| 72 | +--- a/present/present_notify.c |
| 73 | ++++ b/present/present_notify.c |
| 74 | +@@ -90,7 +90,7 @@ present_create_notifies(ClientPtr client, int num_notifies, xPresentNotify *x_no |
| 75 | + if (status != Success) |
| 76 | + goto bail; |
| 77 | + |
| 78 | +- added = i; |
| 79 | ++ added++; |
| 80 | + } |
| 81 | + return Success; |
| 82 | + |
| 83 | +-- |
| 84 | +2.45.4 |
| 85 | + |
| 86 | + |
| 87 | +From 4505bdae9a209e3ec014fa3a65241dbee65cc80e Mon Sep 17 00:00:00 2001 |
| 88 | +From: Olivier Fourdan < [email protected]> |
| 89 | +Date: Wed, 10 Sep 2025 15:58:57 +0200 |
| 90 | +Subject: [PATCH 2/2] xkb: Free the XKB resource when freeing XkbInterest |
| 91 | +MIME-Version: 1.0 |
| 92 | +Content-Type: text/plain; charset=UTF-8 |
| 93 | +Content-Transfer-Encoding: 8bit |
| 94 | + |
| 95 | +XkbRemoveResourceClient() would free the XkbInterest data associated |
| 96 | +with the device, but not the resource associated with it. |
| 97 | + |
| 98 | +As a result, when the client terminates, the resource delete function |
| 99 | +gets called and accesses already freed memory: |
| 100 | + |
| 101 | + | Invalid read of size 8 |
| 102 | + | at 0x5BC0C0: XkbRemoveResourceClient (xkbEvents.c:1047) |
| 103 | + | by 0x5B3391: XkbClientGone (xkb.c:7094) |
| 104 | + | by 0x4DF138: doFreeResource (resource.c:890) |
| 105 | + | by 0x4DFB50: FreeClientResources (resource.c:1156) |
| 106 | + | by 0x4A9A59: CloseDownClient (dispatch.c:3550) |
| 107 | + | by 0x5E0A53: ClientReady (connection.c:601) |
| 108 | + | by 0x5E4FEF: ospoll_wait (ospoll.c:657) |
| 109 | + | by 0x5DC834: WaitForSomething (WaitFor.c:206) |
| 110 | + | by 0x4A1BA5: Dispatch (dispatch.c:491) |
| 111 | + | by 0x4B0070: dix_main (main.c:277) |
| 112 | + | by 0x4285E7: main (stubmain.c:34) |
| 113 | + | Address 0x1893e278 is 184 bytes inside a block of size 928 free'd |
| 114 | + | at 0x4842E43: free (vg_replace_malloc.c:989) |
| 115 | + | by 0x49C1A6: CloseDevice (devices.c:1067) |
| 116 | + | by 0x49C522: CloseOneDevice (devices.c:1193) |
| 117 | + | by 0x49C6E4: RemoveDevice (devices.c:1244) |
| 118 | + | by 0x5873D4: remove_master (xichangehierarchy.c:348) |
| 119 | + | by 0x587921: ProcXIChangeHierarchy (xichangehierarchy.c:504) |
| 120 | + | by 0x579BF1: ProcIDispatch (extinit.c:390) |
| 121 | + | by 0x4A1D85: Dispatch (dispatch.c:551) |
| 122 | + | by 0x4B0070: dix_main (main.c:277) |
| 123 | + | by 0x4285E7: main (stubmain.c:34) |
| 124 | + | Block was alloc'd at |
| 125 | + | at 0x48473F3: calloc (vg_replace_malloc.c:1675) |
| 126 | + | by 0x49A118: AddInputDevice (devices.c:262) |
| 127 | + | by 0x4A0E58: AllocDevicePair (devices.c:2846) |
| 128 | + | by 0x5866EE: add_master (xichangehierarchy.c:153) |
| 129 | + | by 0x5878C2: ProcXIChangeHierarchy (xichangehierarchy.c:493) |
| 130 | + | by 0x579BF1: ProcIDispatch (extinit.c:390) |
| 131 | + | by 0x4A1D85: Dispatch (dispatch.c:551) |
| 132 | + | by 0x4B0070: dix_main (main.c:277) |
| 133 | + | by 0x4285E7: main (stubmain.c:34) |
| 134 | + |
| 135 | +To avoid that issue, make sure to free the resources when freeing the |
| 136 | +device XkbInterest data. |
| 137 | + |
| 138 | +CVE-2025-62230, ZDI-CAN-27545 |
| 139 | + |
| 140 | +This vulnerability was discovered by: |
| 141 | +Jan-Niklas Sohn working with Trend Micro Zero Day Initiative |
| 142 | + |
| 143 | +Signed-off-by: Olivier Fourdan < [email protected]> |
| 144 | +Reviewed-by: Michel Dänzer < [email protected]> |
| 145 | +Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2086> |
| 146 | +Signed-off-by: rpm-build <rpm-build> |
| 147 | +Upstream-reference: https://gitlab.freedesktop.org/xorg/xserver/-/commit/5a4286b1.patch https://gitlab.freedesktop.org/ofourdan/xserver/-/commit/10c94238bdad17c11707e0bdaaa3a9cd54c504be.patch |
| 148 | +--- |
| 149 | + xkb/xkbEvents.c | 2 ++ |
| 150 | + 1 file changed, 2 insertions(+) |
| 151 | + |
| 152 | +diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c |
| 153 | +index f8f65d4..7c669c9 100644 |
| 154 | +--- a/xkb/xkbEvents.c |
| 155 | ++++ b/xkb/xkbEvents.c |
| 156 | +@@ -1055,6 +1055,7 @@ XkbRemoveResourceClient(DevicePtr inDev, XID id) |
| 157 | + autoCtrls = interest->autoCtrls; |
| 158 | + autoValues = interest->autoCtrlValues; |
| 159 | + client = interest->client; |
| 160 | ++ FreeResource(interest->resource, RT_XKBCLIENT); |
| 161 | + free(interest); |
| 162 | + found = TRUE; |
| 163 | + } |
| 164 | +@@ -1066,6 +1067,7 @@ XkbRemoveResourceClient(DevicePtr inDev, XID id) |
| 165 | + autoCtrls = victim->autoCtrls; |
| 166 | + autoValues = victim->autoCtrlValues; |
| 167 | + client = victim->client; |
| 168 | ++ FreeResource(victim->resource, RT_XKBCLIENT); |
| 169 | + free(victim); |
| 170 | + found = TRUE; |
| 171 | + } |
| 172 | +-- |
| 173 | +2.45.4 |
| 174 | + |
0 commit comments