https://bugs.gentoo.org/965334 https://www.zerodayinitiative.com/advisories/ZDI-25-978/ https://gitlab.gnome.org/GNOME/gimp/-/issues/14814 https://gitlab.gnome.org/GNOME/gimp/-/merge_requests/2449 https://gitlab.gnome.org/GNOME/gimp/-/commit/4eb106f2bff2d9b8e518aa455a884c6f38d70c6a From 345c79b73b1a6d0fbdc11ff86899a3d0a9c8c003 Mon Sep 17 00:00:00 2001 From: Jacob Boerema Date: Wed, 3 Sep 2025 18:37:26 -0400 Subject: [PATCH] plug-ins: fix ZDI-CAN-27823 GIMP XWD File Parsing Heap-based Buffer Overflow Remote Code Execution Vulnerability. Check offset in colormap is valid before writing to it. Cherry-picked to 2.10 and modified to work correctly with this context: ea68d87b66ec53e3cc5073993bd84ed96ce59590 44ebcee901f25180b8b9b04f6d26474919557f0d --- a/plug-ins/common/file-xwd.c +++ b/plug-ins/common/file-xwd.c @@ -183,7 +183,8 @@ static gint32 load_xwd_f2_d8_b8 (const gchar *filename, static gint32 load_xwd_f2_d16_b16 (const gchar *filename, FILE *ifp, L_XWDFILEHEADER *xwdhdr, - L_XWDCOLOR *xwdcolmap); + L_XWDCOLOR *xwdcolmap, + GError **error); static gint32 load_xwd_f2_d24_b32 (const gchar *filename, FILE *ifp, L_XWDFILEHEADER *xwdhdr, @@ -581,7 +582,7 @@ load_image (const gchar *filename, } else if ((depth <= 16) && (bpp == 16)) { - image_ID = load_xwd_f2_d16_b16 (filename, ifp, &xwdhdr, xwdcolmap); + image_ID = load_xwd_f2_d16_b16 (filename, ifp, &xwdhdr, xwdcolmap, error); } else if ((depth <= 24) && ((bpp == 24) || (bpp == 32))) { @@ -1543,7 +1544,8 @@ static gint32 load_xwd_f2_d16_b16 (const gchar *filename, FILE *ifp, L_XWDFILEHEADER *xwdhdr, - L_XWDCOLOR *xwdcolmap) + L_XWDCOLOR *xwdcolmap, + GError **error) { register guchar *dest, lsbyte_first; gint width, height, linepad, i, j, c0, c1, ncols; @@ -1606,9 +1608,20 @@ load_xwd_f2_d16_b16 (const gchar *filename, greenval = (green * 255) / maxgreen; for (blue = 0; blue <= maxblue; blue++) { + guint32 offset = ((red << redshift) + (green << greenshift) + + (blue << blueshift)) * 3; + + if (offset+2 >= maxval) + { + g_set_error (error, GIMP_PLUG_IN_ERROR, 0, + _("Invalid colormap offset. Possibly corrupt image.")); + g_free (data); + g_free (ColorMap); + g_object_unref (buffer); + return -1; + } blueval = (blue * 255) / maxblue; - cm = ColorMap + ((red << redshift) + (green << greenshift) - + (blue << blueshift)) * 3; + cm = ColorMap + offset; *(cm++) = redval; *(cm++) = greenval; *cm = blueval; -- 2.51.2