From f2282db41067d8e1aacc60eaacaffddc07d52d32 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Wed, 7 Dec 2022 10:21:41 +0000 Subject: [PATCH] CVE-2022-23483 Sanitise channel data being passed from application Avoids OOB read if the size field is incorrect. --- xrdp/xrdp_mm.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index ce4da0f6..42e99287 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -663,22 +663,31 @@ xrdp_mm_trans_send_channel_setup(struct xrdp_mm *self, struct trans *trans) static int xrdp_mm_trans_process_channel_data(struct xrdp_mm *self, struct stream *s) { - int size; - int total_size; + unsigned int size; + unsigned int total_size; int chan_id; int chan_flags; - int rv; + int rv = 0; - in_uint16_le(s, chan_id); - in_uint16_le(s, chan_flags); - in_uint16_le(s, size); - in_uint32_le(s, total_size); - rv = 0; - - if (rv == 0) + if (!s_check_rem_and_log(s, 10, "Reading channel data header")) { - rv = libxrdp_send_to_channel(self->wm->session, chan_id, s->p, size, total_size, - chan_flags); + rv = 1; + } + else + { + in_uint16_le(s, chan_id); + in_uint16_le(s, chan_flags); + in_uint16_le(s, size); + in_uint32_le(s, total_size); + if (!s_check_rem_and_log(s, size, "Reading channel data data")) + { + rv = 1; + } + else + { + rv = libxrdp_send_to_channel(self->wm->session, chan_id, + s->p, size, total_size, chan_flags); + } } return rv;