wok-current rev 25679
Patch ghostscript CVE-2023-36664
author | Stanislas Leduc <shann@slitaz.org> |
---|---|
date | Fri Mar 08 13:06:31 2024 +0000 (8 months ago) |
parents | c6586b983edd |
children | 36a7b2c61bce |
files | ghostscript/receipt ghostscript/stuff/CVE-2023-36664-1.patch ghostscript/stuff/CVE-2023-36664-2.patch |
line diff
1.1 --- a/ghostscript/receipt Thu Mar 07 20:38:36 2024 +0000 1.2 +++ b/ghostscript/receipt Fri Mar 08 13:06:31 2024 +0000 1.3 @@ -33,6 +33,10 @@ 1.4 # force it to use system-libs 1.5 rm -rf jpeg libpng zlib jasper expat 1.6 1.7 + # Patch for CVE-2023-36664 1.8 + patch -p1 < $stuff/CVE-2023-36664-1.patch 1.9 + patch -p1 < $stuff/CVE-2023-36664-2.patch 1.10 + 1.11 # --disable-compile-inits is needed for linking with system-zlib 1.12 ./configure \ 1.13 --prefix=/usr \
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/ghostscript/stuff/CVE-2023-36664-1.patch Fri Mar 08 13:06:31 2024 +0000 2.3 @@ -0,0 +1,143 @@ 2.4 +From 505eab7782b429017eb434b2b95120855f2b0e3c Mon Sep 17 00:00:00 2001 2.5 +From: Chris Liddell <chris.liddell@artifex.com> 2.6 +Date: Wed, 7 Jun 2023 10:23:06 +0100 2.7 +Subject: [PATCH] Bug 706761: Don't "reduce" %pipe% file names for permission 2.8 + validation 2.9 + 2.10 +For regular file names, we try to simplfy relative paths before we use them. 2.11 + 2.12 +Because the %pipe% device can, effectively, accept command line calls, we 2.13 +shouldn't be simplifying that string, because the command line syntax can end 2.14 +up confusing the path simplifying code. That can result in permitting a pipe 2.15 +command which does not match what was originally permitted. 2.16 + 2.17 +Special case "%pipe" in the validation code so we always deal with the entire 2.18 +string. 2.19 +--- 2.20 + base/gpmisc.c | 31 +++++++++++++++++++-------- 2.21 + base/gslibctx.c | 56 ++++++++++++++++++++++++++++++++++++------------- 2.22 + 2 files changed, 64 insertions(+), 23 deletions(-) 2.23 + 2.24 +diff --git a/base/gpmisc.c b/base/gpmisc.c 2.25 +index 5f39ebba7..2fb87f769 100644 2.26 +--- a/base/gpmisc.c 2.27 ++++ b/base/gpmisc.c 2.28 +@@ -1076,16 +1076,29 @@ gp_validate_path_len(const gs_memory_t *mem, 2.29 + && !memcmp(path + cdirstrl, dirsepstr, dirsepstrl)) { 2.30 + prefix_len = 0; 2.31 + } 2.32 +- rlen = len+1; 2.33 +- bufferfull = (char *)gs_alloc_bytes(mem->thread_safe_memory, rlen + prefix_len, "gp_validate_path"); 2.34 +- if (bufferfull == NULL) 2.35 +- return gs_error_VMerror; 2.36 +- 2.37 +- buffer = bufferfull + prefix_len; 2.38 +- if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) 2.39 +- return gs_error_invalidfileaccess; 2.40 +- buffer[rlen] = 0; 2.41 + 2.42 ++ /* "%pipe%" do not follow the normal rules for path definitions, so we 2.43 ++ don't "reduce" them to avoid unexpected results 2.44 ++ */ 2.45 ++ if (len > 5 && memcmp(path, "%pipe", 5) != 0) { 2.46 ++ bufferfull = buffer = (char *)gs_alloc_bytes(mem->thread_safe_memory, len + 1, "gp_validate_path"); 2.47 ++ if (buffer == NULL) 2.48 ++ return gs_error_VMerror; 2.49 ++ memcpy(buffer, path, len); 2.50 ++ buffer[len] = 0; 2.51 ++ rlen = len; 2.52 ++ } 2.53 ++ else { 2.54 ++ rlen = len+1; 2.55 ++ bufferfull = (char *)gs_alloc_bytes(mem->thread_safe_memory, rlen + prefix_len, "gp_validate_path"); 2.56 ++ if (bufferfull == NULL) 2.57 ++ return gs_error_VMerror; 2.58 ++ 2.59 ++ buffer = bufferfull + prefix_len; 2.60 ++ if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) 2.61 ++ return gs_error_invalidfileaccess; 2.62 ++ buffer[rlen] = 0; 2.63 ++ } 2.64 + while (1) { 2.65 + switch (mode[0]) 2.66 + { 2.67 +diff --git a/base/gslibctx.c b/base/gslibctx.c 2.68 +index eb566ed06..d2a1aa91d 100644 2.69 +--- a/base/gslibctx.c 2.70 ++++ b/base/gslibctx.c 2.71 +@@ -740,14 +740,28 @@ gs_add_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, co 2.72 + return gs_error_rangecheck; 2.73 + } 2.74 + 2.75 +- rlen = len+1; 2.76 +- buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gp_validate_path"); 2.77 +- if (buffer == NULL) 2.78 +- return gs_error_VMerror; 2.79 ++ /* "%pipe%" do not follow the normal rules for path definitions, so we 2.80 ++ don't "reduce" them to avoid unexpected results 2.81 ++ */ 2.82 ++ if (len > 5 && memcmp(path, "%pipe", 5) != 0) { 2.83 ++ buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_add_control_path_len"); 2.84 ++ if (buffer == NULL) 2.85 ++ return gs_error_VMerror; 2.86 ++ memcpy(buffer, path, len); 2.87 ++ buffer[len] = 0; 2.88 ++ rlen = len; 2.89 ++ } 2.90 ++ else { 2.91 ++ rlen = len + 1; 2.92 + 2.93 +- if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) 2.94 +- return gs_error_invalidfileaccess; 2.95 +- buffer[rlen] = 0; 2.96 ++ buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gs_add_control_path_len"); 2.97 ++ if (buffer == NULL) 2.98 ++ return gs_error_VMerror; 2.99 ++ 2.100 ++ if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) 2.101 ++ return gs_error_invalidfileaccess; 2.102 ++ buffer[rlen] = 0; 2.103 ++ } 2.104 + 2.105 + n = control->num; 2.106 + for (i = 0; i < n; i++) 2.107 +@@ -833,14 +847,28 @@ gs_remove_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, 2.108 + return gs_error_rangecheck; 2.109 + } 2.110 + 2.111 +- rlen = len+1; 2.112 +- buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gp_validate_path"); 2.113 +- if (buffer == NULL) 2.114 +- return gs_error_VMerror; 2.115 ++ /* "%pipe%" do not follow the normal rules for path definitions, so we 2.116 ++ don't "reduce" them to avoid unexpected results 2.117 ++ */ 2.118 ++ if (len > 5 && memcmp(path, "%pipe", 5) != 0) { 2.119 ++ buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_remove_control_path_len"); 2.120 ++ if (buffer == NULL) 2.121 ++ return gs_error_VMerror; 2.122 ++ memcpy(buffer, path, len); 2.123 ++ buffer[len] = 0; 2.124 ++ rlen = len; 2.125 ++ } 2.126 ++ else { 2.127 ++ rlen = len+1; 2.128 + 2.129 +- if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) 2.130 +- return gs_error_invalidfileaccess; 2.131 +- buffer[rlen] = 0; 2.132 ++ buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gs_remove_control_path_len"); 2.133 ++ if (buffer == NULL) 2.134 ++ return gs_error_VMerror; 2.135 ++ 2.136 ++ if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) 2.137 ++ return gs_error_invalidfileaccess; 2.138 ++ buffer[rlen] = 0; 2.139 ++ } 2.140 + 2.141 + n = control->num; 2.142 + for (i = 0; i < n; i++) { 2.143 +-- 2.144 +2.34.1 2.145 + 2.146 +
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/ghostscript/stuff/CVE-2023-36664-2.patch Fri Mar 08 13:06:31 2024 +0000 3.3 @@ -0,0 +1,57 @@ 3.4 +From 0974e4f2ac0005d3731e0b5c13ebc7e965540f4d Mon Sep 17 00:00:00 2001 3.5 +From: Chris Liddell <chris.liddell@artifex.com> 3.6 +Date: Wed, 14 Jun 2023 09:08:12 +0100 3.7 +Subject: [PATCH] Bug 706778: 706761 revisit 3.8 + 3.9 +Two problems with the original commit. The first a silly typo inverting the 3.10 +logic of a test. 3.11 + 3.12 +The second was forgetting that we actually actually validate two candidate 3.13 +strings for pipe devices. One with the expected "%pipe%" prefix, the other 3.14 +using the pipe character prefix: "|". 3.15 + 3.16 +This addresses both those. 3.17 +--- 3.18 + base/gpmisc.c | 2 +- 3.19 + base/gslibctx.c | 4 ++-- 3.20 + 2 files changed, 3 insertions(+), 3 deletions(-) 3.21 + 3.22 +diff --git a/base/gpmisc.c b/base/gpmisc.c 3.23 +index 58511270e..2b0064bea 100644 3.24 +--- a/base/gpmisc.c 3.25 ++++ b/base/gpmisc.c 3.26 +@@ -1081,7 +1081,7 @@ gp_validate_path_len(const gs_memory_t *mem, 3.27 + /* "%pipe%" do not follow the normal rules for path definitions, so we 3.28 + don't "reduce" them to avoid unexpected results 3.29 + */ 3.30 +- if (len > 5 && memcmp(path, "%pipe", 5) != 0) { 3.31 ++ if (path[0] == '|' || (len > 5 && memcmp(path, "%pipe", 5) == 0)) { 3.32 + bufferfull = buffer = (char *)gs_alloc_bytes(mem->thread_safe_memory, len + 1, "gp_validate_path"); 3.33 + if (buffer == NULL) 3.34 + return gs_error_VMerror; 3.35 +diff --git a/base/gslibctx.c b/base/gslibctx.c 3.36 +index d2a1aa91d..42af99090 100644 3.37 +--- a/base/gslibctx.c 3.38 ++++ b/base/gslibctx.c 3.39 +@@ -743,7 +743,7 @@ gs_add_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, co 3.40 + /* "%pipe%" do not follow the normal rules for path definitions, so we 3.41 + don't "reduce" them to avoid unexpected results 3.42 + */ 3.43 +- if (len > 5 && memcmp(path, "%pipe", 5) != 0) { 3.44 ++ if (path[0] == '|' || (len > 5 && memcmp(path, "%pipe", 5) == 0)) { 3.45 + buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_add_control_path_len"); 3.46 + if (buffer == NULL) 3.47 + return gs_error_VMerror; 3.48 +@@ -850,7 +850,7 @@ gs_remove_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, 3.49 + /* "%pipe%" do not follow the normal rules for path definitions, so we 3.50 + don't "reduce" them to avoid unexpected results 3.51 + */ 3.52 +- if (len > 5 && memcmp(path, "%pipe", 5) != 0) { 3.53 ++ if (path[0] == '|' || (len > 5 && memcmp(path, "%pipe", 5) == 0)) { 3.54 + buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_remove_control_path_len"); 3.55 + if (buffer == NULL) 3.56 + return gs_error_VMerror; 3.57 +-- 3.58 +2.34.1 3.59 + 3.60 +