Siddhesh Poyarekar 1a6af40
#* CVE-2013-2207 Incorrectly granting access to another user's pseudo-terminal
Siddhesh Poyarekar 1a6af40
#  has been fixed by disabling the use of pt_chown (Bugzilla #15755).
Siddhesh Poyarekar 1a6af40
#  Distributions can re-enable building and using pt_chown via the new configure
Siddhesh Poyarekar 1a6af40
#  option `--enable-pt_chown'.  Enabling the use of pt_chown carries with it
Siddhesh Poyarekar 1a6af40
#  considerable security risks and should only be used if the distribution
Siddhesh Poyarekar 1a6af40
#  understands and accepts the risks.
Siddhesh Poyarekar 1a6af40
#
Siddhesh Poyarekar 1a6af40
#2013-07-21  Siddhesh Poyarekar  <siddhesh@redhat.com>
Siddhesh Poyarekar 1a6af40
#	    Andreas Schwab  <schwab@suse.de>
Siddhesh Poyarekar 1a6af40
#	    Roland McGrath  <roland@hack.frob.com>
Siddhesh Poyarekar 1a6af40
#	    Joseph Myers  <joseph@codesourcery.com>
Siddhesh Poyarekar 1a6af40
#	    Carlos O'Donell  <carlos@redhat.com>
Siddhesh Poyarekar 1a6af40
#
Siddhesh Poyarekar 1a6af40
#	[BZ #15755]
Siddhesh Poyarekar 1a6af40
#	* config.h.in: Define HAVE_PT_CHOWN.
Siddhesh Poyarekar 1a6af40
#	* config.make.in (build-pt-chown): New variable.
Siddhesh Poyarekar 1a6af40
#	* configure.in (--enable-pt_chown): New configure option.
Siddhesh Poyarekar 1a6af40
#	* configure: Regenerate.
Siddhesh Poyarekar 1a6af40
#	* login/Makefile: Include Makeconfig.  Build pt_chown only if
Siddhesh Poyarekar 1a6af40
#	build-pt-chown is enabled.
Siddhesh Poyarekar 1a6af40
#	* sysdeps/unix/grantpt.c (grantpt) [HAVE_PT_CHOWN]: Spawn
Siddhesh Poyarekar 1a6af40
#	pt_chown to fix pty ownership.
Siddhesh Poyarekar 1a6af40
#	* sysdeps/unix/sysv/linux/grantpt.c [HAVE_PT_CHOWN]: Define
Siddhesh Poyarekar 1a6af40
#	CLOSE_ALL_FDS.
Siddhesh Poyarekar 1a6af40
#	* manual/install.texi (Configuring and compiling): Mention
Siddhesh Poyarekar 1a6af40
#	--enable-pt_chown. Add @findex for grantpt.
Siddhesh Poyarekar 1a6af40
#	* INSTALL: Regenerate.
Siddhesh Poyarekar 1a6af40
#
Siddhesh Poyarekar 1a6af40
diff -Nrup a/config.h.in b/config.h.in
Siddhesh Poyarekar 1a6af40
--- a/config.h.in	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/config.h.in	2013-07-24 00:20:07.651301252 -0400
Siddhesh Poyarekar 1a6af40
@@ -232,4 +232,7 @@
Siddhesh Poyarekar 1a6af40
 /* The ARM hard-float ABI is being used.  */
Siddhesh Poyarekar 1a6af40
 #undef HAVE_ARM_PCS_VFP
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
+/* The pt_chown binary is being built and used by grantpt.  */
Siddhesh Poyarekar 1a6af40
+#undef HAVE_PT_CHOWN
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
 #endif
Siddhesh Poyarekar 1a6af40
diff -Nrup a/config.make.in b/config.make.in
Siddhesh Poyarekar 1a6af40
--- a/config.make.in	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/config.make.in	2013-07-24 00:21:15.244176098 -0400
Siddhesh Poyarekar 1a6af40
@@ -101,6 +101,7 @@ force-install = @force_install@
Siddhesh Poyarekar 1a6af40
 link-obsolete-rpc = @link_obsolete_rpc@
Siddhesh Poyarekar 1a6af40
 build-nscd = @build_nscd@
Siddhesh Poyarekar 1a6af40
 use-nscd = @use_nscd@
Siddhesh Poyarekar 1a6af40
+build-pt-chown = @build_pt_chown@
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
 # Build tools.
Siddhesh Poyarekar 1a6af40
 CC = @CC@
Siddhesh Poyarekar 1a6af40
diff -Nrup a/configure b/configure
Siddhesh Poyarekar 1a6af40
--- a/configure	2013-07-24 00:25:10.090174244 -0400
Siddhesh Poyarekar 1a6af40
+++ b/configure	2013-07-24 00:20:07.769174345 -0400
Siddhesh Poyarekar 1a6af40
@@ -653,6 +653,7 @@ multi_arch
Siddhesh Poyarekar 1a6af40
 base_machine
Siddhesh Poyarekar 1a6af40
 add_on_subdirs
Siddhesh Poyarekar 1a6af40
 add_ons
Siddhesh Poyarekar 1a6af40
+build_pt_chown
Siddhesh Poyarekar 1a6af40
 build_nscd
Siddhesh Poyarekar 1a6af40
 link_obsolete_rpc
Siddhesh Poyarekar 1a6af40
 libc_cv_nss_crypt
Siddhesh Poyarekar 1a6af40
@@ -759,6 +760,7 @@ enable_obsolete_rpc
Siddhesh Poyarekar 1a6af40
 enable_systemtap
Siddhesh Poyarekar 1a6af40
 enable_build_nscd
Siddhesh Poyarekar 1a6af40
 enable_nscd
Siddhesh Poyarekar 1a6af40
+enable_pt_chown
Siddhesh Poyarekar 1a6af40
 with_cpu
Siddhesh Poyarekar 1a6af40
 '
Siddhesh Poyarekar 1a6af40
       ac_precious_vars='build_alias
Siddhesh Poyarekar 1a6af40
@@ -1419,6 +1421,7 @@ Optional Features:
Siddhesh Poyarekar 1a6af40
   --enable-systemtap      enable systemtap static probe points [default=no]
Siddhesh Poyarekar 1a6af40
   --disable-build-nscd    disable building and installing the nscd daemon
Siddhesh Poyarekar 1a6af40
   --disable-nscd          library functions will not contact the nscd daemon
Siddhesh Poyarekar 1a6af40
+  --enable-pt_chown       Enable building and installing pt_chown
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
 Optional Packages:
Siddhesh Poyarekar 1a6af40
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
Siddhesh Poyarekar 1a6af40
@@ -3934,6 +3937,19 @@ else
Siddhesh Poyarekar 1a6af40
 fi
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
+# Check whether --enable-pt_chown was given.
Siddhesh Poyarekar 1a6af40
+if test "${enable_pt_chown+set}" = set; then :
Siddhesh Poyarekar 1a6af40
+  enableval=$enable_pt_chown; build_pt_chown=$enableval
Siddhesh Poyarekar 1a6af40
+else
Siddhesh Poyarekar 1a6af40
+  build_pt_chown=no
Siddhesh Poyarekar 1a6af40
+fi
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
+if test $build_pt_chown = yes; then
Siddhesh Poyarekar 1a6af40
+  $as_echo "#define HAVE_PT_CHOWN 1" >>confdefs.h
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
+fi
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
 # The way shlib-versions is used to generate soversions.mk uses a
Siddhesh Poyarekar 1a6af40
 # fairly simplistic model for name recognition that can't distinguish
Siddhesh Poyarekar 1a6af40
 # i486-pc-linux-gnu fully from i486-pc-gnu.  So we mutate a $host_os
Siddhesh Poyarekar 1a6af40
diff -Nrup a/configure.in b/configure.in
Siddhesh Poyarekar 1a6af40
--- a/configure.in	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/configure.in	2013-07-24 00:20:07.658298658 -0400
Siddhesh Poyarekar 1a6af40
@@ -315,6 +315,16 @@ AC_ARG_ENABLE([nscd],
Siddhesh Poyarekar 1a6af40
 	      [use_nscd=$enableval],
Siddhesh Poyarekar 1a6af40
 	      [use_nscd=yes])
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
+AC_ARG_ENABLE([pt_chown],
Siddhesh Poyarekar 1a6af40
+	      [AS_HELP_STRING([--enable-pt_chown],
Siddhesh Poyarekar 1a6af40
+	       [Enable building and installing pt_chown])],
Siddhesh Poyarekar 1a6af40
+	      [build_pt_chown=$enableval],
Siddhesh Poyarekar 1a6af40
+	      [build_pt_chown=no])
Siddhesh Poyarekar 1a6af40
+AC_SUBST(build_pt_chown)
Siddhesh Poyarekar 1a6af40
+if test $build_pt_chown = yes; then
Siddhesh Poyarekar 1a6af40
+  AC_DEFINE(HAVE_PT_CHOWN)
Siddhesh Poyarekar 1a6af40
+fi
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
 # The way shlib-versions is used to generate soversions.mk uses a
Siddhesh Poyarekar 1a6af40
 # fairly simplistic model for name recognition that can't distinguish
Siddhesh Poyarekar 1a6af40
 # i486-pc-linux-gnu fully from i486-pc-gnu.  So we mutate a $host_os
Siddhesh Poyarekar 1a6af40
diff -Nrup a/INSTALL b/INSTALL
Siddhesh Poyarekar 1a6af40
--- a/INSTALL	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/INSTALL	2013-07-24 00:20:07.650300624 -0400
Siddhesh Poyarekar 1a6af40
@@ -128,6 +128,18 @@ will be used, and CFLAGS sets optimizati
Siddhesh Poyarekar 1a6af40
      this can be prevented though there generally is no reason since it
Siddhesh Poyarekar 1a6af40
      creates compatibility problems.
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
+`--enable-pt_chown'
Siddhesh Poyarekar 1a6af40
+     The file `pt_chown' is a helper binary for `grantpt' (*note
Siddhesh Poyarekar 1a6af40
+     Pseudo-Terminals: Allocation.) that is installed setuid root to
Siddhesh Poyarekar 1a6af40
+     fix up pseudo-terminal ownership.  It is not built by default
Siddhesh Poyarekar 1a6af40
+     because systems using the Linux kernel are commonly built with the
Siddhesh Poyarekar 1a6af40
+     `devpts' filesystem enabled and mounted at `/dev/pts', which
Siddhesh Poyarekar 1a6af40
+     manages pseudo-terminal ownership automatically.  By using
Siddhesh Poyarekar 1a6af40
+     `--enable-pt_chown', you may build `pt_chown' and install it
Siddhesh Poyarekar 1a6af40
+     setuid and owned by `root'.  The use of `pt_chown' introduces
Siddhesh Poyarekar 1a6af40
+     additional security risks to the system and you should enable it
Siddhesh Poyarekar 1a6af40
+     only if you understand and accept those risks.
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
 `--build=BUILD-SYSTEM'
Siddhesh Poyarekar 1a6af40
 `--host=HOST-SYSTEM'
Siddhesh Poyarekar 1a6af40
      These options are for cross-compiling.  If you specify both
Siddhesh Poyarekar 1a6af40
diff -Nrup a/login/Makefile b/login/Makefile
Siddhesh Poyarekar 1a6af40
--- a/login/Makefile	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/login/Makefile	2013-07-24 00:20:07.660298670 -0400
Siddhesh Poyarekar 1a6af40
@@ -29,9 +29,15 @@ routines := getutent getutent_r getutid 
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
 CFLAGS-grantpt.c = -DLIBEXECDIR='"$(libexecdir)"'
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
-others = utmpdump pt_chown
Siddhesh Poyarekar 1a6af40
+others = utmpdump
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
+include ../Makeconfig
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
+ifeq (yes,$(build-pt-chown))
Siddhesh Poyarekar 1a6af40
+others += pt_chown
Siddhesh Poyarekar 1a6af40
 others-pie = pt_chown
Siddhesh Poyarekar 1a6af40
 install-others-programs = $(inst_libexecdir)/pt_chown
Siddhesh Poyarekar 1a6af40
+endif
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
 subdir-dirs = programs
Siddhesh Poyarekar 1a6af40
 vpath %.c programs
Siddhesh Poyarekar 1a6af40
diff -Nrup a/manual/install.texi b/manual/install.texi
Siddhesh Poyarekar 1a6af40
--- a/manual/install.texi	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/manual/install.texi	2013-07-24 00:20:07.662298261 -0400
Siddhesh Poyarekar 1a6af40
@@ -155,6 +155,20 @@ if the used tools support it.  By using 
Siddhesh Poyarekar 1a6af40
 prevented though there generally is no reason since it creates
Siddhesh Poyarekar 1a6af40
 compatibility problems.
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
+@pindex pt_chown
Siddhesh Poyarekar 1a6af40
+@findex grantpt
Siddhesh Poyarekar 1a6af40
+@item --enable-pt_chown
Siddhesh Poyarekar 1a6af40
+The file @file{pt_chown} is a helper binary for @code{grantpt}
Siddhesh Poyarekar 1a6af40
+(@pxref{Allocation, Pseudo-Terminals}) that is installed setuid root to
Siddhesh Poyarekar 1a6af40
+fix up pseudo-terminal ownership.  It is not built by default because
Siddhesh Poyarekar 1a6af40
+systems using the Linux kernel are commonly built with the @code{devpts}
Siddhesh Poyarekar 1a6af40
+filesystem enabled and mounted at @file{/dev/pts}, which manages
Siddhesh Poyarekar 1a6af40
+pseudo-terminal ownership automatically.  By using
Siddhesh Poyarekar 1a6af40
+@samp{--enable-pt_chown}, you may build @file{pt_chown} and install it
Siddhesh Poyarekar 1a6af40
+setuid and owned by @code{root}.  The use of @file{pt_chown} introduces
Siddhesh Poyarekar 1a6af40
+additional security risks to the system and you should enable it only if
Siddhesh Poyarekar 1a6af40
+you understand and accept those risks.
Siddhesh Poyarekar 1a6af40
+
Siddhesh Poyarekar 1a6af40
 @item --build=@var{build-system}
Siddhesh Poyarekar 1a6af40
 @itemx --host=@var{host-system}
Siddhesh Poyarekar 1a6af40
 These options are for cross-compiling.  If you specify both options and
Siddhesh Poyarekar 1a6af40
diff -Nrup a/sysdeps/unix/grantpt.c b/sysdeps/unix/grantpt.c
Siddhesh Poyarekar 1a6af40
--- a/sysdeps/unix/grantpt.c	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/sysdeps/unix/grantpt.c	2013-07-24 00:20:07.663299235 -0400
Siddhesh Poyarekar 1a6af40
@@ -173,9 +173,10 @@ grantpt (int fd)
Siddhesh Poyarekar 1a6af40
   retval = 0;
Siddhesh Poyarekar 1a6af40
   goto cleanup;
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
-  /* We have to use the helper program.  */
Siddhesh Poyarekar 1a6af40
+  /* We have to use the helper program if it is available.  */
Siddhesh Poyarekar 1a6af40
  helper:;
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
+#ifdef HAVE_PT_CHOWN
Siddhesh Poyarekar 1a6af40
   pid_t pid = __fork ();
Siddhesh Poyarekar 1a6af40
   if (pid == -1)
Siddhesh Poyarekar 1a6af40
     goto cleanup;
Siddhesh Poyarekar 1a6af40
@@ -190,9 +191,9 @@ grantpt (int fd)
Siddhesh Poyarekar 1a6af40
 	if (__dup2 (fd, PTY_FILENO) < 0)
Siddhesh Poyarekar 1a6af40
 	  _exit (FAIL_EBADF);
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
-#ifdef CLOSE_ALL_FDS
Siddhesh Poyarekar 1a6af40
+# ifdef CLOSE_ALL_FDS
Siddhesh Poyarekar 1a6af40
       CLOSE_ALL_FDS ();
Siddhesh Poyarekar 1a6af40
-#endif
Siddhesh Poyarekar 1a6af40
+# endif
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
       execle (_PATH_PT_CHOWN, basename (_PATH_PT_CHOWN), NULL, NULL);
Siddhesh Poyarekar 1a6af40
       _exit (FAIL_EXEC);
Siddhesh Poyarekar 1a6af40
@@ -231,6 +232,7 @@ grantpt (int fd)
Siddhesh Poyarekar 1a6af40
 	    assert(! "getpt: internal error: invalid exit code from pt_chown");
Siddhesh Poyarekar 1a6af40
 	  }
Siddhesh Poyarekar 1a6af40
     }
Siddhesh Poyarekar 1a6af40
+#endif
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
  cleanup:
Siddhesh Poyarekar 1a6af40
   if (buf != _buf)
Siddhesh Poyarekar 1a6af40
diff -Nrup a/sysdeps/unix/sysv/linux/grantpt.c b/sysdeps/unix/sysv/linux/grantpt.c
Siddhesh Poyarekar 1a6af40
--- a/sysdeps/unix/sysv/linux/grantpt.c	2012-12-24 22:02:13.000000000 -0500
Siddhesh Poyarekar 1a6af40
+++ b/sysdeps/unix/sysv/linux/grantpt.c	2013-07-24 00:20:07.664298465 -0400
Siddhesh Poyarekar 1a6af40
@@ -11,7 +11,7 @@
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
 #include "pty-private.h"
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
-
Siddhesh Poyarekar 1a6af40
+#if HAVE_PT_CHOWN
Siddhesh Poyarekar 1a6af40
 /* Close all file descriptors except the one specified.  */
Siddhesh Poyarekar 1a6af40
 static void
Siddhesh Poyarekar 1a6af40
 close_all_fds (void)
Siddhesh Poyarekar 1a6af40
@@ -38,6 +38,7 @@ close_all_fds (void)
Siddhesh Poyarekar 1a6af40
       __dup2 (STDOUT_FILENO, STDERR_FILENO);
Siddhesh Poyarekar 1a6af40
     }
Siddhesh Poyarekar 1a6af40
 }
Siddhesh Poyarekar 1a6af40
-#define CLOSE_ALL_FDS() close_all_fds()
Siddhesh Poyarekar 1a6af40
+# define CLOSE_ALL_FDS() close_all_fds()
Siddhesh Poyarekar 1a6af40
+#endif
Siddhesh Poyarekar 1a6af40
 
Siddhesh Poyarekar 1a6af40
 #include <sysdeps/unix/grantpt.c>