untrusted comment: verify with openbsd-74-base.pub
RWRoyQmAD08ajYx/Pa1CbnqAT1aJxc5VUvc6xdEykx5lTTYf7JXOyjGPp5BDoe2Oo2Op+oSAuCNWGqu9MvhfFtWguTFJgNlCegU=
OpenBSD 7.4 errata 001, October 25, 2023:
Fix several input validation errors in the X server.
CVE-2023-5367 CVE-2023-5380 CVE-2023-5574
Apply by doing:
signify -Vep /etc/signify/openbsd-74-base.pub -x 001_xserver.patch.sig \
-m - | (cd /usr/xenocara && patch -p0)
And then rebuild and install the X server:
cd /usr/xenocara/xserver
make -f Makefile.bsd-wrapper obj
make -f Makefile.bsd-wrapper build
Index: xserver/Xi/xiproperty.c
===================================================================
RCS file: /cvs/xenocara/xserver/Xi/xiproperty.c,v
diff -u -p -r1.13 xiproperty.c
--- xserver/Xi/xiproperty.c 14 Dec 2022 10:29:00 -0000 1.13
+++ xserver/Xi/xiproperty.c 16 Oct 2023 17:12:55 -0000
@@ -730,7 +730,7 @@ XIChangeDeviceProperty(DeviceIntPtr dev,
XIDestroyDeviceProperty(prop);
return BadAlloc;
}
- new_value.size = len;
+ new_value.size = total_len;
new_value.type = type;
new_value.format = format;
@@ -747,7 +747,7 @@ XIChangeDeviceProperty(DeviceIntPtr dev,
case PropModePrepend:
new_data = new_value.data;
old_data = (void *) (((char *) new_value.data) +
- (prop_value->size * size_in_bytes));
+ (len * size_in_bytes));
break;
}
if (new_data)
Index: xserver/dix/enterleave.h
===================================================================
RCS file: /cvs/xenocara/xserver/dix/enterleave.h,v
diff -u -p -r1.5 enterleave.h
--- xserver/dix/enterleave.h 29 May 2016 12:02:35 -0000 1.5
+++ xserver/dix/enterleave.h 16 Oct 2023 17:12:55 -0000
@@ -58,8 +58,6 @@ extern void DeviceFocusEvent(DeviceIntPt
extern void EnterWindow(DeviceIntPtr dev, WindowPtr win, int mode);
-extern void LeaveWindow(DeviceIntPtr dev);
-
extern void CoreFocusEvent(DeviceIntPtr kbd,
int type, int mode, int detail, WindowPtr pWin);
Index: xserver/fb/fb.h
===================================================================
RCS file: /cvs/xenocara/xserver/fb/fb.h,v
diff -u -p -r1.13 fb.h
--- xserver/fb/fb.h 27 Jul 2019 07:57:09 -0000 1.13
+++ xserver/fb/fb.h 16 Oct 2023 17:12:55 -0000
@@ -410,6 +410,7 @@ typedef struct {
#endif
DevPrivateKeyRec gcPrivateKeyRec;
DevPrivateKeyRec winPrivateKeyRec;
+ CloseScreenProcPtr CloseScreen;
} FbScreenPrivRec, *FbScreenPrivPtr;
#define fbGetScreenPrivate(pScreen) ((FbScreenPrivPtr) \
Index: xserver/fb/fbscreen.c
===================================================================
RCS file: /cvs/xenocara/xserver/fb/fbscreen.c,v
diff -u -p -r1.11 fbscreen.c
--- xserver/fb/fbscreen.c 27 Jul 2019 07:57:10 -0000 1.11
+++ xserver/fb/fbscreen.c 16 Oct 2023 17:12:56 -0000
@@ -29,6 +29,7 @@
Bool
fbCloseScreen(ScreenPtr pScreen)
{
+ FbScreenPrivPtr screen_priv = fbGetScreenPrivate(pScreen);
int d;
DepthPtr depths = pScreen->allowedDepths;
@@ -37,9 +38,10 @@ fbCloseScreen(ScreenPtr pScreen)
free(depths[d].vids);
free(depths);
free(pScreen->visuals);
- if (pScreen->devPrivate)
- FreePixmap((PixmapPtr)pScreen->devPrivate);
- return TRUE;
+
+ pScreen->CloseScreen = screen_priv->CloseScreen;
+
+ return pScreen->CloseScreen(pScreen);
}
Bool
@@ -144,6 +146,7 @@ fbFinishScreenInit(ScreenPtr pScreen, vo
int dpix, int dpiy, int width, int bpp)
#endif
{
+ FbScreenPrivPtr screen_priv;
VisualPtr visuals;
DepthPtr depths;
int nvisuals;
@@ -177,8 +180,11 @@ fbFinishScreenInit(ScreenPtr pScreen, vo
rootdepth, ndepths, depths,
defaultVisual, nvisuals, visuals))
return FALSE;
- /* overwrite miCloseScreen with our own */
+
+ screen_priv = fbGetScreenPrivate(pScreen);
+ screen_priv->CloseScreen = pScreen->CloseScreen;
pScreen->CloseScreen = fbCloseScreen;
+
return TRUE;
}
Index: xserver/hw/vfb/InitOutput.c
===================================================================
RCS file: /cvs/xenocara/xserver/hw/vfb/InitOutput.c,v
diff -u -p -r1.17 InitOutput.c
--- xserver/hw/vfb/InitOutput.c 11 Nov 2021 09:03:05 -0000 1.17
+++ xserver/hw/vfb/InitOutput.c 16 Oct 2023 17:12:56 -0000
@@ -727,13 +727,6 @@ vfbCloseScreen(ScreenPtr pScreen)
pScreen->CloseScreen = pvfb->closeScreen;
- /*
- * fb overwrites miCloseScreen, so do this here
- */
- if (pScreen->devPrivate)
- (*pScreen->DestroyPixmap) (pScreen->devPrivate);
- pScreen->devPrivate = NULL;
-
return pScreen->CloseScreen(pScreen);
}
Index: xserver/include/eventstr.h
===================================================================
RCS file: /cvs/xenocara/xserver/include/eventstr.h,v
diff -u -p -r1.11 eventstr.h
--- xserver/include/eventstr.h 11 Nov 2021 09:03:13 -0000 1.11
+++ xserver/include/eventstr.h 16 Oct 2023 17:12:56 -0000
@@ -335,4 +335,7 @@ union _InternalEvent {
GestureEvent gesture_event;
};
+extern void
+LeaveWindow(DeviceIntPtr dev);
+
#endif
Index: xserver/mi/mipointer.c
===================================================================
RCS file: /cvs/xenocara/xserver/mi/mipointer.c,v
diff -u -p -r1.13 mipointer.c
--- xserver/mi/mipointer.c 11 Nov 2021 09:03:13 -0000 1.13
+++ xserver/mi/mipointer.c 16 Oct 2023 17:12:56 -0000
@@ -397,8 +397,21 @@ miPointerWarpCursor(DeviceIntPtr pDev, S
#ifdef PANORAMIX
&& noPanoramiXExtension
#endif
- )
- UpdateSpriteForScreen(pDev, pScreen);
+ ) {
+ DeviceIntPtr master = GetMaster(pDev, MASTER_POINTER);
+ /* Hack for CVE-2023-5380: if we're moving
+ * screens PointerWindows[] keeps referring to the
+ * old window. If that gets destroyed we have a UAF
+ * bug later. Only happens when jumping from a window
+ * to the root window on the other screen.
+ * Enter/Leave events are incorrect for that case but
+ * too niche to fix.
+ */
+ LeaveWindow(pDev);
+ if (master)
+ LeaveWindow(master);
+ UpdateSpriteForScreen(pDev, pScreen);
+ }
}
/**
Index: xserver/mi/miscrinit.c
===================================================================
RCS file: /cvs/xenocara/xserver/mi/miscrinit.c,v
diff -u -p -r1.14 miscrinit.c
--- xserver/mi/miscrinit.c 11 Nov 2021 09:03:13 -0000 1.14
+++ xserver/mi/miscrinit.c 16 Oct 2023 17:12:56 -0000
@@ -249,10 +249,10 @@ miScreenInit(ScreenPtr pScreen, void *pb
pScreen->numVisuals = numVisuals;
pScreen->visuals = visuals;
if (width) {
+ pScreen->CloseScreen = miCloseScreen;
#ifdef MITSHM
ShmRegisterFbFuncs(pScreen);
#endif
- pScreen->CloseScreen = miCloseScreen;
}
/* else CloseScreen */
/* QueryBestSize */
Index: xserver/randr/rrproperty.c
===================================================================
RCS file: /cvs/xenocara/xserver/randr/rrproperty.c,v
diff -u -p -r1.12 rrproperty.c
--- xserver/randr/rrproperty.c 27 Jul 2019 07:57:24 -0000 1.12
+++ xserver/randr/rrproperty.c 16 Oct 2023 17:12:56 -0000
@@ -209,7 +209,7 @@ RRChangeOutputProperty(RROutputPtr outpu
RRDestroyOutputProperty(prop);
return BadAlloc;
}
- new_value.size = len;
+ new_value.size = total_len;
new_value.type = type;
new_value.format = format;
@@ -226,7 +226,7 @@ RRChangeOutputProperty(RROutputPtr outpu
case PropModePrepend:
new_data = new_value.data;
old_data = (void *) (((char *) new_value.data) +
- (prop_value->size * size_in_bytes));
+ (len * size_in_bytes));
break;
}
if (new_data)