From fd1461879c63c608617d30524183a71370a7451c Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Mon, 30 May 2016 21:45:00 +0300 Subject: [PATCH] gnu: mcrypt: Fix CVE-2012-4409, CVE-2012-4426, CVE-2012-4527. * gnu/packages/mcrypt.scm (mcrypt)[source]: Add patches. * gnu/packages/patches/mcrypt-CVE-2012-4409.patch, gnu/packages/patches/mcrypt-CVE-2012-4426.patch, gnu/packages/patches/mcrypt-CVE-2012-4527.patch: New variables. * gnu/local.mk (dist_patch_DATA): Add them. --- gnu/local.mk | 3 + gnu/packages/mcrypt.scm | 7 +- .../patches/mcrypt-CVE-2012-4409.patch | 33 ++++++ .../patches/mcrypt-CVE-2012-4426.patch | 36 ++++++ .../patches/mcrypt-CVE-2012-4527.patch | 111 ++++++++++++++++++ 5 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/mcrypt-CVE-2012-4409.patch create mode 100644 gnu/packages/patches/mcrypt-CVE-2012-4426.patch create mode 100644 gnu/packages/patches/mcrypt-CVE-2012-4527.patch diff --git a/gnu/local.mk b/gnu/local.mk index d97c2218b5..e94920e554 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -636,6 +636,9 @@ dist_patch_DATA = \ %D%/packages/patches/matplotlib-setupext-tk.patch \ %D%/packages/patches/maxima-defsystem-mkdir.patch \ %D%/packages/patches/mcron-install.patch \ + %D%/packages/patches/mcrypt-CVE-2012-4409.patch \ + %D%/packages/patches/mcrypt-CVE-2012-4426.patch \ + %D%/packages/patches/mcrypt-CVE-2012-4527.patch \ %D%/packages/patches/mhash-keygen-test-segfault.patch \ %D%/packages/patches/mit-krb5-CVE-2015-8629.patch \ %D%/packages/patches/mit-krb5-CVE-2015-8630.patch \ diff --git a/gnu/packages/mcrypt.scm b/gnu/packages/mcrypt.scm index a683ad7ac9..7ac0b92d81 100644 --- a/gnu/packages/mcrypt.scm +++ b/gnu/packages/mcrypt.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014 Eric Bavier +;;; Copyright © 2016 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -36,7 +37,11 @@ version ".tar.gz")) (sha256 (base32 - "161031n1w9pb4yzz9i47szc12a4mwpcpvyxnvafsik2l9s2aliai")))) + "161031n1w9pb4yzz9i47szc12a4mwpcpvyxnvafsik2l9s2aliai")) + (patches (search-patches + "mcrypt-CVE-2012-4409.patch" + "mcrypt-CVE-2012-4426.patch" + "mcrypt-CVE-2012-4527.patch")))) (build-system gnu-build-system) (inputs `(("zlib" ,zlib) diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4409.patch b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch new file mode 100644 index 0000000000..60cf8e0430 --- /dev/null +++ b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch @@ -0,0 +1,33 @@ +From 4876e3a692739bb9ca00d0f500fd5f4b3eb16ce3 Mon Sep 17 00:00:00 2001 +From: Tom Callaway +Date: Fri, 7 Sep 2012 11:39:29 -0400 +Subject: apply fix for CVE-2012-4409 (thanks to Raphael Geissert) + +--- + mcrypt-CVE-2012-4409.patch | 12 ++++++++++++ + mcrypt.spec | 10 +++++++++- + 2 files changed, 21 insertions(+), 1 deletion(-) + create mode 100644 mcrypt-CVE-2012-4409.patch + +diff --git a/mcrypt-CVE-2012-4409.patch b/mcrypt-CVE-2012-4409.patch +new file mode 100644 +index 0000000..747f428 +--- /dev/null ++++ b/mcrypt-CVE-2012-4409.patch +@@ -0,0 +1,12 @@ ++diff -up mcrypt-2.6.8/src/extra.c.CVE-2012-4409 mcrypt-2.6.8/src/extra.c ++--- mcrypt-2.6.8/src/extra.c.CVE-2012-4409 2012-09-07 11:00:55.906870746 -0400 +++++ mcrypt-2.6.8/src/extra.c 2012-09-07 11:00:27.967858365 -0400 ++@@ -242,6 +242,8 @@ int check_file_head(FILE * fstream, char ++ if (m_getbit(0, sflag) != 0) { /* if the first bit is set */ ++ *salt_size = m_setbit(0, sflag, 0); ++ if (*salt_size > 0) { +++ if (*salt_size > sizeof(tmp_buf)) +++ err_quit(_("Salt is too long\n")); ++ fread(tmp_buf, 1, *salt_size, ++ fstream); ++ memmove(salt, tmp_buf, *salt_size); + +-- +cgit v0.12 + diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4426.patch b/gnu/packages/patches/mcrypt-CVE-2012-4426.patch new file mode 100644 index 0000000000..61c197b0c9 --- /dev/null +++ b/gnu/packages/patches/mcrypt-CVE-2012-4426.patch @@ -0,0 +1,36 @@ +diff --git a/mcrypt-CVE-2012-4426.patch b/mcrypt-CVE-2012-4426.patch +new file mode 100644 +index 0000000..747f428 +--- mcrypt-2.6.8/src/errors.c ++++ mcrypt-2.6.8/src/errors.c +@@ -25,24 +25,24 @@ + + void err_quit(char *errmsg) + { +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + exit(-1); + } + + void err_warn(char *errmsg) + { + if (quiet <= 1) +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + } + + void err_info(char *errmsg) + { + if (quiet == 0) +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + } + + void err_crit(char *errmsg) + { + if (quiet <= 2) +- fprintf(stderr, errmsg); ++ fprintf(stderr, "%s", errmsg); + } + +--- diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4527.patch b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch new file mode 100644 index 0000000000..d931dd174b --- /dev/null +++ b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch @@ -0,0 +1,111 @@ +From b0716eac4e800a0ea53e1b949250f671702f28a0 Mon Sep 17 00:00:00 2001 +From: Tom Callaway +Date: Tue, 30 Oct 2012 15:39:24 -0400 +Subject: apply workaround to CVE-2012-4527 + +--- + mcrypt-CVE-2012-4527-80-width-patch | 91 +++++++++++++++++++++++++++++++++++++ + mcrypt.spec | 10 +++- + 2 files changed, 100 insertions(+), 1 deletion(-) + create mode 100644 mcrypt-CVE-2012-4527-80-width-patch + +diff --git a/mcrypt-CVE-2012-4527-80-width-patch b/mcrypt-CVE-2012-4527-80-width-patch +new file mode 100644 +index 0000000..0eb94d8 +--- /dev/null ++++ b/mcrypt-CVE-2012-4527-80-width-patch +@@ -0,0 +1,91 @@ ++--- mcrypt-2.6.8.orig/src/mcrypt.c +++++ mcrypt-2.6.8/src/mcrypt.c ++@@ -41,6 +41,8 @@ ++ # include ++ #endif ++ +++#define WIDTH 80 +++ ++ static char rcsid[] = ++ "$Id: mcrypt.c,v 1.2 2007/11/07 17:10:21 nmav Exp $"; ++ ++@@ -482,7 +484,7 @@ ++ #ifdef HAVE_STAT ++ if (stream_flag == FALSE) { ++ if (is_normal_file(file[i]) == FALSE) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: %s is not a regular file. Skipping...\n"), ++ program_name, file[i]); ++@@ -501,7 +503,7 @@ ++ dinfile = file[i]; ++ if ((isatty(fileno((FILE *) (stdin))) == 1) ++ && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: Encrypted data will not be read from a terminal.\n"), ++ program_name); ++@@ -520,7 +522,7 @@ ++ einfile = file[i]; ++ if ((isatty(fileno((FILE *) (stdout))) == 1) ++ && (stream_flag == TRUE) && (force == 0)) { /* not a tty */ ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: Encrypted data will not be written to a terminal.\n"), ++ program_name); ++@@ -544,7 +546,7 @@ ++ strcpy(outfile, einfile); ++ /* if file has already the .nc ignore it */ ++ if (strstr(outfile, ".nc") != NULL) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("%s: file %s has the .nc suffix... skipping...\n"), ++ program_name, outfile); ++@@ -590,10 +592,10 @@ ++ ++ if (x == 0) { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, _("File %s was decrypted.\n"), dinfile); +++ snprintf(tmperr, WIDTH, _("File %s was decrypted.\n"), dinfile); ++ err_warn(tmperr); ++ } else { ++- sprintf(tmperr, _("Stdin was decrypted.\n")); +++ snprintf(tmperr, WIDTH, _("Stdin was decrypted.\n")); ++ err_warn(tmperr); ++ } ++ #ifdef HAVE_STAT ++@@ -610,7 +612,7 @@ ++ ++ } else { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("File %s was NOT decrypted successfully.\n"), ++ dinfile); ++@@ -636,10 +638,10 @@ ++ ++ if (x == 0) { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, _("File %s was encrypted.\n"), einfile); +++ snprintf(tmperr, WIDTH, _("File %s was encrypted.\n"), einfile); ++ err_warn(tmperr); ++ } else { ++- sprintf(tmperr, _("Stdin was encrypted.\n")); +++ snprintf(tmperr, WIDTH, _("Stdin was encrypted.\n")); ++ err_warn(tmperr); ++ } ++ #ifdef HAVE_STAT ++@@ -655,7 +657,7 @@ ++ ++ } else { ++ if (stream_flag == FALSE) { ++- sprintf(tmperr, +++ snprintf(tmperr, WIDTH, ++ _ ++ ("File %s was NOT encrypted successfully.\n"), ++ einfile); +-- +cgit v0.12 +