Sophie

Sophie

distrib > Mageia > 5 > x86_64 > by-pkgid > 004fd25eb1d89e31fc9cddb571328f7f > files > 23

glibc-2.20-21.mga5.src.rpm

From a014cecd82b71b70a6a843e250e06b541ad524f7 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Thu, 15 Oct 2015 09:23:07 +0200
Subject: [PATCH] Always enable pointer guard [BZ #18928]

Honoring the LD_POINTER_GUARD environment variable in AT_SECURE mode
has security implications.  This commit enables pointer guard
unconditionally, and the environment variable is now ignored.

        [BZ #18928]
        * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove
        _dl_pointer_guard member.
        * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard
        initializer.
        (security_init): Always set up pointer guard.
        (process_envvars): Do not process LD_POINTER_GUARD.
---
 ChangeLog                  | 10 ++++++++++
 NEWS                       | 13 ++++++++-----
 elf/rtld.c                 | 15 ++++-----------
 sysdeps/generic/ldsodefs.h |  3 ---
 4 files changed, 22 insertions(+), 19 deletions(-)

#diff --git a/ChangeLog b/ChangeLog
#index 997ad13..fa58b30 100644
#--- a/ChangeLog
#+++ b/ChangeLog
#@@ -1,3 +1,13 @@
#+2015-10-15  Florian Weimer  <fweimer@redhat.com>
#+
#+	[BZ #18928]
#+	* sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove
#+	_dl_pointer_guard member.
#+	* elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard
#+	initializer.
#+	(security_init): Always set up pointer guard.
#+	(process_envvars): Do not process LD_POINTER_GUARD.
#+
# 2015-10-14  Joseph Myers  <joseph@codesourcery.com>
# 
# 	[BZ #19134]
#diff --git a/NEWS b/NEWS
#index d4e8b4a..0491a27 100644
#--- a/NEWS
#+++ b/NEWS
#@@ -16,11 +16,14 @@ Version 2.23
#   18265, 18370, 18421, 18480, 18525, 18595, 18589, 18610, 18618, 18647,
#   18661, 18674, 18675, 18681, 18724, 18757, 18778, 18781, 18787, 18789,
#   18790, 18795, 18796, 18803, 18820, 18823, 18824, 18825, 18857, 18863,
#-  18870, 18872, 18873, 18875, 18887, 18921, 18951, 18952, 18956, 18961,
#-  18966, 18967, 18969, 18970, 18977, 18980, 18981, 18985, 19003, 19007,
#-  19012, 19016, 19018, 19032, 19046, 19049, 19050, 19059, 19071, 19074,
#-  19076, 19077, 19078, 19079, 19085, 19086, 19088, 19094, 19095, 19124,
#-  19125, 19129, 19134
#+  18870, 18872, 18873, 18875, 18887, 18921, 18928, 18951, 18952, 18956,
#+  18961, 18966, 18967, 18969, 18970, 18977, 18980, 18981, 18985, 19003,
#+  19007, 19012, 19016, 19018, 19032, 19046, 19049, 19050, 19059, 19071,
#+  19074, 19076, 19077, 19078, 19079, 19085, 19086, 19088, 19094, 19095,
#+  19124, 19125, 19129, 19134
#+
#+* The LD_POINTER_GUARD environment variable can no longer be used to
#+  disable the pointer guard feature.  It is always enabled.
# 
# * The obsolete header <regexp.h> has been removed.  Programs that require
#   this header must be updated to use <regex.h> instead.
diff --git a/elf/rtld.c b/elf/rtld.c
index 1474c72..52160df 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -162,7 +162,6 @@ struct rtld_global_ro _rtld_global_ro attribute_relro =
     ._dl_hwcap_mask = HWCAP_IMPORTANT,
     ._dl_lazy = 1,
     ._dl_fpu_control = _FPU_DEFAULT,
-    ._dl_pointer_guard = 1,
     ._dl_pagesize = EXEC_PAGESIZE,
     ._dl_inhibit_cache = 0,
 
@@ -709,15 +708,12 @@ security_init (void)
 #endif
 
   /* Set up the pointer guard as well, if necessary.  */
-  if (GLRO(dl_pointer_guard))
-    {
-      uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random,
-							     stack_chk_guard);
+  uintptr_t pointer_chk_guard
+    = _dl_setup_pointer_guard (_dl_random, stack_chk_guard);
 #ifdef THREAD_SET_POINTER_GUARD
-      THREAD_SET_POINTER_GUARD (pointer_chk_guard);
+  THREAD_SET_POINTER_GUARD (pointer_chk_guard);
 #endif
-      __pointer_chk_guard_local = pointer_chk_guard;
-    }
+  __pointer_chk_guard_local = pointer_chk_guard;
 
   /* We do not need the _dl_random value anymore.  The less
      information we leave behind, the better, so clear the
@@ -2471,9 +2467,6 @@ process_envvars (enum mode *modep)
 	      GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0;
 	      break;
 	    }
-
-	  if (memcmp (envline, "POINTER_GUARD", 13) == 0)
-	    GLRO(dl_pointer_guard) = envline[14] != '0';
 	  break;
 
 	case 14:
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 7f7ff72..0625826 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -582,9 +582,6 @@ struct rtld_global_ro
   /* List of auditing interfaces.  */
   struct audit_ifaces *_dl_audit;
   unsigned int _dl_naudit;
-
-  /* 0 if internal pointer values should not be guarded, 1 if they should.  */
-  EXTERN int _dl_pointer_guard;
 };
 # define __rtld_global_attribute__
 # ifdef IS_IN_rtld