[linux] 01/01: selinux: fix off-by-one in setprocattr (CVE-2017-2618)

debian-kernel at lists.debian.org debian-kernel at lists.debian.org
Wed Feb 15 10:46:33 UTC 2017


This is an automated email from the git hooks/post-receive script.

carnil pushed a commit to branch sid
in repository linux.

commit 4e5e705c5f3bf0cc704c0cf9d7c5ffff6d6b8846
Author: Salvatore Bonaccorso <carnil at debian.org>
Date:   Wed Feb 15 11:44:15 2017 +0100

    selinux: fix off-by-one in setprocattr (CVE-2017-2618)
---
 debian/changelog                                   |  1 +
 .../selinux-fix-off-by-one-in-setprocattr.patch    | 65 ++++++++++++++++++++++
 debian/patches/series                              |  1 +
 3 files changed, 67 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index 40dd461..4a066b0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -196,6 +196,7 @@ linux (4.9.9-1) UNRELEASED; urgency=medium
 
   [ Salvatore Bonaccorso ]
   * IB/rxe: Fix mem_check_range integer overflow (CVE-2016-8636)
+  * selinux: fix off-by-one in setprocattr (CVE-2017-2618)
 
  -- Ben Hutchings <ben at decadent.org.uk>  Fri, 27 Jan 2017 18:14:31 +0000
 
diff --git a/debian/patches/bugfix/all/selinux-fix-off-by-one-in-setprocattr.patch b/debian/patches/bugfix/all/selinux-fix-off-by-one-in-setprocattr.patch
new file mode 100644
index 0000000..fcb9491
--- /dev/null
+++ b/debian/patches/bugfix/all/selinux-fix-off-by-one-in-setprocattr.patch
@@ -0,0 +1,65 @@
+From: Stephen Smalley <sds at tycho.nsa.gov>
+Date: Tue, 31 Jan 2017 11:54:04 -0500
+Subject: selinux: fix off-by-one in setprocattr
+Origin: https://git.kernel.org/linus/0c461cb727d146c9ef2d3e86214f498b78b7d125
+
+SELinux tries to support setting/clearing of /proc/pid/attr attributes
+from the shell by ignoring terminating newlines and treating an
+attribute value that begins with a NUL or newline as an attempt to
+clear the attribute.  However, the test for clearing attributes has
+always been wrong; it has an off-by-one error, and this could further
+lead to reading past the end of the allocated buffer since commit
+bb646cdb12e75d82258c2f2e7746d5952d3e321a ("proc_pid_attr_write():
+switch to memdup_user()").  Fix the off-by-one error.
+
+Even with this fix, setting and clearing /proc/pid/attr attributes
+from the shell is not straightforward since the interface does not
+support multiple write() calls (so shells that write the value and
+newline separately will set and then immediately clear the attribute,
+requiring use of echo -n to set the attribute), whereas trying to use
+echo -n "" to clear the attribute causes the shell to skip the
+write() call altogether since POSIX says that a zero-length write
+causes no side effects. Thus, one must use echo -n to set and echo
+without -n to clear, as in the following example:
+$ echo -n unconfined_u:object_r:user_home_t:s0 > /proc/$$/attr/fscreate
+$ cat /proc/$$/attr/fscreate
+unconfined_u:object_r:user_home_t:s0
+$ echo "" > /proc/$$/attr/fscreate
+$ cat /proc/$$/attr/fscreate
+
+Note the use of /proc/$$ rather than /proc/self, as otherwise
+the cat command will read its own attribute value, not that of the shell.
+
+There are no users of this facility to my knowledge; possibly we
+should just get rid of it.
+
+UPDATE: Upon further investigation it appears that a local process
+with the process:setfscreate permission can cause a kernel panic as a
+result of this bug.  This patch fixes CVE-2017-2618.
+
+Signed-off-by: Stephen Smalley <sds at tycho.nsa.gov>
+[PM: added the update about CVE-2017-2618 to the commit description]
+Cc: stable at vger.kernel.org # 3.5: d6ea83ec6864e
+Signed-off-by: Paul Moore <paul at paul-moore.com>
+
+Signed-off-by: James Morris <james.l.morris at oracle.com>
+---
+ security/selinux/hooks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
+index c7c6619..d98550a 100644
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -5887,7 +5887,7 @@ static int selinux_setprocattr(struct task_struct *p,
+ 		return error;
+ 
+ 	/* Obtain a SID for the context, if one was specified. */
+-	if (size && str[1] && str[1] != '\n') {
++	if (size && str[0] && str[0] != '\n') {
+ 		if (str[size-1] == '\n') {
+ 			str[size-1] = 0;
+ 			size--;
+-- 
+2.1.4
+
diff --git a/debian/patches/series b/debian/patches/series
index a2a8e33..dfab2f5 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -105,6 +105,7 @@ features/all/securelevel/arm64-add-kernel-config-option-to-set-securelevel-wh.pa
 # Security fixes
 debian/i386-686-pae-pci-set-pci-nobios-by-default.patch
 bugfix/all/IB-rxe-Fix-mem_check_range-integer-overflow.patch
+bugfix/all/selinux-fix-off-by-one-in-setprocattr.patch
 
 # Fix exported symbol versions
 bugfix/ia64/revert-ia64-move-exports-to-definitions.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/kernel/linux.git



More information about the Kernel-svn-changes mailing list