Hi, Proposed debdiff aiming for jessie is attached.
Regards, Salvatore
diff -Nru sudo-1.8.10p3/debian/changelog sudo-1.8.10p3/debian/changelog --- sudo-1.8.10p3/debian/changelog 2015-01-19 06:56:53.000000000 +0100 +++ sudo-1.8.10p3/debian/changelog 2015-02-18 17:55:25.000000000 +0100 @@ -1,3 +1,13 @@ +sudo (1.8.10p3-1+deb8u2) testing-proposed-updates; urgency=medium + + * Add CVE-2014-9680-1.patch patch. + CVE-2014-9680: unsafe handling of TZ environment variable. (Closes: #772707) + * Add CVE-2014-9680-2.patch patch. + Documents that a leading ':' is skipped when checking TZ for a + fully-qualified path name. + + -- Salvatore Bonaccorso <car...@debian.org> Wed, 18 Feb 2015 17:50:12 +0100 + sudo (1.8.10p3-1+deb8u1) testing-proposed-updates; urgency=medium * Non-maintainer upload. diff -Nru sudo-1.8.10p3/debian/patches/CVE-2014-9680-1.patch sudo-1.8.10p3/debian/patches/CVE-2014-9680-1.patch --- sudo-1.8.10p3/debian/patches/CVE-2014-9680-1.patch 1970-01-01 01:00:00.000000000 +0100 +++ sudo-1.8.10p3/debian/patches/CVE-2014-9680-1.patch 2015-02-18 17:55:25.000000000 +0100 @@ -0,0 +1,380 @@ +Description: CVE-2014-9680: unsafe handling of TZ environment variable + The TZ environment variable was passed through unchecked. Most libc + tzset() implementations support passing an absolute pathname in the time + zone to point to an arbitrary, user-controlled file. This may be used + to exploit bugs in the C library's TZ parser or open files the user + would not otherwise have access to. Arbitrary file access via TZ could + also be used in a denial of service attack by reading from a file or + fifo that will block. +Origin: backport, http://www.sudo.ws/repos/sudo/rev/650ac6938b59, + http://www.sudo.ws/repos/sudo/rev/ac1467f71ac0 +Bug-Debian: https://bugs.debian.org/772707 +Forwarded: not-needed +Author: Todd C. Miller <todd.mil...@courtesan.com> +Author: Salvatore Bonaccorso <car...@debian.org> +Last-Update: 2015-02-18 +Applied-Upstream: 1.8.12 + +--- a/configure ++++ b/configure +@@ -882,6 +882,7 @@ with_timedir + with_rundir + with_vardir + with_iologdir ++with_tzdir + with_sendmail + with_sudoers_mode + with_sudoers_uid +@@ -1670,6 +1671,7 @@ Optional Packages: + --with-rundir=DIR path to the sudo time stamp parent dir + --with-vardir=DIR path to the sudo var dir + --with-iologdir=DIR directory to store sudo I/O log files in ++ --with-tzdir=DIR path to the time zone data directory + --with-sendmail set path to sendmail + --without-sendmail do not send mail at all + --with-sudoers-mode mode of sudoers file (defaults to 0440) +@@ -4773,6 +4775,16 @@ fi + + + ++# Check whether --with-tzdir was given. ++if test "${with_tzdir+set}" = set; then : ++ withval=$with_tzdir; case $with_tzdir in ++ yes) as_fn_error $? "\"must give --with-tzdir an argument.\"" "$LINENO" 5 ++ ;; ++esac ++fi ++ ++ ++ + # Check whether --with-sendmail was given. + if test "${with_sendmail+set}" = set; then : + withval=$with_sendmail; case $with_sendmail in +@@ -21483,6 +21495,27 @@ EOF + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $iolog_dir" >&5 + $as_echo "$iolog_dir" >&6; } + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking time zone data directory" >&5 ++$as_echo_n "checking time zone data directory... " >&6; } ++tzdir="$with_tzdir" ++if test -z "$tzdir"; then ++ tzdir=no ++ for d in /usr/share /usr/share/lib /usr/lib /etc; do ++ if test -d "$d/zoneinfo"; then ++ tzdir="$d/zoneinfo" ++ break ++ fi ++ done ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tzdir" >&5 ++$as_echo "$tzdir" >&6; } ++if test "${tzdir}" != "no"; then ++ cat >>confdefs.h <<EOF ++#define _PATH_ZONEINFO "$tzdir" ++EOF ++ ++fi ++ + + + ac_c_werror_flag=yes +--- a/configure.ac ++++ b/configure.ac +@@ -816,6 +816,12 @@ AC_ARG_WITH(iologdir, [AS_HELP_STRING([- + ;; + esac]) + ++AC_ARG_WITH(tzdir, [AS_HELP_STRING([--with-tzdir=DIR], [path to the time zone data directory])], ++[case $with_tzdir in ++ yes) AC_MSG_ERROR(["must give --with-tzdir an argument."]) ++ ;; ++esac]) ++ + AC_ARG_WITH(sendmail, [AS_HELP_STRING([--with-sendmail], [set path to sendmail]) + AS_HELP_STRING([--without-sendmail], [do not send mail at all])], + [case $with_sendmail in +@@ -3446,6 +3452,7 @@ SUDO_LOGFILE + SUDO_RUNDIR + SUDO_VARDIR + SUDO_IO_LOGDIR ++SUDO_TZDIR + + dnl + dnl Turn warnings into errors. +--- a/doc/sudoers.cat ++++ b/doc/sudoers.cat +@@ -1628,19 +1628,35 @@ SSUUDDOOEERRSS OOPPTTIIOONN + LLiissttss tthhaatt ccaann bbee uusseedd iinn aa bboooolleeaann ccoonntteexxtt: + + env_check Environment variables to be removed from the user's +- environment if the variable's value contains `%' or `/' ++ environment unless they are considered ``safe''. ++ For all variables except TZ, ``safe'' means that the ++ variable's value does not contain any `%' or `/' + characters. This can be used to guard against printf- + style format vulnerabilities in poorly-written +- programs. The argument may be a double-quoted, space- +- separated list or a single value without double-quotes. +- The list can be replaced, added to, deleted from, or +- disabled by using the =, +=, -=, and ! operators +- respectively. Regardless of whether the env_reset +- option is enabled or disabled, variables specified by +- env_check will be preserved in the environment if they +- pass the aforementioned check. The default list of +- environment variables to check is displayed when ssuuddoo +- is run by root with the --VV option. ++ programs. The TZ variable is considered unsafe if any ++ of the following are true: ++ ++ ++oo It consists of a fully-qualified path name that ++ does not match the location of the _z_o_n_e_i_n_f_o ++ directory. ++ ++ ++oo It contains a _._. path element. ++ ++ ++oo It contains white space or non-printable ++ characters. ++ ++ ++oo It is longer than the value of PATH_MAX. ++ ++ The argument may be a double-quoted, space-separated ++ list or a single value without double-quotes. The list ++ can be replaced, added to, deleted from, or disabled by ++ using the =, +=, -=, and ! operators respectively. ++ Regardless of whether the env_reset option is enabled ++ or disabled, variables specified by env_check will be ++ preserved in the environment if they pass the ++ aforementioned check. The default list of environment ++ variables to check is displayed when ssuuddoo is run by ++ root with the --VV option. + + env_delete Environment variables to be removed from the user's + environment when the _e_n_v___r_e_s_e_t option is not in effect. +--- a/doc/sudoers.man.in ++++ b/doc/sudoers.man.in +@@ -3336,14 +3336,45 @@ The default value is + \fBLists that can be used in a boolean context\fR: + .TP 18n + env_check +-Environment variables to be removed from the user's environment if +-the variable's value contains ++Environment variables to be removed from the user's environment ++unless they are considered ++\(lqsafe\(rq. ++For all variables except ++\fRTZ\fR, ++\(lqsafe\(rq ++means that the variable's value does not contain any + \(oq%\(cq + or + \(oq/\(cq + characters. + This can be used to guard against printf-style format vulnerabilities + in poorly-written programs. ++The ++\fRTZ\fR ++variable is considered unsafe if any of the following are true: ++.PP ++.RS 18n ++.PD 0 ++.TP 4n ++\fB\(bu\fR ++It consists of a fully-qualified path name that does not match ++the location of the ++\fIzoneinfo\fR ++directory. ++.PD ++.TP 4n ++\fB\(bu\fR ++It contains a ++\fI..\fR ++path element. ++.TP 4n ++\fB\(bu\fR ++It contains white space or non-printable characters. ++.TP 4n ++\fB\(bu\fR ++It is longer than the value of ++\fRPATH_MAX\fR. ++.PP + The argument may be a double-quoted, space-separated list or a + single value without double-quotes. + The list can be replaced, added to, deleted from, or disabled by using +@@ -3365,6 +3396,7 @@ is run by root with + the + \fB\-V\fR + option. ++.RE + .TP 18n + env_delete + Environment variables to be removed from the user's environment when the +--- a/doc/sudoers.mdoc.in ++++ b/doc/sudoers.mdoc.in +@@ -3095,14 +3095,39 @@ The default value is + .Sy Lists that can be used in a boolean context : + .Bl -tag -width 16n + .It env_check +-Environment variables to be removed from the user's environment if +-the variable's value contains ++Environment variables to be removed from the user's environment ++unless they are considered ++.Dq safe . ++For all variables except ++.Li TZ , ++.Dq safe ++means that the variable's value does not contain any + .Ql % + or + .Ql / + characters. + This can be used to guard against printf-style format vulnerabilities + in poorly-written programs. ++The ++.Li TZ ++variable is considered unsafe if any of the following are true: ++.Bl -bullet ++.It ++It consists of a fully-qualified path name that does not match ++the location of the ++.Pa zoneinfo ++directory. ++.It ++It contains a ++.Pa .. ++path element. ++.It ++It contains white space or non-printable characters. ++.It ++It is longer than the value of ++.Li PATH_MAX . ++.El ++.Pp + The argument may be a double-quoted, space-separated list or a + single value without double-quotes. + The list can be replaced, added to, deleted from, or disabled by using +--- a/m4/sudo.m4 ++++ b/m4/sudo.m4 +@@ -119,6 +119,26 @@ fi + ])dnl + + dnl ++dnl Detect time zone file directory, if any. ++dnl ++AC_DEFUN([SUDO_TZDIR], [AC_MSG_CHECKING(time zone data directory) ++tzdir="$with_tzdir" ++if test -z "$tzdir"; then ++ tzdir=no ++ for d in /usr/share /usr/share/lib /usr/lib /etc; do ++ if test -d "$d/zoneinfo"; then ++ tzdir="$d/zoneinfo" ++ break ++ fi ++ done ++fi ++AC_MSG_RESULT([$tzdir]) ++if test "${tzdir}" != "no"; then ++ SUDO_DEFINE_UNQUOTED(_PATH_ZONEINFO, "$tzdir") ++fi ++])dnl ++ ++dnl + dnl Parent directory for time stamp dir. + dnl + AC_DEFUN([SUDO_RUNDIR], [AC_MSG_CHECKING(for sudo run dir location) +--- a/pathnames.h.in ++++ b/pathnames.h.in +@@ -178,3 +178,7 @@ + #ifndef _PATH_NETSVC_CONF + #undef _PATH_NETSVC_CONF + #endif /* _PATH_NETSVC_CONF */ ++ ++#ifndef _PATH_ZONEINFO ++# undef _PATH_ZONEINFO ++#endif /* _PATH_ZONEINFO */ +--- a/plugins/sudoers/env.c ++++ b/plugins/sudoers/env.c +@@ -197,6 +197,7 @@ static const char *initial_checkenv_tabl + "LC_*", + "LINGUAS", + "TERM", ++ "TZ", + NULL + }; + +@@ -212,7 +213,6 @@ static const char *initial_keepenv_table + "PATH", + "PS1", + "PS2", +- "TZ", + "XAUTHORITY", + "XAUTHORIZATION", + NULL +@@ -576,6 +576,54 @@ matches_env_delete(const char *var) + } + + /* ++ * Sanity-check the TZ environment variable. ++ * On many systems it is possible to set this to a pathname. ++ */ ++static bool ++tz_is_sane(const char *tzval) ++{ ++ const char *cp; ++ char lastch; ++ debug_decl(tz_is_sane, SUDO_DEBUG_ENV) ++ ++ /* tzcode treats a value beginning with a ':' as a path. */ ++ if (tzval[0] == ':') ++ tzval++; ++ ++ /* Reject fully-qualified TZ that doesn't being with the zoneinfo dir. */ ++ if (tzval[0] == '/') { ++#ifdef _PATH_ZONEINFO ++ if (strncmp(tzval, _PATH_ZONEINFO, sizeof(_PATH_ZONEINFO) - 1) != 0 || ++ tzval[sizeof(_PATH_ZONEINFO) - 1] != '/') ++ debug_return_bool(false); ++#else ++ /* Assume the worst. */ ++ debug_return_bool(false); ++#endif ++ } ++ ++ /* ++ * Make sure TZ only contains printable non-space characters ++ * and does not contain a '..' path element. ++ */ ++ lastch = '/'; ++ for (cp = tzval; *cp != '\0'; cp++) { ++ if (isspace((unsigned char)*cp) || !isprint((unsigned char)*cp)) ++ debug_return_bool(false); ++ if (lastch == '/' && cp[0] == '.' && cp[1] == '.' && ++ (cp[2] == '/' || cp[2] == '\0')) ++ debug_return_bool(false); ++ lastch = *cp; ++ } ++ ++ /* Reject extra long TZ values (even if not a path). */ ++ if ((size_t)(cp - tzval) >= PATH_MAX) ++ debug_return_bool(false); ++ ++ debug_return_bool(true); ++} ++ ++/* + * Apply the env_check list. + * Returns true if the variable is allowed, false if denied + * or -1 if no match. +@@ -599,7 +647,12 @@ matches_env_check(const char *var) + iswild = false; + if (strncmp(cur->value, var, len) == 0 && + (iswild || var[len] == '=')) { +- keepit = !strpbrk(var, "/%"); ++ if (strncmp(var, "TZ=", 3) == 0) { ++ /* Special case for TZ */ ++ keepit = tz_is_sane(var + 3); ++ } else { ++ keepit = !strpbrk(var, "/%"); ++ } + break; + } + } diff -Nru sudo-1.8.10p3/debian/patches/CVE-2014-9680-2.patch sudo-1.8.10p3/debian/patches/CVE-2014-9680-2.patch --- sudo-1.8.10p3/debian/patches/CVE-2014-9680-2.patch 1970-01-01 01:00:00.000000000 +0100 +++ sudo-1.8.10p3/debian/patches/CVE-2014-9680-2.patch 2015-02-18 17:55:25.000000000 +0100 @@ -0,0 +1,56 @@ +Description: Document handling of leading ':' when checking TZ variable + Document that a leading ':' is skipped when checking TZ for a + fully-qualified path name. +Origin: backport, http://www.sudo.ws/repos/sudo/rev/91859f613b88, + http://www.sudo.ws/repos/sudo/rev/579b02f0dbe0 +Forwarded: not-needed +Author: Todd C. Miller <todd.mil...@courtesan.com> +Author: Salvatore Bonaccorso <car...@debian.org> +Last-Update: 2015-02-18 +Applied-Upstream: 1.8.12 + +--- a/doc/sudoers.cat ++++ b/doc/sudoers.cat +@@ -1636,9 +1636,9 @@ SSUUDDOOEERRSS OOPPTTIIOONN + programs. The TZ variable is considered unsafe if any + of the following are true: + +- ++oo It consists of a fully-qualified path name that +- does not match the location of the _z_o_n_e_i_n_f_o +- directory. ++ ++oo It consists of a fully-qualified path name, ++ optionally prefixed with a colon (`:'), that does ++ not match the location of the _z_o_n_e_i_n_f_o directory. + + ++oo It contains a _._. path element. + +--- a/doc/sudoers.man.in ++++ b/doc/sudoers.man.in +@@ -3357,8 +3357,10 @@ variable is considered unsafe if any of + .PD 0 + .TP 4n + \fB\(bu\fR +-It consists of a fully-qualified path name that does not match +-the location of the ++It consists of a fully-qualified path name, ++optionally prefixed with a colon ++(\(oq:\&\(cq), ++that does not match the location of the + \fIzoneinfo\fR + directory. + .PD +--- a/doc/sudoers.mdoc.in ++++ b/doc/sudoers.mdoc.in +@@ -3113,8 +3113,10 @@ The + variable is considered unsafe if any of the following are true: + .Bl -bullet + .It +-It consists of a fully-qualified path name that does not match +-the location of the ++It consists of a fully-qualified path name, ++optionally prefixed with a colon ++.Pq Ql :\& , ++that does not match the location of the + .Pa zoneinfo + directory. + .It diff -Nru sudo-1.8.10p3/debian/patches/series sudo-1.8.10p3/debian/patches/series --- sudo-1.8.10p3/debian/patches/series 2015-01-19 06:56:17.000000000 +0100 +++ sudo-1.8.10p3/debian/patches/series 2015-02-18 17:55:25.000000000 +0100 @@ -1,3 +1,5 @@ typo-in-classic-insults.diff paths-in-samples.diff Fix-for-broken-FQDN-host-specifications.diff +CVE-2014-9680-1.patch +CVE-2014-9680-2.patch
signature.asc
Description: Digital signature