Blame SOURCES/ghostscript-cve-2018-15911.patch

09061c
From: Ken Sharp <ken.sharp@artifex.com>
09061c
Date: Thu, 23 Aug 2018 14:42:02 +0000 (+0100)
09061c
Subject: Bug 699665 "memory corruption in aesdecode"
09061c
09061c
Bug 699665 "memory corruption in aesdecode"
09061c
09061c
The specimen file calls aesdecode without specifying the key to be
09061c
used, though it does manage to do enough work with the PDF interpreter
09061c
routines to get access to aesdecode (which isn't normally available).
09061c
09061c
This causes us to read uninitialised memory, which can (and often does)
09061c
lead to a segmentation fault.
09061c
09061c
In this commit we set the key to NULL explicitly during intialisation
09061c
and then check it before we read it. If its NULL we just return.
09061c
09061c
It seems bizarre that we don't return error codes, we should probably
09061c
look into that at some point, but this prevents the code trying to
09061c
read uninitialised memory.
09061c
09061c
https://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=8e9ce5016db968b40e4ec255a3005f2786cce45f
09061c
---
09061c
09061c
diff -up ghostscript-9.07/base/aes.c.cve-2018-15911 ghostscript-9.07/base/aes.c
09061c
--- ghostscript-9.07/base/aes.c.cve-2018-15911	2018-11-23 11:23:38.826259192 +0100
09061c
+++ ghostscript-9.07/base/aes.c	2018-11-23 11:25:19.684507346 +0100
09061c
@@ -662,6 +662,9 @@ void aes_crypt_ecb( aes_context *ctx,
09061c
     }
09061c
 #endif
09061c
 
09061c
+    if (ctx == NULL || ctx->rk == NULL)
09061c
+        return;
09061c
+
09061c
     RK = ctx->rk;
09061c
 
09061c
     GET_ULONG_LE( X0, input,  0 ); X0 ^= *RK++;
09061c
diff -up ghostscript-9.07/base/saes.c.cve-2018-15911 ghostscript-9.07/base/saes.c
09061c
--- ghostscript-9.07/base/saes.c.cve-2018-15911	2018-11-23 11:25:48.914999536 +0100
09061c
+++ ghostscript-9.07/base/saes.c	2018-11-23 11:26:29.903287483 +0100
09061c
@@ -120,6 +120,7 @@ s_aes_process(stream_state * ss, stream_
09061c
         gs_throw(gs_error_VMerror, "could not allocate aes context");
09061c
         return ERRC;
09061c
       }
09061c
+      memset(state->ctx, 0x00, sizeof(aes_context));
09061c
       if (state->keylength < 1 || state->keylength > SAES_MAX_KEYLENGTH) {
09061c
         gs_throw1(gs_error_rangecheck, "invalid aes key length (%d bytes)",
09061c
                 state->keylength);