Peter Hutterer d887a5b
From 58e83c683950ac9e253ab05dd7a13a8368b70a3c Mon Sep 17 00:00:00 2001
Peter Hutterer d887a5b
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer d887a5b
Date: Mon, 27 Nov 2023 16:27:49 +1000
Peter Hutterer d887a5b
Subject: [PATCH xserver] randr: avoid integer truncation in length check of
Peter Hutterer d887a5b
 ProcRRChange*Property
Peter Hutterer d887a5b
Peter Hutterer d887a5b
Affected are ProcRRChangeProviderProperty and ProcRRChangeOutputProperty.
Peter Hutterer d887a5b
See also xserver@8f454b79 where this same bug was fixed for the core
Peter Hutterer d887a5b
protocol and XI.
Peter Hutterer d887a5b
Peter Hutterer d887a5b
This fixes an OOB read and the resulting information disclosure.
Peter Hutterer d887a5b
Peter Hutterer d887a5b
Length calculation for the request was clipped to a 32-bit integer. With
Peter Hutterer d887a5b
the correct stuff->nUnits value the expected request size was
Peter Hutterer d887a5b
truncated, passing the REQUEST_FIXED_SIZE check.
Peter Hutterer d887a5b
Peter Hutterer d887a5b
The server then proceeded with reading at least stuff->num_items bytes
Peter Hutterer d887a5b
(depending on stuff->format) from the request and stuffing whatever it
Peter Hutterer d887a5b
finds into the property. In the process it would also allocate at least
Peter Hutterer d887a5b
stuff->nUnits bytes, i.e. 4GB.
Peter Hutterer d887a5b
Peter Hutterer d887a5b
CVE-2023-6478, ZDI-CAN-22561
Peter Hutterer d887a5b
Peter Hutterer d887a5b
This vulnerability was discovered by:
Peter Hutterer d887a5b
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
Peter Hutterer d887a5b
Peter Hutterer d887a5b
(cherry picked from commit 14f480010a93ff962fef66a16412fafff81ad632)
Peter Hutterer d887a5b
---
Peter Hutterer d887a5b
 randr/rrproperty.c         | 2 +-
Peter Hutterer d887a5b
 randr/rrproviderproperty.c | 2 +-
Peter Hutterer d887a5b
 2 files changed, 2 insertions(+), 2 deletions(-)
Peter Hutterer d887a5b
Peter Hutterer d887a5b
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
Peter Hutterer d887a5b
index 25469f57b2..c4fef8a1f6 100644
Peter Hutterer d887a5b
--- a/randr/rrproperty.c
Peter Hutterer d887a5b
+++ b/randr/rrproperty.c
Peter Hutterer d887a5b
@@ -530,7 +530,7 @@ ProcRRChangeOutputProperty(ClientPtr client)
Peter Hutterer d887a5b
     char format, mode;
Peter Hutterer d887a5b
     unsigned long len;
Peter Hutterer d887a5b
     int sizeInBytes;
Peter Hutterer d887a5b
-    int totalSize;
Peter Hutterer d887a5b
+    uint64_t totalSize;
Peter Hutterer d887a5b
     int err;
Peter Hutterer d887a5b
 
Peter Hutterer d887a5b
     REQUEST_AT_LEAST_SIZE(xRRChangeOutputPropertyReq);
Peter Hutterer d887a5b
diff --git a/randr/rrproviderproperty.c b/randr/rrproviderproperty.c
Peter Hutterer d887a5b
index b79c17f9bf..90c5a9a933 100644
Peter Hutterer d887a5b
--- a/randr/rrproviderproperty.c
Peter Hutterer d887a5b
+++ b/randr/rrproviderproperty.c
Peter Hutterer d887a5b
@@ -498,7 +498,7 @@ ProcRRChangeProviderProperty(ClientPtr client)
Peter Hutterer d887a5b
     char format, mode;
Peter Hutterer d887a5b
     unsigned long len;
Peter Hutterer d887a5b
     int sizeInBytes;
Peter Hutterer d887a5b
-    int totalSize;
Peter Hutterer d887a5b
+    uint64_t totalSize;
Peter Hutterer d887a5b
     int err;
Peter Hutterer d887a5b
 
Peter Hutterer d887a5b
     REQUEST_AT_LEAST_SIZE(xRRChangeProviderPropertyReq);
Peter Hutterer d887a5b
-- 
Peter Hutterer d887a5b
2.43.0
Peter Hutterer d887a5b