89 lines
5.1 KiB
Diff
89 lines
5.1 KiB
Diff
From 226804980651bb4eb5f3ba3b9d7e992f2eda4710 Mon Sep 17 00:00:00 2001
|
|
From: Cristy <urban-warrior@imagemagick.org>
|
|
Date: Thu, 19 Nov 2020 20:50:44 +0000
|
|
Subject: [PATCH] fix shell injection vulnerability via the -authenticate
|
|
option
|
|
|
|
---
|
|
coders/pdf.c | 46 ++++++++++++++++++++++++++++++++++-------
|
|
config/delegates.xml.in | 4 ++--
|
|
2 files changed, 42 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/coders/pdf.c b/coders/pdf.c
|
|
index d5ed56596..31efd06e5 100644
|
|
--- a/coders/pdf.c
|
|
+++ b/coders/pdf.c
|
|
@@ -368,6 +368,36 @@ static inline void CleanupPDFInfo(PDFInfo *pdf_info)
|
|
pdf_info->profile=DestroyStringInfo(pdf_info->profile);
|
|
}
|
|
|
|
+static char *SanitizeDelegateString(const char *source)
|
|
+{
|
|
+ char
|
|
+ *sanitize_source;
|
|
+
|
|
+ const char
|
|
+ *q;
|
|
+
|
|
+ register char
|
|
+ *p;
|
|
+
|
|
+ static char
|
|
+#if defined(MAGICKCORE_WINDOWS_SUPPORT)
|
|
+ whitelist[] =
|
|
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
|
|
+ "$-_.+!;*(),{}|^~[]`\'><#%/?:@&=";
|
|
+#else
|
|
+ whitelist[] =
|
|
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
|
|
+ "$-_.+!;*(),{}|\\^~[]`\"><#%/?:@&=";
|
|
+#endif
|
|
+
|
|
+ sanitize_source=AcquireString(source);
|
|
+ p=sanitize_source;
|
|
+ q=sanitize_source+strlen(sanitize_source);
|
|
+ for (p+=strspn(p,whitelist); p != q; p+=strspn(p,whitelist))
|
|
+ *p='_';
|
|
+ return(sanitize_source);
|
|
+}
|
|
+
|
|
static Image *ReadPDFImage(const ImageInfo *image_info,ExceptionInfo *exception)
|
|
{
|
|
char
|
|
@@ -585,14 +615,16 @@ static Image *ReadPDFImage(const ImageInfo *image_info,ExceptionInfo *exception)
|
|
if (stop_on_error != MagickFalse)
|
|
(void) ConcatenateMagickString(options,"-dPDFSTOPONERROR ",MaxTextExtent);
|
|
option=GetImageOption(image_info,"authenticate");
|
|
- if ((option != (char *) NULL) &&
|
|
- (strpbrk(option,"&;<>|\"'") == (char *) NULL))
|
|
+ if (option != (char *) NULL)
|
|
{
|
|
char
|
|
- passphrase[MagickPathExtent];
|
|
+ passphrase[MagickPathExtent],
|
|
+ *sanitize_passphrase;
|
|
|
|
+ sanitize_passphrase=SanitizeDelegateString(option);
|
|
(void) FormatLocaleString(passphrase,MagickPathExtent,
|
|
- "\"-sPDFPassword=%s\" ",option);
|
|
+ "'-sPDFPassword=%s' ",sanitize_passphrase);
|
|
+ sanitize_passphrase=DestroyString(sanitize_passphrase);
|
|
(void) ConcatenateMagickString(options,passphrase,MagickPathExtent);
|
|
}
|
|
read_info=CloneImageInfo(image_info);
|
|
diff --git a/config/delegates.xml.in b/config/delegates.xml.in
|
|
index d93387ac1..4fc3acc3f 100644
|
|
--- a/config/delegates.xml.in
|
|
+++ b/config/delegates.xml.in
|
|
@@ -89,8 +89,8 @@
|
|
<delegate decode="pcl:cmyk" stealth="True" command=""@PCLDelegate@" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=@PCLCMYKDevice@" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s""/>
|
|
<delegate decode="pcl:color" stealth="True" command=""@PCLDelegate@" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=@PCLColorDevice@" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s""/>
|
|
<delegate decode="pcl:mono" stealth="True" command=""@PCLDelegate@" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=@PCLMonoDevice@" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s""/>
|
|
- <delegate decode="pdf" encode="eps" mode="bi" command=""@PSDelegate@" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 -sPDFPassword="%a" "-sDEVICE=@GSEPSDevice@" "-sOutputFile=%o" "-f%i""/>
|
|
- <delegate decode="pdf" encode="ps" mode="bi" command=""@PSDelegate@" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=@GSPSDevice@" -sPDFPassword="%a" "-sOutputFile=%o" "-f%i""/>
|
|
+ <delegate decode="pdf" encode="eps" mode="bi" command=""@PSDelegate@" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=@GSEPSDevice@" "-sPDFPassword=%a" "-sOutputFile=%o" "-f%i""/>
|
|
+ <delegate decode="pdf" encode="ps" mode="bi" command=""@PSDelegate@" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=@GSPSDevice@" "-sPDFPassword=%a" "-sOutputFile=%o" "-f%i""/>
|
|
<delegate decode="pnm" encode="trace" command=""@TraceEncodeDelegate@" --svg --output "%o" "%i""/>
|
|
<delegate decode="png" encode="webp" command=""@WebPEncodeDelegate@" -quiet %Q "%i" -o "%o""/>
|
|
<delegate decode="pnm" encode="ilbm" mode="encode" command=""@ILBMEncodeDelegate@" -24if "%i" > "%o""/>
|